• ベストアンサー

VBA  コードをスマートに

下記のコードをスマートにしたいのですが どのようにすれば いいですか? アドバイスをお願いします。 Worksheets("20年5月").Cells(2, 6).Value = Worksheets("20年4月").Cells(i, 6).Value Worksheets("20年6月").Cells(2, 6).Value = Worksheets("20年5月").Cells(i, 6).Value Worksheets("20年7月").Cells(2, 6).Value = Worksheets("20年6月").Cells(i, 6).Value Worksheets("20年8月").Cells(2, 6).Value = Worksheets("20年7月").Cells(i, 6).Value Worksheets("20年9月").Cells(2, 6).Value = Worksheets("20年8月").Cells(i, 6).Value Worksheets("20年10月").Cells(2, 6).Value = Worksheets("20年9月").Cells(i, 6).Value Worksheets("20年11月").Cells(2, 6).Value = Worksheets("20年10月").Cells(i, 6).Value Worksheets("20年12月").Cells(2, 6).Value = Worksheets("20年11月").Cells(i, 6).Value Worksheets("21年1月").Cells(2, 6).Value = Worksheets("20年12月").Cells(i, 6).Value Worksheets("21年2月").Cells(2, 6).Value = Worksheets("21年1月").Cells(i, 6).Value Worksheets("21年3月").Cells(2, 6).Value = Worksheets("21年2月").Cells(i, 6).Value

質問者が選んだベストアンサー

  • ベストアンサー
  • xls88
  • ベストアンサー率56% (669/1189)
回答No.1

一例です。 Dim sn As Variant Dim j As Integer sn = Array("20年4月", "20年5月", "20年6月", "20年7月", "20年8月", _   "20年9月", "20年10月", "20年11月", "20年12月", "21年1月", "21年2月", "21年3月") For j = 0 To UBound(sn) - 1   MsgBox sn(j + 1) & " : " & sn(j)   'Worksheets(j + 1).Cells(2, 6).Value = Worksheets(j).Cells(i, 6).Value Next j

apuda
質問者

お礼

有り難うございました。 勉強になりました。

その他の回答 (3)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんにちは。 「スマート」というか、洗練されたコードというのは、実力のひとつですから、何百、何千とコードを書いて身につくものです。それを一足飛びに出来るようになりたいと思っても、なかなか到達できません。VBAのコーディングの基本的な部分を全うして、エラーがなければ、それで良いとしていかないと、途中でイヤになってしまうかもしれません。 i の変数の働きが分かりませんが、このようにすればよいかと思います。 Sub test1()   Dim j As Integer   Dim i As Long   Dim mYear As Integer   Dim mMon As Integer   mYear = 2008   mMon = 5   i = 3 '任意の数字 '  On Error Resume Next   For j = 0 To 10 'シート11枚     Worksheets(Format$(DateSerial(mYear, mMon + j, 1), "e年M月")).Range("F2").Value = _     Worksheets(Format$(DateSerial(mYear, mMon + j - 1, 1), "e年M月")).Cells(i, 6).Value   Next j '  On Error GoTo 0 End Sub

apuda
質問者

お礼

ご指摘のとおり 基本的な所が まだ 曖昧な部分があります。 ネットや参考書を見ても、中々 理解できない事が多いです。 勉強します。 有り難うございました。

  • xls88
  • ベストアンサー率56% (669/1189)
回答No.3

もう一つの例です。 Dim sn As Variant Dim i As Long Dim j As Long    For j = 1 To Sheets.Count   sn = sn & "," & Sheets(j).Name Next j sn = Split(Replace(sn, ",", "", 1, 1), ",") For j = 0 To UBound(sn) - 1   MsgBox "Worksheets(" & sn(j + 1) & ").Cells(2, 6).Value " _       & "= Worksheets(" & sn(j) & ").Cells(i, 6).Value" Next j

apuda
質問者

お礼

有り難うございました。

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.2

来年も使える汎用性を考えてみました。 スマートか、余計に面倒か意見が分かれるでしょうが、ご参考まで。 Sub test() Dim startDate As Date Dim i As Long, j As Long i = 2 '試験用 startDate = #5/1/2008# For j = 0 To 11 Worksheets(mySheetName(startDate, j)).Cells(2, 6).Value = Worksheets(mySheetName(startDate, j - 1)).Cells(i, 6).Value Next j End Sub Function mySheetName(startDate As Date, offsetMonth As Long) As String Dim myMonth As Long Dim myYear As Long If Val(Month(startDate)) + offsetMonth > 12 Then myMonth = Val(Month(startDate)) + offsetMonth - 12 myYear = Val(Year(startDate)) + 1 Else myMonth = Val(Month(startDate)) + offsetMonth myYear = Val(Year(startDate)) End If mySheetName = Format(DateValue(Format(myYear, "0") & "/" & Format(myMonth, "0") & "/1"), "e""年""m""月") End Function 'おまけ 動作確認用 Sub test2() Dim i As Long For i = 0 To 11 Sheets.Add ActiveSheet.Name = mySheetName(#5/1/2008#, i - 1) Next i End Sub

apuda
質問者

お礼

初心者なので わからない所は、ヘルプを見て 勉強したいと思います。 来年も使えるので もう少しスキルアップしたら 使わせていただきます。 有り難うございました。