|
▼シン さん:
>しかし。マッチ関数をどのように使用したら良いか
>わかりません。
UO3さんからMatch関数について分かりやすい説明がありました。
コードに少し説明(コメント)をつけてみました。
> 1.移動前
> sheet1 sheet2
>
> A B C D A B C D E
> 1 0.8 1 0.8 国 0.81 TN
> 2 1.2 2 1.3 数 1.31 BN
> 3 1.6 3 1.6 理 1.61 BN
> 4 1.7 4 2.0 家 2.01 TN
> 5 2.0 5 2.1 図 2.11 BN
> .
> .
> 5 5.5
> ---------------------------------------------------------------
>
> Sub Try1() 'WS2 → WS1
---------------------------------------- ここから
> Dim WS1 As Worksheet
> Dim WS2 As Worksheet
> Dim r1 As Range, c As Range
> Dim r2 As Range
> Dim r22 As Range
> -------------------------------- ここまでは使用する変数の宣言です
↓ここから実行部で、
まず 変数WS1,WS2 に具体的なシートをセットしています。
シート名"Sheet1" とか"Sheet2" はブックにより変わることがあります。
コードのあちこちに「実名」でシートを書いておくと、変更があった時
直すのが大変です。最初に一度だけ、変数に代入しておけば、
変更があっても、この一か所を直すだけで済みます。
> Set WS1 = Worksheets("Sheet1")
> Set WS2 = Worksheets("Sheet2")
>
↓同じように、2つのシートのA列の処理対象範囲を変数r1,r2にセットして
おきます。r1 はWS1(転記先シート)のA列範囲、
r2 はWS2(転記元シート)のA列範囲です。
なお、WS1.Cells(WS1.Rows.Count, 1).End(xlUp) は手動操作でいうと、
WS1シートのA列最終行を選択して、そこで Ctrl+[↑]を押したときの
処理に相当します(→A列最後のデータのあるセルが求まります)
> Set r1 = WS1.Range("A1", WS1.Cells(WS1.Rows.Count, 1).End(xlUp))
> Set r2 = WS2.Range("A1", WS2.Cells(WS2.Rows.Count, 1).End(xlUp))
↓ついでに、コピーするWS2のB〜E列範囲も変数r22 にセットしておきます。
(r2というA列データ範囲を1つ右すなわちB列にシフトした範囲を4列に
拡張したセル範囲、という意味です)
> Set r22 = r2.Offset(, 1).Resize(, 4)
以上で処理対象範囲のセットが終わりましたので、
いよいよWS1のr1範囲の各セルを順にLoopして、各セルの値(数値)が
WS2のA列にも存在するか、Match関数を使って調べることにします。
> Dim m
↑Match関数で検索した結果をこのmという変数に入れることにします。
m はmatchから名づけた変数です。
↓処理を実行する前に、転記先の範囲を白紙状態にしておきます。
> r1.Offset(, 1).Resize(, 4).ClearContents
↓r1 セル範囲のLoopを開始します(r1範囲が具体的に [A1:A15]であれば、
Loop一回目は cに[A1]セルが入り、2回目には[A2]セルが入ります)
> For Each c In r1
↓セルc の値とマッチするセルが r2範囲にあるか、調べます
> m = Application.Match(c, r2, 0)
↓ r2範囲に cセルとマッチするセルがあれば、
マッチした行番号が返ります。
※ マッチするセルがなかったときは「エラー値」が返ります。
↓したがって、マッチするセルが見つかったかどうかは
mの値が数値であるかどうか(IsNumeric関数)で判定できます
IsNumeric(数値の1) = True ですが、
IsNumeric(Error値) = False というわけです。
> If IsNumeric(m) Then
↑マッチするセルがあったばあい、
↓r22範囲のその行を
WS1の検索元セルの右隣にコピーしてやります
> r22.Rows(m).Copy c(1, 2)
> End If
> Next
↑以上をr1範囲内のすべてのセルに対し順に実行します。
>
> End Sub
|
|