0

現在の問題:

私のコードは、シート 2 に余分なデータを追加するまで部分的に機能していましたが、現在は失敗してデバッグが送信されます。

Set partsheet = Worksheets("Sheet1").Range("A1", Range("A65536").End(xlUp)) 

このコードの有用性:

基本的に、異なるシートに2つの列があります:比較したい & 同様のインポートデータの場合:

Sheet1 - column1 はジョブ番号です

Sheet1 - column2 は部品番号です

同じジョブ番号の場合、複数の部分を持つことができます。つまり、ジョブ番号は列1で繰り返されます

Sheet2 - column1 は sheet1 と同じジョブ番号ですが、データが繰り返されることはありません

Sheet2 - column2 は、各ジョブ番号に固有の ID 番号です (したがって、この場合、ジョブ番号が繰り返されないのはなぜですか)

したがって、参照ポイントとして共通ジョブ番号を使用して、Sheet2 - column2 からデータをインポートしたいと考えています。データを Sheet1 - column3 にインポートすると、繰り返される column1(sheet1) のジョブ番号に対して一意の ID 番号を繰り返す必要があります。したがって、二重のループが発生します。

部分的に機能するために使用されるとは、次のことを意味します。

コードが部分的にしか機能していないことから始めると、これは、sheet1 - column1 の特定のジョブ番号が sheet2 - column1 に対応する値を持たない (データは完全ではありません) ためだと思います。if ステートメントの else 部分のコードを追加する必要があるかもしれませんが、何がわからないのですか。

vba コード:

Option Explicit

Sub testFil()
    Dim Jobref_in_partsheet As Range
    Dim Jobref_in_jobsheet As Range
    Dim partsheet As Range
    Dim jobsheet As Range
    Dim MyRow As Long
    Dim MyOtherRow As Long

    Set partsheet = Worksheets("Sheet1").Range("A1", Range("A65536").End(xlUp))
    Set jobsheet  = Worksheets("Sheet2").Range("A1", Range("A65536").End(xlUp))

    For Each Jobref_in_partsheet In partsheet
        For Each Jobref_in_jobsheet In jobsheet
            If Jobref_in_partsheet.Value = Jobref_in_jobsheet.Value Then
                MyRow = Jobref_in_partsheet.Row
                MyOtherRow = Jobref_in_jobsheet.Row
                Worksheets("Sheet1").Cells(MyRow, 3) = Worksheets("Sheet2").Cells(MyOtherRow, 2)
            Else
                 'Do nothing
            End If
        Next
    Next
End Sub

私が得ることができる助けを本当に感謝します。

4

2 に答える 2

0

回答の更新:

これは、通常の Excel 関数である =VLOOKUP を使用すると、より簡単に実現できると思います。基本的に、この数式をシート 1 行 C のすべてのセルに適用する必要があります。

'Psudeo Code
=VLOOKUP([look up value] A1, [range to look in] Sheet2!A:B, [row to return] 2, [use exact match] false)

使用する前に VLOOKUP を読む必要がありますが、実際に目的に使用できるかどうかは、私の少しの疑似コードで示されることを願っています。私が言ったように実装すると、基本的に最初の値 (A1) を使用して別の範囲 (A:B の最初の列) で何かを検索します。一致するものが見つかった場合は、2 番目の列にあるものを返します (したがって 2、つまり A:B の列 B)。False は、類似した一致は望まず、まったく同じ一致のみが必要であることをプログラムに伝えるためのものです。

ええ、VLOOKUP はすべて出てくるので混乱しますが、非常に便利です。

これは、VBA を使用して同じタスクを実行するよりもはるかに簡単です。それが実際にあなたの質問に答えるかもしれないし、そうでないかもしれないと思いますが、あなたがそれを考慮していなかった場合に備えて、私はそれを持ち出すと思いました.

古い、間違っている、答え:

範囲を作成するときは、すべてを文字列に変換するようにする傾向があります。例えば:

Set partsheet = Worksheets("Sheet1").Range("B1:" & Range("B65536").End(xlUp).Address)

Range("B65536").End(xlUp).Address は、その列の先頭のアドレスを表す文字列を返します。たとえば、先頭が "B31" の場合、"B1:" & Range("B65536").End(xlUp).Address は範囲として "B1:B31" を返す必要があります。

于 2012-12-20T15:46:39.433 に答える
0
Worksheets("Sheet1").Range("A1", Range("A65536").End(xlUp))

ここに問題があります:Rangeオブジェクトを作成しようとしています。その最初のセルは でA1Sheet1最後のセルはAアクティブ シートの列で使用される最後のセルです。ご想像のとおりSheet1、アクティブなシートは異なるシートである可能性があり、複数のシートに属する範囲を作成することはできません。

最後のセルに明示的に親シートを提供する必要があります。

Worksheets("Sheet1").Range("A1", Worksheets("Sheet1").Range("A65536").End(xlUp))

.Addressあるシートからフェッチされたアドレスが別のシートに対して使用される可能性があるため、使用は実際には回避策ではありません。

于 2012-12-20T17:07:34.133 に答える