-1

一意のIDのすべての値を返す、異なるシートでの複数の一致のマクロが必要です。

  1. シート1には一意のIDと値が含まれているため、値が重複している可能性があります。
  2. もう一方のシートでは、値が重複している可能性があり、各繰り返し値に対応する値が評価されます
  3. 出力として、1つの一意のIDに対応するすべての値が必要です。

Sheet1の内容

id1 isin1
id2 isin1
id3 isin2
id4 isin3

Sheet2の内容:

isin1 value1 age1
isin1 value2 age2
isin2 value3 age3
isin3 value4 age4
isin3 value5 age5
isin1 value6 age6
isin3 value7 age7


<U>Output</U>



id1 isin1 value1 age1
id1 isin1 value2 age2
id1 isin1 value6 age6

id2 isin1 value1 age1
id2 isin1 value2 age2
id2 isin1 value6 age6

id3 isin2 value3 age3

id4 isin3 value4 age4
id4 isin3 value5 age5
id4 isin3 value7 age7 

これをプログラミングしてみましたが、エラーが発生しました。

2つの配列ie(range1&range2)をループし、すべての値を別の配列(range3)に格納しようとしました。

プログラムの実行中に、実行時に424オブジェクトエラーが発生します。

別の配列で希望の方法で値を取得するにはどうすればよいですか?

Option Explicit

Sub test()

Dim varSheetA As Variant
Dim varSheetB As Variant
Dim varSheetC As Variant
Dim strRangeToCheck1 As String
Dim strRangeToCheck2 As String
Dim strRangeToCheck3 As String   

Dim iRow1 As Long
Dim iCol1 As Long
Dim iRow2 As Long
Dim iCol2 As Long
Dim iRow3 As Long
Dim iCol3 As Long

strRangeToCheck1 = "A1:B5"
strRangeToCheck2 = "D1:E6"
strRangeToCheck3 = "f1:h22"

Debug.Print Now

varSheetA = Worksheets("Sheet1").Range(strRangeToCheck1)
varSheetB = Worksheets("Sheet1").Range(strRangeToCheck2)
varSheetC = Worksheets("Sheet1").Range(strRangeToCheck3)

Debug.Print Now

For iRow1 = LBound(varSheetA, 1) To UBound(varSheetA, 1)
For iCol1 = LBound(varSheetA, 2) To UBound(varSheetA, 2)

For iRow2 = LBound(varSheetA, 1) To UBound(varSheetA, 1)
For iCol2 = LBound(varSheetA, 2) To UBound(varSheetA, 2)

If varSheetA(iRow1, 2) = varSheetB(iRow2, 1) Then

    varSheetC(iRow1, 1).Value = varSheetA(iRow1, 1).Value " Here i am  getting 424 runtime error"

Else
End If

Next iCol2
Next iRow2

Next iCol1
Next iRow1

End Sub 
4

1 に答える 1

0

それで、私があなたを正しく理解しているなら、シート1には1つのid#しかありませんか?その場合は、sheet1の行をループして、各ペア(id#、isin#)を読み取ります。

次に、isin#ごとに、sheet2でisin#を検索し、別のペア(value#、age#)を取得します。これで、出力する4つのグループができました。もちろん、すべてのisin#についてsheet2を読む必要があるので、それをループに入れます。簡単な例として-(編集-デバッグ用のExcelを持っているので、元のバージョンよりも少し多くのコード):

Option Explicit

Sub Tester()

Dim counter1 As Long
Dim counter2 As Long
Dim counter3 As Long
Dim counter4 As Long

Dim firstSheet1Row As Long
Dim lastSheet1Row As Long
Dim firstSheet2Row As Long
Dim lastSheet2Row As Long

Dim firstColNumSht1 As Long
Dim secondColNumSht1 As Long
Dim firstColNumSht2 As Long
Dim secondColNumSht2 As Long
Dim thirdColNumSht2 As Long

Dim writeRow As Long

Dim dataVal(1 To 4) As Long

firstSheet1Row = 1
lastSheet1Row = 10
firstSheet2Row = 1
lastSheet2Row = 20

firstColNumSht1 = 1
secondColNumSht1 = 2
firstColNumSht2 = 1
secondColNumSht2 = 2
thirdColNumSht2 = 3

writeRow = 1

For counter1 = firstSheet1Row To lastSheet1Row

  dataVal(1) = Worksheets(1).Cells(counter1, firstColNumSht1)
  dataVal(2) = Worksheets(1).Cells(counter1, secondColNumSht1)

    For counter2 = firstSheet2Row To lastSheet2Row

      If Worksheets(2).Cells(counter2, firstColNumSht2) = dataVal(2) Then

        dataVal(3) = Worksheets(2).Cells(counter2, secondColNumSht2)
        dataVal(4) = Worksheets(2).Cells(counter2, thirdColNumSht2)

        For counter3 = 1 To 4
          Worksheets(3).Cells(writeRow, counter3) = dataVal(counter3)
        Next counter3

        writeRow = writeRow + 1

      End If

    Next counter2

  Next counter1


End Sub

ワークシート、行、列などがどこにあるかを正確に指定しなかった場合は、変数の命名規則が明確であることを願っています。また、興味がある場合は、Range.FindNextメソッドを検索してください。ヘルプファイルには、2番目のforループを取り除くことができるループが含まれています。データがあまりない場合はそれほど重要ではありませんが(ただし、より良い方法です)、値のリストが長い場合は、ネイティブのExcelコード(Range.FindNextなど)が桁違いに実行されます。または、各セルをチェックするforループを手動で作成するよりも高速です。

私があなたの質問を誤解した場合は私に知らせてください、そして私は正しい答えを得ようとします(私には仕事があります!)。繰り返しますが、私はこのようにコーディングしません。この仕事を行うためのよりエレガントで堅牢で効率的な手段がありますが、私は最初に実用的なソリューションから始めたいと思いました。

于 2012-12-14T06:40:46.020 に答える