1

一連のシートを通過し、入力されたデータに基づいて名前を収集し、適切にフォーマットされた Word ドキュメントにすべてを配置する単純なマクロがあります。私はそれのほとんどを理解しましたが、1つのバグが私を悩ませています. 名前に基づいて携帯電話番号を取得するコードに関係しています。関数は次のとおりです。

Function findCell(namePerson As String) As String
    Dim splitName As Variant
    Dim lastName As String
    Dim firstName As String

    splitName = Split(namePerson, " ")
    lastName = splitName(UBound(splitName))
    ReDim Preserve splitName(UBound(splitName) - 1) 
    firstName = Join(splitName)

    For Each b In Worksheets("IT").Columns(1).Cells
        If b.Value = lastName Then
            If Sheets("IT").Cells(b.row, 2).Value = firstName Then findCell = Sheets("IT").Cells(b.row, 4).Value
        End If
    Next
End Function

携帯電話番号は、「IT」と呼ばれる独自のシートにあります。最初の列は姓、2 番目の列は名、4 番目の列は携帯電話番号です。ファーストネームに複数の部分がある人もいます。そのため、奇妙な分割、ReDim-ing、および結合が見られるのはそのためです。その部分はうまく機能します。

問題は、姓が同じ人が複数いる場合に発生します。この関数は、最初の If ステートメントを実行して、正しい姓を持つ人を見つけます。次に、名を比較します。一致する場合は、携帯電話番号の値を返す必要があります。その後、最初の名前が一致しなくても for ループは停止します。したがって、誰かがたまたま同じ姓を持っていても、名がチェックアップされない場合、何も返されません。

return 呼び出しをループの外にまとめてみましたが、それでも違いはありません。

4

2 に答える 2

4

データベースを使用していないため、主キー列は難しい場合があります。現在の設定で、これを試すことができます。これ

  • 列内のすべてのセルを調べているわけではありません
  • 用途Option Explicit
  • 最初の検索を返し、終了します
  • 大文字/小文字および先頭/末尾の空白は無視されます。

.

Option Explicit

Function findCell(namePerson As String) As String
    Dim splitName As Variant
    Dim lastName As String
    Dim firstName As String

    splitName = Split(namePerson, " ")
    lastName = splitName(UBound(splitName))
    ReDim Preserve splitName(UBound(splitName) - 1)
    firstName = Join(splitName)

    Dim ws As Worksheet, lastrow As Long, r As Long
    Set ws = Worksheets("IT")
    lastrow = ws.Cells(1, 1).End(xlDown).Row 'or whatever cell is good for you

    For r = 1 To lastrow
        If UCase(Trim(ws.Cells(r, 1))) = UCase(Trim(lastName)) _
            And UCase(Trim(ws.Cells(r, 2))) = UCase(Trim(firstName)) Then

            findCell = ws.Cells(r, 4)
            Exit For
        End If

    Next r

End Function
于 2013-05-10T16:23:02.730 に答える
2

この問題を解決しようとして、実際の問題への対処を先延ばしにしているようです。

「キー」(名前) が一意ではないため、問題が発生しています。1 つの名前の競合を回避して、別の競合を回避しようとしています。

一意であることがわかっているキー (GUID など) を取得するのはどうでしょうか。その後、これを回避する必要はなくなります。

于 2013-05-10T15:57:47.950 に答える