1

仕事のプロセスを自動化し、将来発生するいくつかの問題に対処しようとしています。私のプロセスの一部は、さまざまなスプレッドシートをインポートし、従業員の名前を探して、そのマネージャーが誰であるかを調べることです。私が直面している問題は、人々が異なるシステムでは異なる名前で知られていることです。たとえば、「Donald Donaldson」という名前の人は、システムでは「Don Donaldson」と呼ばれる場合がありますが、従業員リストにはフル ネームが含まれています。あるいは、Dave Davidison はシステム上の David Davidson です。

これは何度も発生し (一部の人はシステム リストに 2 回表示されるため)、同僚が手動で問題を修正している間、プロセス全体が遅くなります。これに対処するために、[データ] タブに 3 つのテーブル/動的名前付き範囲を作成しました。各テーブル (以下のサンプル) には異なる目的がありました。間違った名前 ("names") のリスト、置換名 ("Rep") のリスト、およびシステムから抽出された名前のリスト ("Compare")。比較リストを調べて、「名前」のインスタンスが表示されているかどうかを確認したいと思います。インスタンスが見つかった場合は、名前を正しいものに置き換えます

私は必要なことを達成するのに非常に近づいていると感じていますが、私が破裂するのを助けるその輝きの瞬間が欠けています.

私のアプローチ

3 つの動的名前付き範囲があり (範囲の長さは、他のファイルから抽出される内容に応じて変化します)、それらを 3 つの動的配列として保存しました (まさにそのため)。私のコードは、Names の各要素、Rep の各要素、Compare の各要素をループしています。Compare (z) の値が Names (x) の値と等しい場合、その値を Rep の値に変更します (つまり、z = y)。問題は、z の値のみが変化することです。私の配列の対応する値ではありません。つまり、Don Donaldson は Compare の 3 番目の要素です。一致するものを見つけたので、Z は Don Donaldson から Donald Donaldson に変更されました。ただし、Compare(3) は Don Donaldson のままです。

4番目の動的配列を作成し、ReDimを使用して反復ごとにその長さを増やしてみました。すべての一致で myArr(index) は y に等しく、ループの後、4 番目の名前付き範囲 ("TestRange") がこの配列の値に設定されます。このアプローチも機能しません。

誰でも私を助けることができますか?配列内の要素の値を変更 (比較) する方法と、この新しい配列を名前付き範囲に出力する方法を教えてください。

私のコードと私のデータのサンプルを以下に示します。

助けてください。ありがとう

Sub mySub()
    Dim Arr() As Variant
    Arr = Worksheets("Data").Range("Names").Value
    Dim comArr() As Variant
    comArr = Worksheets("Data").Range("Compare").Value
    Dim repArr() As Variant
    repArr = Worksheets("Data").Range("Rep").Value
    Dim comInt As Integer
    comInt = 0
    Dim RowCounter As Long
    Dim ArrayCounter As Long

    Dim x As Variant
    Dim y As Variant
    Dim z As Variant
    Dim zInt As Integer
    zInt = 0
    Dim myArr() As Variant

    For Each x In Arr
        For Each y In repArr
            For Each z In comArr
                'ReDim myArr(0 To zInt) As Variant
                If z = x Then
                    z = y
                    'myArr(zInt) = y
                End If
                zInt = zInt + 1
            Next z
        Next y
    Next x

    'Worksheets("Data").Range("TestRange").Value = comArr()
    'Worksheets("Data").Range("TestRange").Value = myArr()
End Sub

*私の名前付き範囲 乱雑なレイアウトでごめんなさい

「名前」 ドン・ドナルドソン、デビッド・デビッドソン、マイク・マイケルズ、パット・パターソン、スティーブ・スティーブンソン、ジャック・ジャクソン、ロバート・ロバートソン、ハービー・ハービー、ジョン・ジョンソン

"Rep" ドナルド ドナルドソン、デイブ デビッドソン、マイケル マイケルズ、パトリック パターソン、スティーブン スティーブンソン、ジャック ジャクソン、ロブ ロバートソン、ハーヴ ハーヴィ、ジョン ジョンソン

「比較」 ドン・ドナルドソン、マイク・マイケルズ、ジャック・ジャクソン、ジョン・ジョンソン、パット・パターソン、パーシー・パーキンス、ドン・ドナルドソン、トム・トムソン、ハービー・ハービー、マーク・マーカス、クリス・クリストファーソン、ミッチ・ミッチェル、ジャック・ジャクソン、ロブ・ロバートソン

4

2 に答える 2

0

これはコメントである必要がありますが、長すぎるため、コードを提供したいと思います。

コードのロジックが間違っていると思います... (疑似コード)

if z(Don Donaldson) = x(Don Donaldson) >> myArr(?) = Don Donaldson 

そのような比較に一致する 55 の状況があります。しかし、どの要素が に対応しているかを確認することはできませんy(Donald Donaldson)。これを行うには、各配列 (要素) に一致するパラメーターを用意するか、ここで使用できないパラメーターを使用する必要がkey indexあります。さらに、各配列には異なる数の要素があります。私の意見では、あなたが持っているそのようなデータセットを使った手作業でのみ解決できると思います.

ループの内部部分を次のコードに変更することをお勧めします。

'...your code here
        For Each z In comArr

            If z = x Then
                ReDim Preserve myArr(zInt) As Variant
                z = y
                myArr(zInt) = y
                zInt = zInt + 1
            End If

        Next z
'your code here

さらに、最後のコメント行をこれに変更し、コメントを解除して結果を表示すると、次のようになります。

Worksheets("Data").Range("TestRange").Value = Application.Transpose(myArr)
于 2013-07-15T18:57:54.100 に答える