Excel VBA についての備忘録

エクセルVBAなどを中心に業務効率化にかかわる内容を趣味の赴くままに紹介します。

シート間貼り付けコードの説明

先日のコードについて補足していこうと思います。

ワークシートをオブジェクト変数へ代入

以下ではDim ** As Worksheet で宣言した、ワークシートのオブジェクト変数へシート名を指定して代入しています。
オブジェクト変数へ代入することで、コード内で何度もWorksheets("***")を記載しなくてよくなります。

Set houseHoldWs = ThisWorkbook.Worksheets("家計簿")
Set nowHouseholdWs = ThisWorkbook.Worksheets("家計簿当月表示")

ワークシートのようなオブジェクトを変数へ代入するためには、普通に=ではなく、変数の前にSetを書く必要があります。
ここでは「家計簿」と「家計簿当月表示」をオブジェクト変数に代入しています。

Range+Cellsで任意の範囲の値を転記

以下ではRange(A1:B10)などの範囲指定の代わりに、Range(Cells(x,y),Cells(a,b))の記載で範囲を任意のサイズにしております。
Cells(x,y).Resize(a,b)でも同じ記述できますね。
Resizeに慣れていないため、Range+Cellsを使用していますがこっちのほうがいいですね…

nowHouseholdWs.Range(nowHouseholdWs.Cells(cumagoSRow, cumagoSCol), nowHouseholdWs.Cells(cumagoERow, cumagoECol)).Value = _
nowHouseholdWs.Range(nowHouseholdWs.Cells(cumSRow, cumSCol), nowHouseholdWs.Cells(cumERow, cumECol)).Value

小ネタを少し…
ws指定は ws.Range(ws.Cells(… とRangeとCells両方に記載しないとバグります。昔それで少し時間使いました。

For文繰り返しで列方向の値を行方向に転記

Cells(i,1).value = Cells(1,i).valueで記載すれば、左へ右を代入するので列方向の値を行方向に転記しています。
VBAではよくやること?ですかね

For i = targetSCol To targetECol
  nowHouseholdWs.Cells(i + 1, tSCol).Value = houseHoldWs.Cells(targetRow, i).Value
Next i