• ベストアンサー

ExcelのVBAで複数行を転記する方法について

いつもお世話になります。YouTubeで変数を使わない複数行を纏めて転記する内容を見ました。”C10~H12セルの値をL10~Q12セルへ出力する" <Range("L10:Q12"):Value=Range("C10:H12"):Value> で一行で纏められる例題が出ていました。そこで私が作っている変数入りの複数行を一行で書く方法を教えてください。 ””””私の作ったプログラムです””””” Sub 領収証班別() '出力行を設定する変数の定義 Dim CtrRow '繰返し処理用の変数定義 Dim i '------------------------------------------------------------------------------ '出力行の開始位置を設定 CtrRow = 2 '2行目から62行目まで繰り返す For i = 2 To 62 'B(領収証の班別)に指定班名が合致しているか判定する If Worksheets("領収証").Range("B" & i).Value = "南1班" Then 'Worksheets("領収証班別").Range("A" & CtrRow).Value = Worksheets("領収証").Range("A" & i).Value 'Worksheets("領収証班別").Range("B" & CtrRow).Value = Worksheets("領収証").Range("B" & i).Value 'Worksheets("領収証班別").Range("C" & CtrRow).Value = Worksheets("領収証").Range("C" & i).Value 'Worksheets("領収証班別").Range("D" & CtrRow).Value = Worksheets("領収証").Range("D" & i).Value 'Worksheets("領収証班別").Range("E" & CtrRow).Value = Worksheets("領収証").Range("E" & i).Value '1行出力したため、出力行の位置を+1にする CtrRow = CtrRow + 1 '判定処理の終了 End If '繰り返し処理の終了 Next i '------------------------------------------------------------------------------ '出力行の開始位置を設定 CtrRow = 24 '2行目から62行目まで繰り返す For i = 2 To 62     :     : 次から次へと続きます。 と云うようなプログラムの中で 'Worksheets("領収証班別").Range("A" & CtrRow).Value = Worksheets("領収証").Range("A" & i).Value 'Worksheets("領収証班別").Range("B" & CtrRow).Value = Worksheets("領収証").Range("B" & i).Value 'Worksheets("領収証班別").Range("C" & CtrRow).Value = Worksheets("領収証").Range("C" & i).Value 'Worksheets("領収証班別").Range("D" & CtrRow).Value = Worksheets("領収証").Range("D" & i).Value 'Worksheets("領収証班別").Range("E" & CtrRow).Value = Worksheets("領収証").Range("E" & i).Value この複数行をYouTubeの例題の様に一行に纏めて書く方法はありませんか?このプログラムも、よちよち歩きで作ったものです(初心者です)よろしくお願いいたします。

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

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率65% (1624/2466)
回答No.2

回答No.1の訂正です。 If分があるのを見落としてました Sub Test() Dim i As Long Dim CtrRow As Long CtrRow = 2 For i = 2 To 62 If Worksheets("領収証").Range("B" & i).Value = "南1班" Then Worksheets("領収証班別").Range("A" & CtrRow & ":E" & CtrRow).Value = Worksheets("領収証").Range("A" & i & ":E" & i).Value CtrRow = CtrRow + 1 End If Next End Sub もしくは Sub Test2() Dim i As Long Dim CtrRow As Long Dim Ws1 As Worksheet, ws2 As Worksheet Set Ws1 = Worksheets("領収証班別") Set ws2 = Worksheets("領収証") CtrRow = 2 For i = 2 To 62 If Worksheets("領収証").Range("B" & i).Value = "南1班" Then Ws1.Range(Ws1.Cells(CtrRow, "A"), Ws1.Cells(CtrRow, "E")).Value = ws2.Range(ws2.Cells(i, "A"), ws2.Cells(i, "E")).Value CtrRow = CtrRow + 1 End If Next '中略 Set Ws1 = Nothing Set ws2 = Nothing End Sub

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • kkkkkm
  • ベストアンサー率65% (1624/2466)
回答No.1

次の '出力行の開始位置を設定 CtrRow = 24 がなぜ24なのか分かりませんが 2行目から62行目までを代入でしたら CtrRow = 2 i = 62 「領収証」の範囲A2からE62を「領収証班別」の範囲A2からE62に代入するとして CtrRow = 2 i = 62 Worksheets("領収証班別").Range("A" & CtrRow & ":E" & i).Value = Worksheets("領収証").Range("A" & CtrRow & ":E" & i).Value でいいのではないでしょうか。 以下のようにすると、以後シート名はWs1とかWs2とかで記載できます Sub Test() Dim i As Long Dim CtrRow As Long Dim Ws1 As Worksheet, ws2 As Worksheet Set Ws1 = Worksheets("領収証班別") Set ws2 = Worksheets("領収証") CtrRow = 2 i = 62 Ws1.Range(Ws1.Cells(CtrRow, "A"), Ws1.Cells(i, "E")).Value = ws2.Range(ws2.Cells(CtrRow, "A"), ws2.Cells(i, "E")).Value 中略 Set Ws1 = Nothing Set ws2 = Nothing End Sub

hayakoyada
質問者

お礼

返事が遅くなり申し訳ありません。 初めの回答文でうまくいきました。 本当にありがとうございました。 いろんなコマンドが有るものですね! 大変勉強になりました。今後ともよろしくご教授お願いいたします。

Powered by GRATICA
全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • VBAの転記について

    With Sheets("入力") '3行目~22行目まで For i = 5 To 24 SheetName = Sheets("入力").Cells(i, "C").Value On Error Resume Next Set Dummy = Sheets(SheetName) SheetName2 = .Cells(i, "C").Value U最終行 = Sheets(SheetName2).Range("C65536").End(xlUp).Row + 1 If U最終行 = 39 Then Sheets(SheetName2).Copy BEFORE:=ActiveSheet Sheets(SheetName).Delete End If If Err.Number = 0 Then A = Sheets(SheetName2).Range("C65536").End(xlUp).Row + 1 Sheets(SheetName2).Range("C" & A).Value = .Cells(i, "G").Value Sheets(SheetName2).Range("D" & A).Value = .Cells(i, "I").Value Sheets(SheetName2).Range("E" & A).Value = .Cells(i, "L").Value Sheets(SheetName2).Range("F" & A).Value = .Cells(i, "N").Value Sheets(SheetName2).Range("G" & A).Value = .Cells(i, "P").Value Sheets(SheetName2).Range("H" & A).Value = .Cells(i, "R").Value Sheets(SheetName2).Range("I" & A).Value = .Cells(i, "T").Value Sheets(SheetName2).Range("K" & A).Value = .Cells(i, "V").Value Sheets(SheetName2).Range("L" & A).Value = .Cells(i, "X").Value ElseIf .Cells(i, "C").Value <> "" Then G = Sheets("原紙").Range("C65536").End(xlUp).Row + 1 Sheets("原紙").Range("B1").Value = .Cells(i, "D").Value Sheets("原紙").Range("B4").Value = .Cells(2, "D").Value Sheets("原紙").Range("C" & G).Value = .Cells(i, "G").Value Sheets("原紙").Range("D" & G).Value = .Cells(i, "I").Value Sheets("原紙").Range("E" & G).Value = .Cells(i, "L").Value Sheets("原紙").Range("F" & G).Value = .Cells(i, "N").Value Sheets("原紙").Range("G" & G).Value = .Cells(i, "P").Value Sheets("原紙").Range("H" & G).Value = .Cells(i, "R").Value Sheets("原紙").Range("I" & G).Value = .Cells(i, "T").Value Sheets("原紙").Range("K" & G).Value = .Cells(i, "V").Value Sheets("原紙").Range("L" & G).Value = .Cells(i, "X").Value '原紙をコピーする Sheets("原紙").Copy BEFORE:=Sheets(1) 'シートの名前を市場コードにする Sheets(1).Name = SheetName End If Next i End With On Error GoTo 0 上記のVBAを作成しましたが、 C行の値ごとの転記(G~Xの値)が出来ません。 どこが間違いか教えていただけないでしょうか。

  • エクセルvbaで同姓同名の抽出方法について

    エクセルVBAで質問があります。 ワークシート1(上段、example1)のB2のセルにひらがな(苗字)を入力したとき、ワークシート2(下段、example2)で作成して該当した情報をワークシート1のC2からe7へ反映させたいと考えています。 ワークシート2に、1000人越えの情報があり、かつ、同姓同名が何人かいて、フィルタをかけてもフィルタ結果後から目的の人を見つけるのが大変なんです。 入力したコードは、下記の通りなのですが、どこをどう直せばいいのか分かりません。どなたか教えていただけないでしょうか? Sub sample() Dim i As Byte   i = 1   If < Worksheets("example2!A2:A9").Value > = 5 Then         Worksheets(i + 4, "example2!C2:E2").Value = EntireRow("example2!D:F").EntireRow = True    ElseIf 4 < Worksheets(i + 3, "example2!A2:A9").Value > = 4 Then         Range.Worksheets("example1!C3:E3").Value = EntireRow("example2!D:F").EntireRow = True    ElseIf 3 < Worksheets(i + 2, "example2!A2:A9").Value > = 3 Then         Range.Worksheets("example1!C4:E4").Value = EntireRow("example2!D:F").EntireRow = True    ElseIf 2 < Worksheets(i + 1, "example2!A2:A9").Value > = 2 Then         Range.Worksheets("example1!C5:E5").Value = EntireRow("example2!D:F").EntireRow = True    ElseIf 1 < Worksheets(i + 0, "example2!A2:A9").Value > = 1 Then         Range.Worksheets("example1!C6:E6").Value = EntireRow("example2!D:F").EntireRow = True    ElseIf 0 < Worksheets(i + -1, "example2!A2:A9").Value > = 0 Then         Range.Worksheets("example1!C7:E7").Value = EntireRow("example2!D:F").EntireRow = True Else End If       Range("example1!B2").Value = " " End sub

  • 複数行を最終行に転記

    ブックから他ブックへの複数行を最終行に転記したいと考えております。 1日1行であれば転記出来るものの、1日が複数行となると1日の最終行のみが転記され困っております。 縦カレンダー仕様 ・月初ではなく日曜始まりの為前月含むこともあり ・1日につき各4行づつ ・4行すべて毎日データーが入るわけではなく時々入る程度 スケジュール表仕様 ・日曜始まりの一週間毎のシート ・1日につき9行分 1か月分だと長いので1週目分だけですが… Activ bookを縦カレンダー(入力用シート) Thisbookをスケジュール表(転記先シート) Sub 転記_Click() Dim WBK1 As Workbook,WBK2 As Workbook Dim SH1 As Worksheet,SH2 As Worksheet Dim myRow1 As Long,myRow2 As Long,myRow3 As Long,myRow4 As Long_ myRow5 As Long,myRow6 As Long,myRow7 As Long Set WBK1 = ThisWorkbook '縦カレンダー Set WBK2 = ActiveWorkbook 'スケジュール表 Set SH1 = WBK1.Worksheets("1週目") 'スケジュール表 Set SH2 = WBK2.Worksheets("3月") '縦カレンダー Set SH3 = WBK1.Worksheets("2週目") 'スケジュール表 Set SH4 = WBK1.Worksheets("3週目") 'スケジュール表 Set SH5 = WBK1.Worksheets("4週目") 'スケジュール表 Set SH6 = WBK1.Worksheets("5週目") 'スケジュール表 Set SH7 = WBK1.Worksheets("6週目") 'スケジュール表 With SH1 myRow1 = SH1.Range("C1").End(xlDown).Row '日 myRow2 = SH1.Range("C12").End(xlDown).Row '月 myRow3 = SH1.Range("C23").End(xlDown).Row '火 myRow4 = SH1.Range("C34").End(xlDown).Row '水 myRow5 = SH1.Range("C45").End(xlDown).Row '木 myRow6 = SH1.Range("C56").End(xlDown).Row '金 myRow7 = SH1.Range("C67").End(xlDown).Row '土 SH1.Range("C" & myRow1 + 1 & ":J" & myRow1 + 1).Value = SH2.Range("C3:J6").Value '日 SH1.Range("C" & myRow2 + 1 & ":J" & myRow2 + 1).Value = SH2.Range("C7:J10").Value '月 SH1.Range("C" & myRow3 + 1 & ":J" & myRow3 + 1).Value = SH2.Range("C11:J14").Value '火 SH1.Range("C" & myRow4 + 1 & ":J" & myRow4 + 1).Value = SH2.Range("C15:J18").Value '水 SH1.Range("C" & myRow5 + 1 & ":J" & myRow5 + 1).Value = SH2.Range("C19:J22").Value '木 SH1.Range("C" & myRow6 + 1 & ":J" & myRow6 + 1).Value = SH2.Range("C23:J26").Value '金 SH1.Range("C" & myRow7 + 1 & ":J" & myRow7 + 1).Value = SH2.Range("C27:J30").Value '土   End With End Sub

  • エクセルVBAで数字の転記

    セルの数字の転記でTEST1のように繋がっているセル範囲は、その一つしたの値を一編に持ってこれます。 Sub TEST1() Range("C6:E6").Value = Range("C6:E6").Offset(1).Value End Sub ところがTEST2のように接してはいても繋がっていないとC15の一つ下の値がD14にも入ってしまいます。 Sub TEST2() Range("C15,D14").Value = Range("C15,D14").Offset(1).Value End Sub Range("C15,D14")あるいはRange("C15,E14")のようなとなりあっていない場合でも一個したの数値を一編に持ってくるような方法はないでしょうか?

  • Excel VBA 構文をすっきりさせたい

    いつもお世話になっています。 次のような構文を使って、データを別シートに転送するVBAを作成しました。 転送するデータが多い場合、構文が延々続くことになります。 もっとすっきりと記述する方法がありましたらぜひ教えてください。 お力添え、よろしくお願いします。 Sub データ() With ActiveSheet Dim last last = ActiveSheet.Range("b" & Rows.Count).End(xlUp).Row + 1 .Range("b" & last).Value = Worksheets(2).Range("b2").Value .Range("c" & last).Value = Worksheets(2).Range("c2").Value .Range("d" & last).Value = Worksheets(2).Range("d2").Value     以下同様に続く・・・・ End With End Sub

  • VBA転記について教えて下さい

    200件位のデータがあるとします。顧客情報AB・商品C~AY 氏名 性  青森りんご 長野りんご みかん バナナ 送料 AA  男   1             2      100 BB  女          1            100 CC  男                   3     0 このデータを別シートAにはりんごと送料 別シートBにはそれ以外のデータに分けたいのです。 シートA 氏名 性  青森りんご 長野りんご  送料 AA  男   1           100 BB  女        1    100 CC  男 シートB 氏名 性  みかん バナナ AA  男    2 BB  女 CC  男       3 こんな感じです。 色々参考にして作成しましたがうまくいきませんでしたので 教えて欲しいです。 よろしくお願いします。 エクセルは2002です。 1、項目名の転記でデータは200位ですが変動があるので最終行で作成したら うまくいきませんでした。 2、データ域の転記が動きません。 Sub サンプル() Dim i As Long Dim lastRow As Long Dim lastcolumns As Long Dim S1 As Worksheet, S2 As Worksheet, S3 As Worksheet Dim myColumns As Long Dim myKey As String Set S1 = Worksheets("データ") Set S2 = Worksheets("りんご") Set S3 = Worksheets("その他") ' Sheet1の最終行を取得 lastRow = S1.Range("A" & Rows.Count).End(xlUp).Row ' Sheet1の最終列を取得 lastcolumns = S1.Cells(1, Columns.Count).End(xlToLeft).Column ' 項目名の転記 S2.Range("A1:B200").Value = _ S1.Range("A1:B200").Value S3.Range("A1:B200").Value = _ S1.Range("A1:B200").Value 'データ域の転記 For i = 2 To lastcolumns myKey = S1.Cells(1 & i).Value If myKey <> "" Then myColumns = Worksheets(myKey).Cells(1, Columns.Count).End(xlUp).Columns + 1 S1.Range(S1.Cells(1, i), S1.Cells(lastRow, i)).Copy _ Worksheets(myKey).Range(Cells(1, myColumns), Cells(lastRow, myColumns)) End If Next i End Sub

  • エクセルVBAの転記について

    エクセル2013VBAで最終行を取得しての転記が上手くいきません。どのようにすれば良いかご教授ください。 簡単なサンプルを下記します。 Sub サンプル入力からのDBへの転記() Dim Sh1 As Worksheet Dim Sh2 As Worksheet Dim myRow As Long Set Sh1 = Worksheets("サンプル入力") Set Sh2 = Worksheets("サンプルDB") With Sh2 myRow = Range("A" & Rows.Count).End(xlUp).Row + 1 .Range("A" & myRow).Value = Sh1.Range("D4").Value .Range("B" & myRow).Value = Sh1.Range("F4").Value End With End Sub 入力内容を変えないテストでは (1)実行するとDBへの転記は問題なく出来ます。 (2)継続してマクロを実行しても問題なく転記が行われ、同じデータが蓄積されていきます。 入力内容を変更して引き続きマクロを実行すると挙動不審に陥ります。 現象としては (1)初めの行に何度も重ねて転記を行う。 (2)空白行を作り、その行に何度も転記を行ってしまう。 (3)空白行を作り、それ以降転記を実行し蓄積を行ってしまう。 入力シートには結合セル、リストを使用していますが、原因究明を行う中でこれが原因とは思えませんでした。 これがクリアできないと先に進めません。ぜひお力を貸してください。 宜しくお願い申し上げます。

  • VBAについて

    こんばんは、下記のVBAについて質問をさせてください…! シートの名前と特定の列の名前が一致したらデータを引っ張ってくるというVBAなのですが、下記のVBAではもってくるデータはE列でおわりですが、もっと沢山列がある場合で、例えばDA列とかまである場合はどうすればよいのでしょうか…?! まさか「.Range("A" & cellCnt).~」というのを一つ一つ入力するわけではないと思うのですが、記述の方法が分からず困っています。 どなたかご教示いただけると大変助かります…! ' データをとってくるシートの行 Dim dataCnt As Integer ' 貼り付け先のシートの行 Dim cellCnt As Integer cellCnt = 1 For dataCnt = 1 To Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row If Sheets("Sheet1").Range("L" & dataCnt).Value = Sheets(sheetIdx).Name Then With Worksheets(sheetIdx) .Range("A" & cellCnt).Value = Worksheets("Sheet1").Range("A" & dataCnt).Value .Range("B" & cellCnt).Value = Worksheets("Sheet1").Range("B" & dataCnt).Value .Range("C" & cellCnt).Value = Worksheets("Sheet1").Range("C" & dataCnt).Value .Range("D" & cellCnt).Value = Worksheets("Sheet1").Range("D" & dataCnt).Value .Range("E" & cellCnt).Value = Worksheets("Sheet1").Range("E" & dataCnt).Value End With cellCnt = cellCnt + 1 End If Next

  • エクセルVBA の変数を使うべきでしょうか?

    はじめまして。エクセル初心者です。 書籍やサイトで勉強させてもらっていますが、VBAがなかなか難しくてすぐに壁にぶつかってしまいます。少々困ってしまい、詳しい方のアドバイスを頂ければと質問を投稿させていただきました。 どうか宜しくお願い致します。質問ですが、 以下のようなコードで、sheet5のB列の任意のセルをダブルクリックした場合、sheet5のBCD列の同じ行のセル値がsheet1の指定した列に入力されるという処理を作りました。 これで一応目的の動作はするのですが、数が増えると「コンパイルエラー・プロシージャが大きすぎます」というメッセージがでてしまいます。列や行には規則性があるので、もしかしたら変数というものを使ってコードを書き直せばいいのかなと思いネットで調べてみたのですが、今のところさっぱり理解できません。 申し訳ありませんが、分かりやすくご教授いただけないでしょうか。バージョンは2003を使っています。 また、下のコードですと、sheet5のBCDいずれかのセルに空白があった場合、sheet1の列に入力されるときに入力される行がずれてしまいます。今は空白を何かで埋めて対処しているのですが、この問題の解決策も教えて頂けると助かります。どうか宜しくお願い致します。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, cancel As Boolean) If Target.Address = "$B$2" Then Worksheets("sheet1").Range("B" & Rows.Count).End(xlUp).Offset(1).Value = Target.Value Worksheets("sheet1").Range("H" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("B2") Worksheets("sheet1").Range("K" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("C2") Worksheets("sheet1").Range("M" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("D2") Worksheets("sheet1").Activate cancel = True End If If Target.Address = "$B$3" Then Worksheets("sheet1").Range("B" & Rows.Count).End(xlUp).Offset(1).Value = Target.Value Worksheets("sheet1").Range("H" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("B3") Worksheets("sheet1").Range("K" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("C3") Worksheets("sheet1").Range("M" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("D3") Worksheets("sheet1").Activate cancel = True End If If Target.Address = "$B$4" Then Worksheets("sheet1").Range("B" & Rows.Count).End(xlUp).Offset(1).Value = Target.Value Worksheets("sheet1").Range("H" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("B4") Worksheets("sheet1").Range("K" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("C4") Worksheets("sheet1").Range("M" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("D4") Worksheets("sheet1").Activate cancel = True End If   ・     ・   ・     ・   ・     ・ End Sub

  • エクセルのフォームのVBAについて

    VBAがまったくわからないのに参考書を見て高度な事に挑戦しています フォームは作れてフォームをクリックやら入力やらして作ったOKボタンを押すと シート2のA1B1C1‥の列に入力文字だけが羅列されます。 しかし次にやろうとするとA2B2C2‥と下に行かず又A1B1C1‥の列の文字が変更になり続きません。何がいけないのでしょうか? Sub 入力() Dim LastRow As Long With Worksheets("sheet2") LastRow = Worksheets("sheet2").Range("A" & Rows.Count).End(xlUp).Row .Range("A" & LastRow).Value = Worksheets("sheet1").Range("A5").Value .Range("B" & LastRow).Value = Worksheets("sheet1").Range("A7").Value .Range("C" & LastRow).Value = Worksheets("sheet1").Range("A8").Value .Range("D" & LastRow).Value = Worksheets("sheet1").Range("A10").Value End With End Sub と参考書とおりいれたのですが‥。教えて下さい。