- ベストアンサー
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
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
一例です。 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
その他の回答 (3)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 「スマート」というか、洗練されたコードというのは、実力のひとつですから、何百、何千とコードを書いて身につくものです。それを一足飛びに出来るようになりたいと思っても、なかなか到達できません。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
お礼
ご指摘のとおり 基本的な所が まだ 曖昧な部分があります。 ネットや参考書を見ても、中々 理解できない事が多いです。 勉強します。 有り難うございました。
- xls88
- ベストアンサー率56% (669/1189)
もう一つの例です。 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
お礼
有り難うございました。
- mitarashi
- ベストアンサー率59% (574/965)
来年も使える汎用性を考えてみました。 スマートか、余計に面倒か意見が分かれるでしょうが、ご参考まで。 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
お礼
初心者なので わからない所は、ヘルプを見て 勉強したいと思います。 来年も使えるので もう少しスキルアップしたら 使わせていただきます。 有り難うございました。
お礼
有り難うございました。 勉強になりました。