1

ここに私のジレンマがあります:

2枚のExcelシートがあります。

- One is a target sheet with already existing information
- One is a source sheet

ソースシート列 C の使用セルをターゲット シート列 A の使用セルと一致させ、行ごとに 3 つのセルをソースからターゲット (隣接する行) にコピーする必要があります。

したがって、ソースシートの列 C のセルの 1 つに「TESTUSER test」があり、ターゲット シートの列 A のセルのどこかに同じ名前があるとします。名前がソースシートにある行から、コピーする必要があります。 A、B、C列のセル(その行からのみ)のデータを、名前が列Aにあるターゲットシートの行、列C、D、Eに。ソースシートの列 C の名前ごとに、これと同じ操作を行う必要があります。

「For each」メソッドを使用して両方のシートから必要な値を取得できましたが、データを一致させてそれに基づいてコピーする方法がわかりません。

4

2 に答える 2

0

Excel の数式を使用した方が簡単ですか? ソース シートの名前が「Sheet1」であるとすると、この数式をターゲット シートの列 C に貼り付けます。

=IF(ISERROR(MATCH("TESTUSER test",Sheet1!C:C, 0)), "No Match", INDIRECT(ADDRESS(MATCH("TESTUSER test",Sheet1!C:C, 0), 1,,, "Sheet1")))

これにより、シート 1 の列 A の値が得られます (式のどこかにある「1」を参照してください)。次に、これをターゲット シートの列 D にコピーします。

=IF(ISERROR(MATCH("TESTUSER test",Sheet1!C:C, 0)), "No Match", INDIRECT(ADDRESS(MATCH("TESTUSER test",Sheet1!C:C, 0), 2,,, "Sheet1")))

これを列Eに:

=IF(ISERROR(MATCH("TESTUSER test",Sheet1!C:C, 0)), "No Match", INDIRECT(ADDRESS(MATCH("TESTUSER test",Sheet1!C:C, 0), 3,,, "Sheet1")))

数式の唯一の違いは、列 A、B、および C (この場合は Sheet1) に対応する「1」、「2」、および「3」です。

(答えは驚くほどこの質問の答えと似ています: Excel: Check if Cell value exists in Column, and then get the value of the NEXT Cell )

于 2012-10-16T13:49:59.823 に答える
0

「正しい」方法にはおそらくADO / SQLが含まれますが、作業For Eachループがあるため、辞書を使用して名前キーの下のSrcにインデックス/行番号を保存し、その辞書で名前が見つかった場合はTgtを更新できます。コード内:

  Const cnSKI = 2  ' Src Key Index
  Const cnTKI = 0  ' Tgt Key Index
  Const cnTUO = 2  ' Tgt Update Offset
  Const cnFTC = 2  ' Fields To Copy

  Dim aoaSrc : aoaSrc = Array( _
      Array("a", "b", "A1", "NotInTgt") _
    , Array("c", "d", "a1", "UpdInTgt") _
  )
  Dim aoaTgt : aoaTgt = Array( _
      Array("B1", "NotInSrc", "x", "x", "xx") _
    , Array("a1", "UpdInTgt", "?", "?", "??") _
  )
  Dim dicSrc : Set dicSrc = CreateObject("Scripting.Dictionary")
  Dim i
  For i = 0 To UBound(aoaSrc)
      dicSrc(aoaSrc(i)(cnSKI)) = i
  Next
  dumpAOA "Src", aoaSrc
  dumpDic "Src dic", dicSrc
  dumpAOA "Tgt", aoaTgt
  For i = 0 To UBound(aoaTgt)
      If dicSrc.Exists(aoaTgt(i)(cnTKI)) Then
         Dim r : r = dicSrc(aoaTgt(i)(cnTKI))
         Dim c
         For c = 0 To cnFTC
             aoaTgt(i)(c + cnTUO) = aoaSrc(r)(c)
         Next
      End If
  Next
  dumpAOA "Tgt (updated)", aoaTgt

Sub dumpAOA(sTitle, aoaX)
  WScript.Echo "----", sTitle
  Dim a
  For Each a In aoaX
      WScript.Echo "", Join(a)
  Next
End Sub

Sub dumpDic(sTitle, dicX)
  WScript.Echo "----", sTitle
  Dim k
  For Each k In dicX.Keys
      WScript.Echo "", k, dicX(k)
  Next
End Sub

出力:

---- Src
 a b A1 NotInTgt
 c d a1 UpdInTgt
---- Src dic
 A1 0
 a1 1
---- Tgt
 B1 NotInSrc x x xx
 a1 UpdInTgt ? ? ??
---- Tgt (updated)
 B1 NotInSrc x x xx
 a1 UpdInTgt c d a1
于 2012-10-16T13:19:04.770 に答える