Excel (VBA)

Excel VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 7 Home Premium : Excel 2010)
16個のシートのデータを、書き込みシートにVBで一気に転記する方法
投稿日時: 21/06/21 07:05:58
投稿者: 夏が恋しい

シートが16あります。
16個のシートのデータを、書き込みシートにVBで一気に転記する方法をご教授願います。
シート1は
A B C D E F G H列まであります。
クラスの人数は、クラス毎に異なっています(30〜45人まで)が、
各クラスの人数は氏名の人数は計算できます。
(実際は各組の人数は、具体的数字として出ています)
50行目に合計の計算式があります。
つまり、各組の最後の人のあと、空欄行があります。
空欄行の数は組によって、異なっています。
他のクラスも人数の違いはありますが、他は同じです。
 
1行目は、下記の項目名が入ります。
組 名前 国語 数学 理科 社会 英語 合計
1 ○○ 点数 点数 点数 点数 点数 合計点
……………………………………………………………………
……………………………………………………………………
 
51行目の式(合計計算式は簡単なので省いてあります)
1 =COUNTIF(B2:B50,"*") 合計 合計 合計 合計 合計 総合計点
 
 
クラス毎の合計点データ(51行目)は転記先の書き込みシートには転記しません。
 
 
書き込みシートは1行目は、下記の項目名が書いてあります。
組 名前 国語 数学 理科 社会 英語 合計
 
2行目に、シート1のデータを転記して、
このデータの下に続けてシート2のデータを転記、
続けてシート3のデータを転記、
この繰り返しで
シート16のデータを続けて転記したいです。
空欄行は転記しません。
よろしくお願いします。

回答
投稿日時: 21/06/21 08:04:51
投稿者: simple

えーと、詰まっているのはどこですか?
 
(1)コピーするセル範囲の指定方法ですかね。
Range("B1").End(xlDown).Row とすれば、最終行がわかりますよね。
これを使って、
Range("A2",Cells(その行、"H")) がコピー元ですかね。
 
(2)貼付先は、
Cells(Rows.Count,"A").End(xlUp).Row で最終行がわかりますから、
その次の行のA列のセルに貼付ればよいでしょう。
 
まずは、上記のことを参考に,ご自分でトライしてみて下さい。
詰まったら、現状のコードを提示して、具体的に質問してください。

投稿日時: 21/06/21 09:48:33
投稿者: 夏が恋しい

論点を整理していただき有り難うございます。
そのようにやりたいのです。
 
早速のご返事有り難うございます。
試しに第3行目から、6行目が終端行としてマクロを作ると下記となりました。
 
Sub Macro1()
'
' Macro1 Macro Range("B1").End(xlDown).Row
'
 
'
    Range("A3:H6").Select
    Selection.Copy
End Sub
 
そこで、教えていただいた式を上につけてみました。
RangeのH6の所にはなんと記入したら良いのでしょうか?
Sub Macro1()
'
' Macro1 Macro
'
'
Range("B1").End(xlDown).Row
    Range("A3:H6").Select
    Selection.Copy
End Sub

回答
投稿日時: 21/06/21 10:29:50
投稿者: mattuwan44

>そこで、教えていただいた式を上につけてみました。
 
VBAでのプログラミングは関数を組み立てて作るのではなく、
作業を指示する命令文を組み立てて作ります。
 
なので、
 
0)作業開始
1)表の範囲は「A1:H51」のセル範囲
2)データのセル範囲は、表の先頭セルの1つ下から、表の最後のセルの1つ上の範囲
3)データのセル範囲内のデータ数を数える
4)貼り付け先の行番号指定
5)データ数の行分をコピー&ペースト
6)次の貼り付け先行番号取得(貼り付け先行番号+データ数)
7)シート数分繰り返す(1番へ戻る)
8)作業終わり
 
言葉にできてない部分もありますが、
こういう作業の流れをVBA語で書いて行けばいいかと思います。
(単語は英語に似ていて、文法は日本語に似ている)
 
この辺の勉強をある程度していかないとつらいかなぁと思いました。
 
参考URL>>
http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/index.html
 
↑の1〜8までを読んでみてトライしてみてはいかがでしょう。

回答
投稿日時: 21/06/21 10:31:52
投稿者: simple

失礼ですが、ExcelVBAのテキストのようなものは
手元にありますか?無ければ購入して下さい。
ネットだけで何とかしようとしていませんか?

回答
投稿日時: 21/06/21 13:36:52
投稿者: QooApp

エクセルマクロ記録機能は使えるようなので、とりあえず範囲固定で構わないので
一通りの作業を記録してみてはいかがでしょうか。
 
想定される手順ですが、
マクロを記録するブックを開く
書き込むシート・書き込み先シートを開く
 
マクロ記録開始
 
1枚目のシートを選択する
シート中の範囲を選択する
コピーコマンドを行う
貼り付け先シートを開く
貼り付け先のセル(左上座標)を選択する
張り付ける
 
マクロ記録停止
 
多分この手順で操作すればとりあえず1個分作れますよね。
 
そうなると
 
Sub ”記録時にマクロ名指定されているもの”()

End Sub
で囲われるコードができます。
 
 
エクセル画面からVBのコーディング画面に切り替えて、
Sub ”記録時にマクロ名指定されているもの”()
”ここの中の範囲を丸ごとコピー”
End Sub
 

 
Sub ”記録時にマクロ名指定されているもの”()
ペースト1
ペースト2
ペースト3
ペースト4
ペースト5
ペースト6
ペースト7
...
ペースト16個分複製

End Sub
 
ペーストした単位で参照しているシート名(またはブック名等)やセルの範囲を書き換える
 
できないコードを作成するより、とりあえず作れる方法で作成された方が早いのではと判断し、上記提案します。マクロ記録機能は余計な操作を大量に含むケースがあります。今回の場合、セレクトと貼り付けで2行の記載になる部分は簡略化を詰めていくと1行で書けます。
ですが、おそらく今の進み具合だと1週間以上かかりそうではないかと思います。
 
16回も複写して設定変えるのがめんどくさいんじゃいって話はとりあえず動くコードを開発してからでも問題ないと思います。特にお急ぎのようですし。

投稿日時: 21/06/21 14:12:35
投稿者: 夏が恋しい

みなさん有り難うございます。
 
Sub Macro3()
'
' Macro3 Macro
'
 
'
    Range("A3:H6").Select
    Selection.Copy
    Sheets("差込R3年").Select
    Range("A2").Select
    ActiveSheet.Paste
End Sub
 
 
ここのH6を変数で取得して、自動で差込R3年シートに書き込みしたいのが
希望です。
終端行が不定のマクロは初めてで、苦労しています。

回答
投稿日時: 21/06/21 16:30:06
投稿者: simple

>ここのH6を変数で取得して、自動で差込R3年シートに書き込みしたいのが希望です。
とのことですが、以下に書いていますよ。読んでいますか?

引用:
(1)コピーするセル範囲の指定方法ですかね。
Range("B1").End(xlDown).Row とすれば、最終行がわかりますよね。
これを使って、
Range("A2",Cells(その行、"H")) がコピー元ですかね。
  
(2)貼付先は、
Cells(Rows.Count,"A").End(xlUp).Row で最終行がわかりますから、
その次の行のA列のセルに貼付ればよいでしょう。

ひとつのシートでのコードです。
 
Sub test()
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim rngToPaste As Range
    
    Set ws = Worksheets("Sheet1")   ' 仮のシート名です、修正して下さい。
    lastRow = ws.Range("B1").End(xlDown).Row
    Set rngToPaste = Sheets("差込R3年").Cells(Rows.Count, "A").End(xlUp).Offset(1)
    ws.Range("A2", ws.Cells(lastRow, "H")).Copy rngToPaste
End Sub
(コピー元は、二行目から始まる前提です。設定例がそうなっていますよね。)
 
最終行の求め方とか、コピーペイストの仕方とかは、
ExcelVBAの1丁目1番地なので、どんなテキストにも書いてあるはずです。
テキストを読んでいるんですか? 是非読んでくださいね。
スタート時点から人に尋ねても効率悪いかもしれませんよ。

回答
投稿日時: 21/06/21 16:34:51
投稿者: WinArrow
投稿者のウェブサイトに移動

>ここのH6を変数で取得して
 
マクロの記録で
次の手操作を実行してみてください。
 
セルH1を選択
[crl]+[↓]
 
ここまで
 
そうすると、
⇓のようなコードができていると思います。
 

    Range("H1").Select
    Selection.End(xlDown).Select

 
Debug.print Selection.Address(0,0)
で、そのセルのアドレスが取得できます。
Dim 範囲 As String
範囲 = "A1:" & Selection.Address(0,0)
 
Range(範囲).Select
とすれば、H列の最終行までの範囲を選択したことになります。
 
普通は、このような記述をしませんが、
原理を理解していただくために。敢えて細かく書きました。

回答
投稿日時: 21/06/21 16:38:36
投稿者: WinArrow
投稿者のウェブサイトに移動

あ〜〜〜〜
Simleさんと被ってしまいました。
ごめんなさい。

回答
投稿日時: 21/06/21 16:55:18
投稿者: WinArrow
投稿者のウェブサイトに移動

範囲の最終セルを取得する方法
 
前提
1〜2行は、空白行であり、I列も空白列という前提
 
セルA3を選択し、[Ctrl]+[*]・・・[:]はテンキーの場合
を押す。
この操作をマクロの記録でコードを作成する。
Debug.Print Range("A3").CurrentRegion.Address(0, 0)
で範囲が取得できます。

投稿日時: 21/06/21 17:49:42
投稿者: 夏が恋しい

今simpleさんの記述を書き込んで
シート名を3組にかえて実行したら、差込R年シートの2行目から、正しい行の分だけ
書き込みができました。まだ全く分かっておりませんが、勉強致します。
 
みなさんからの貴重な情報も勉強して、少しでもできるようになりたいです。
 
有り難うございました。

回答
投稿日時: 21/06/21 18:02:53
投稿者: QooApp

http://www.niji.or.jp/home/toru/notes/8.html
 
A地点のセルから範囲指定する場合のあれこれはここのHPに書いてあることがおそらく一番読みやすいと思います。
自分も範囲指定のコマンド忘れたときにブックマークからいつも眺めるサイトです。
おススメです。

トピックに返信