[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『基本データから一括取り込みするマクロ』(マクロ初心者)
[[20180215112325]]にて質問させていただきましたが、
別の内容の質問であるため、
改めて、質問させていただきます。
以下のようなシートがあります。
午前と午後それぞれ20行あります。
日付間は2行の空白行があります。
これが31日分あります。
___B_____C_____D_____E______F
_2_2018__2
_3
_4_______2/1___午前
_5_担当__名前__区分__開始___終了
_6_小平__山田__A____8:30___10:00
_7_羽生__鈴木__B____10:15__11:15
:
25_平野__岩田__C____11:00__11:55
26_______2/1___午後
27_担当__名前__区分__開始___終了
28_羽生__山下__B____12:00__13:00
29_宇野__久保__C____13:15__14:15
:
47_高木__柴田__A____16:00__17:00
48
49
50_______2/2___午前
:
上記の7日までが基本のデータとなります。
以下のような形になります。
もちろん、曜日は月によって変わります。
上記表のB2(年)とC2(月)を切り替えると日付が変わる仕組みです。
1日(月) B6:F25,B28:F47
2日(火) B52:F71,B74:F93
3日(水) B98:F117,B120:F139
4日(木) B144:F163,B166:F185
5日(金) B190:F209,B212:F231
6日(土) B236:F255,B258:F277
7日(日) B282:F301,B304:F323
上記の7日分のデータを基に、その月内の同じ曜日にデータを一括で取り込むマクロを組みたいです。
1日→8日、2日→9日、3日→10日という具合に取り込めればと思います。
当然、月によって日数も異なりますので、本年2月であれば28日までなので、上記表の29日から31日までの枠には、
日付欄(C列)は空欄となるようにしています。
1日〜7日分のデータを8日以降に一括で取り込む際、日付が空欄の箇所にはデータは取り込まない形にしたいのです。
みなさん、ご教授のほどよろしくお願いいたします。
日付は以下のセルに入っています。
上から二つずつが同じ日付になります。
C4とC26は1日、C50とC72は2日、以降31日まであります。
C4 C26 C50 C72 C96 C118 C142 C164 C188 C210 C234 C256 C280 C302 C326 C348 C372 C394 C418 C440 C464 C486 C510 C532 C556 C578 C602 C624 C648 C670 C694 C716 C740 C762 C786 C808 C832 C854 C878 C900 C924 C946 C970 C992 C1016 C1038 C1062 C1084 C1108 C1130 C1154 C1176 C1200 C1222 C1246 C1268 C1292 C1314 C1338 C1360 C1384 C1406
< 使用 Excel:Excel2013、使用 OS:Windows7 >
全部聞くのではなく、ここが判らないとか、こう書いてみたけどこうなってしまったとか、ご自身で動いた結果を添えて質問してください。
(???) 2018/02/16(金) 13:09
ものを見ないとアドバイスが可能かどうかわかりませんが、そちらをベースに改良していったほうがいいかもしれないので、まずはそのコードを提示されたらいかがでしょうか?
もっとも、マクロの記録〜 っておっしゃっているので多少は自力で整理してからにしていただきたいとは思いますが。。。。
(もこな2) 2018/02/16(金) 23:48
<< _ _ >>
(隠居じーさん) 2018/02/17(土) 10:04
(隠居じーさん) 2018/02/17(土) 10:12
どこから。どこに転記すればよいのか全くイメージできません。
単に、行の表示、非表示だけでできそうな気もします。
手作業でするとしたら、どんな手順になるか
箇条書きで説明しいただけますか。
(マナ) 2018/02/17(土) 17:27
マナさんの問いにお答えします。
以下が基本になるデータです。
1日から31日まであって、一つの日付が午前と午後それぞれ20行あります。
日付と日付間は2行の空白行があります。
これが31日分あります。
1日(月) B6:F25,B28:F47
2日(火) B52:F71,B74:F93
3日(水) B98:F117,B120:F139
4日(木) B144:F163,B166:F185
5日(金) B190:F209,B212:F231
6日(土) B236:F255,B258:F277
7日(日) B282:F301,B304:F323
1日であれば、B6:F25,B28:F47にデータを手入力しています。
これを同じ曜日である8日、15日、22日、29日に1日のデータを一括で取り込みたいというものです。
もちろん、コピーして貼り付ければよいかもしれませんが、そこをマクロで一括で取り込めたらと思います。
2日〜7日も同様になりますので、2月で言えば、8日から28日までのデータを上記の基本となるデータ(同じ曜日)からマクロボタンを作成して一括で取り込めたらと思います。
2月であれば、28日までなので、以下の日付枠は空欄となるよう関数を設定してますので、
日付枠が空欄の範囲にはデータを取り込まないようにしたいのです。当然、月によって変動しますので、それに対応したいです。
29日 C1292
C1314 30日 C1338 C1360 31日 C1384 C1406
説明がへたくそで分かりずらくて申し訳ありません。
何卒よろしくお願いいたします。
(マクロ初心者) 2018/02/17(土) 18:12
1日(月)のデータを手作業でコピー貼り付けする手順を
「箇条書き」で説明してください。
どのセル範囲をコピーして、
どのセルに貼り付けるのか
わかるように具体的に説明してください。
(マナ) 2018/02/17(土) 18:29
1日(月)のB6:F25をコピーして、8日(月)のB328:F347に貼り付けます
1日(月)のB28:F47をコピーして、8日(月)のB350:F369に貼り付けます
よろしくお願いします。
(マクロ初心者) 2018/02/17(土) 18:42
8〜31日のセルを、1〜7日のセルとリンクしておくだけでは駄目なのですか?
そうすれば、マクロいらないと思うのですが。
(マナ) 2018/02/17(土) 18:43
>1日(月)のB6:F25をコピーして、8日(月)のB328:F347に貼り付けます
>1日(月)のB28:F47をコピーして、8日(月)のB350:F369に貼り付けます
15日には、貼り付けしないのですか?
(マナ) 2018/02/17(土) 18:50
1日(月)のB6:F25をコピーして、15日(月)のB650:F669に貼り付けます
1日(月)のB28:F47をコピーして、15日(月)のB672:F691に貼り付けます
1日(月)のB6:F25をコピーして、22日(月)のB972:F991に貼り付けます
1日(月)のB28:F47をコピーして、22日(月)のB994:F1013に貼り付けます
1日(月)のB6:F25をコピーして、29日(月)のB1294:F1313に貼り付けます
1日(月)のB28:F47をコピーして、29日(月)のB1316:F1335に貼り付けます
(マクロ初心者) 2018/02/17(土) 18:57
(マナ) 2018/02/17(土) 19:01
(マナ) 2018/02/17(土) 19:32
(マナ) 2018/02/17(土) 19:52
1日(月)のB6:F25をコピーして、15日(月)のB650:F669に貼り付けます
1日(月)のB6:F25をコピーして、22日(月)のB972:F991に貼り付けます
1日(月)のB6:F25をコピーして、29日(月)のB1294:F1313に貼り付けます
1日(月)のB28:F47をコピーして、15日(月)のB672:F691に貼り付けます
1日(月)のB28:F47をコピーして、22日(月)のB994:F1013に貼り付けます
1日(月)のB28:F47をコピーして、29日(月)のB1316:F1335に貼り付けます
(マクロ初心者) 2018/02/17(土) 19:59
(マナ) 2018/02/17(土) 20:03
1日(月) B6:F25 → 8日(月) B328:F347
1日(月) B6:F25 → 15日(月) B650:F669
1日(月) B6:F25 → 22日(月) B972:F991
1日(月) B6:F25 → 29日(月) B1294:F1313
1日(月) B28:F47 → 8日(月) B350:F369
1日(月) B28:F47 → 15日(月) B672:F691
1日(月) B28:F47 → 22日(月) B994:F1013
1日(月) B28:F47 → 29日(月) B1316:F1335
(マクロ初心者) 2018/02/17(土) 20:10
ならば、なぜ繰り返すのですか。
手作業で、そんな面倒なことしますか。
普通は、貼付けだけを場所を変えて実行しませんか。
想像はつきますが、→の意味はなんですか。
これからマクロを作るための手順でもあります。
誰もが、同じことを再現できる手順にしていただけますか。
(マナ) 2018/02/17(土) 20:27
1日(月) B6:F25 コピー 8日(月) B328:F347 貼り付け
1日(月) B6:F25 コピー 15日(月) B650:F669 貼り付け
1日(月) B6:F25 コピー 22日(月) B972:F991 貼り付け
1日(月) B6:F25 コピー 29日(月) B1294:F1313 貼り付け
1日(月) B28:F47 コピー 8日(月) B350:F369 貼り付け
1日(月) B28:F47 コピー 15日(月) B672:F691 貼り付け
1日(月) B28:F47 コピー 22日(月) B994:F1013 貼り付け
1日(月) B28:F47 コピー 29日(月) B1316:F1335 貼り付け
(マクロ初心者) 2018/02/17(土) 20:37
手作業で、↑の作業を本当に実施しますか?
面倒ではないですか。
わたしなら
1)1日(月) B6:F25 をコピー
2)8日(月) B328:F347に貼り付け
と、2ステップの操作をします。
まぁ、マクロなら面倒でもないのですが。
今は、手作業ですることをイメージして、
それを手順化してください。
(マナ) 2018/02/17(土) 20:48
1)1日(月) B6:F25 をコピー
2)8日(月) B328:F347 に貼り付け
3)15日(月) B650:F669 に貼り付け
4)22日(月) B972:F991 に貼り付け
5)29日(月) B1294:F1313 に貼り付け
6)1日(月) B28:F47 をコピー
7)8日(月) B350:F369 に貼り付け
8)15日(月) B672:F691 に貼り付け
9)22日(月) B994:F1013 に貼り付け
10)29日(月) B1316:F1335 に貼り付け
(マクロ初心者) 2018/02/17(土) 21:06
(マナ) 2018/02/17(土) 21:11
で、コピー範囲、貼付け範囲に一定の位置関係があるのがわかりますか。
(マナ) 2018/02/17(土) 21:29
(マクロ初心者) 2018/02/17(土) 21:32
試せばわかることを、なぜ確認すえうのですか?
手作業ならできるのですよね。
それをマクロ化するのを、お手伝いしているのです。
(マナ) 2018/02/17(土) 21:47
ならば、値貼付けで手順を修正してください。
>一定の位置関係とは、、、
わからなければ、今はまだよいです。
2日(火)の場合の手順も考えてください。
(マナ) 2018/02/17(土) 21:54
1)1日(月) B6:F25 をコピー
2)8日(月) B328:F347 に値貼り付け
3)15日(月) B650:F669 に値貼り付け
4)22日(月) B972:F991 に値貼り付け
5)29日(月) B1294:F1313 に値貼り付け
6)1日(月) B28:F47 をコピー
7)8日(月) B350:F369 に値貼り付け
8)15日(月) B672:F691 に値貼り付け
9)22日(月) B994:F1013 に値貼り付け
10)29日(月) B1316:F1335 に値貼り付け
(マクロ初心者) 2018/02/17(土) 21:59
貼り付け先は、左上の1セルでもよいのですが、
今回は、このままでよいです。
(マナ) 2018/02/17(土) 22:09
1)1日(月) B6:F25 をコピー
わからなければ、「マクロの記録」です。
(マナ) 2018/02/17(土) 23:03
○○.Select
Selection.△△
↑こういうのは、SelectとSelectionを省略し
○○.△△
1行にできます。つまり
コピー範囲.Copy
です。
次に、↓この部分だけ考えてください
2)8日(月) B328:F347 に値貼り付け
(マナ) 2018/02/17(土) 23:22
マクロの記録でやりました。
Range("B328").PasteSpecial Paste
(マクロ初心者) 2018/02/17(土) 23:32
だめです。省略の仕方が間違っています。
記録されたものをそのまま教えてください。
(マナ) 2018/02/17(土) 23:35
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False (マクロ初心者) 2018/02/17(土) 23:39
Range("B328").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False
で、これは貼り付け先に左上隅だけを選択したからで
もし、手順通りに「B328:F347 に値貼り付け」していたら
Range("B328:F347").Select
と記録されたはずです。
つまり、これでもよいです。
Range("B328:F347").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False
では、↓のマクロを考えてください
1)1日(月) B6:F25 をコピー
2)8日(月) B328:F347 に値貼り付け
3)15日(月) B650:F669 に値貼り付け
4)22日(月) B972:F991 に値貼り付け
5)29日(月) B1294:F1313 に値貼り付け
(マナ) 2018/02/17(土) 23:52
(マナ) 2018/02/17(土) 23:55
Range("B6:F25").Copy Range("B328") Range("B6:F25").Copy Range("B650") Range("B6:F25").Copy Range("B972") Range("B6:F25").Copy Range("B1294")
(マクロの初心者) 2018/02/18(日) 00:16
1)1日(月) B6:F25 コピー 8日(月) B328 に貼り付け
2)1日(月) B6:F25 コピー 15日(月) B650 に貼り付け
3)1日(月) B6:F25 コピー 22日(月) B972 に貼り付け
4)1日(月) B6:F25 コピー 29日(月) B1294 に貼り付け
(マナ) 2018/02/18(日) 21:39
Range("B6:F25").Copy Range("B328")
Range("B650")
Range("B972")
Range("B1294")
実際に動作させてみましたが、うまく取り込みできません。
(マクロ初心者) 2018/02/19(月) 16:32
Range("B6:F25").Copy Range("B328") ←OK
Range("B650") ←意味不明(NG)
Range("B972") ←意味不明(NG)
Range("B1294") ←意味不明(NG)
Excel君にセルだけ伝えたって何していいかわからないですよね?
そのセルをどうしたいのか命令(メソッド)がないからエラーでとまっちゃう気がします。
(もこな2) 2018/02/19(月) 18:22
こんなのでいいような気がするなぁ・・(実環境を作るのが面倒なので、まともにテストしていないけど・・)
Sub Copy1to4() Dim AmToCopy As Range Dim PmToCopy As Range Dim First7days As Long Dim UpTo As Long
Application.ScreenUpdating = False
For First7days = 1 To 7
Set AmToCopy = Range("B6:F25").Offset((First7days - 1) * 46) Set PmToCopy = Range("B28:F47").Offset((First7days - 1) * 46)
For UpTo = 1 To 4
'日付が入っていたら処理する If AmToCopy.Offset(UpTo * 322).Cells(1, 1).Offset(, 1).Value <> "" Then AmToCopy.Copy AmToCopy.Offset(UpTo * 322) PmToCopy.Copy PmToCopy.Offset(UpTo * 322) End If Next UpTo Next First7days
Application.ScreenUpdating = True End Sub
(半平太) 2018/02/19(月) 20:22
2018/02/19(月) 18:49 の
>はい、エラーで止まってしまいます…
↑なら、なんで直さないの?マナさんに手とり足取り教えてもらわないと進めたくないの?っておもいます。
2018/02/18(日) 21:39にマナさんが、
〜〜に貼り付け っておしゃってるところ割と重要です。
^^^^^
↑
”値”貼り付けじゃなくて、ただの貼り付け って言ってるところに注目。
(もこな2) 2018/02/20(火) 00:21
実際にエクセルでコード表に書いてやってみてます。
後ほどまたご連絡いたします。
(マクロ初心者) 2018/02/20(火) 18:51
エラーになりました。困りました。だけではなく具体的にどのように考えてどうしたら、どううまくいかなかったのかを説明できるようになると、いろんな方からアドバイスがもらえるようになると思います。
ちなみに、「2018/02/19(月) 16:32 」のものをマナさん流にすると
Range("B6:F25").Copy Range("B328")
Range("B650")
Range("B972")
Range("B1294")
↓
1)1日(月) B6:F25 コピー 8日(月) B328 に(普通の)貼り付け
2)意味が通らない(命令がない)ので実行不能。
3)意味が通らない(命令がない)ので実行不能。
4)意味が通らない(命令がない)ので実行不能。
ってなるとおもいます。
(もこな2) 2018/02/20(火) 21:31
2018/02/17(土) 23:03
から
2018/02/17(土) 23:52
までを、
もう一度、読んでいただけますか。
(マナ) 2018/02/20(火) 23:22
↓この部分だけのマクロを考えてください。
1)1日(月) B6:F25 をコピー
(マナ) 2018/02/20(火) 23:49
2)8日(月) B328:F347 に値貼り付け
1)の部分は、必要ないですよ。
2)の部分だけ。
(マナ) 2018/02/20(火) 23:54
もう一度、読んでいただけますか。
(マナ) 2018/02/21(水) 00:03
(マナ) 2018/02/21(水) 00:04
Range("B328:F347").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False (マクロの初心者) 2018/02/21(水) 00:07
コピー範囲.Copy
これが指定した範囲をコピーするマクロです。
> Range("B328:F347").PasteSpecial Paste:=…
貼り付け先.PasteSpecial
これが、形式を選択して貼付けのマクロです。 http://www.moug.net/tech/exvba/0050104.html
Paste:=xlPasteValuesをつけると、値貼り付けになります。 省略すると、すべて貼付けになります。 値貼り付けしたいだけなら、Operation:=以下は省略できます。
つまり
>2)8日(月) B328:F347 に値貼り付け
は、↓これだけでもOKです。
Range("B328:F347").PasteSpecial Paste:=xlPasteValues
'---
もう一度、↓のマクロを考えてください
1)1日(月) B6:F25 をコピー 2)8日(月) B328:F347 に値貼り付け 3)15日(月) B650:F669 に値貼り付け 4)22日(月) B972:F991 に値貼り付け 5)29日(月) B1294:F1313 に値貼り付け
(マナ) 2018/02/21(水) 19:43
> Paste:=xlPasteValuesをつけると、値貼り付けになります。 > 省略すると、すべて貼付けになります。
>スマホから打っていて、
わたしは、あわてません。
エクセルが使える環境で、動作確認してから
返事いただけますか。
(マナ) 2018/02/21(水) 21:20
どういう意味でしょうか
>また、 Paste:=xlPasteValuesを省力しても同様の状態でした。
それは、同じ書式で、値貼り付けでも、すべて貼付けでも同じということでは?
(マナ) 2018/02/21(水) 22:49
どういう意味でしょうか すいません。問題にするようなことではありませんでした。
それは、同じ書式で、値貼り付けでも、すべて貼付けでも同じということでは? おっしゃるとおりですよね。
以下で良いでしょうか?
Range("B6:F25").Copy
Range("B328:F347").PasteSpecial Paste:=xlPasteValues Range("B650:F669").PasteSpecial Paste:=xlPasteValues Range("B972:F991").PasteSpecial Paste:=xlPasteValues Range("B1294:F1313").PasteSpecial Paste:=xlPasteValues (マクロの初心者) 2018/02/22(木) 08:04
Range("B328:F347").PasteSpecial Paste:=xlPasteValues Range("B650:F669").PasteSpecial Paste:=xlPasteValues Range("B972:F991").PasteSpecial Paste:=xlPasteValues Range("B1294:F1313").PasteSpecial Paste:=xlPasteValues ・ ・ ・ End Sub
半平太さん、ご提示いただいているコードを実際に試してみましたが、貼り付けがされません。
実環境がきちんとお伝えできていないからですね、申し訳ありません。
(マクロの初心者) 2018/02/22(木) 12:58
Range("B328:F347") に形式を選択して貼り付け(値のみ) を実行しなさい
Range("B650:F669") に形式を選択して貼り付け(値のみ) を実行しなさい
Range("B972:F991") に形式を選択して貼り付け(値のみ) を実行しなさい
Range("B1294:F1313") に形式を選択して貼り付け(値のみ) を実行しなさい
っていう命令になっているので、「何を」形式を選択して貼り付け(値のみ)すればいいのかわからないExcel君はちゃんと動いてくれないでしょう。
(もこな2) 2018/02/22(木) 13:12
Sub test()
Range("B6:F25").Copy Range("B328:F347").PasteSpecial Paste:=xlPasteValues Range("B650:F669").PasteSpecial Paste:=xlPasteValues Range("B972:F991").PasteSpecial Paste:=xlPasteValues Range("B1294:F1313").PasteSpecial Paste:=xlPasteValues ・ ・ ・ End Sub
(マクロの初心者) 2018/02/22(木) 13:34
次に、1日の午後のデータを転記するマクロを考えてください。
同じことだから簡単ですよね。
(マナ) 2018/02/22(木) 20:55
Sub test()
Range("B28:F47").Copy Range("B350:F369").PasteSpecial Paste:=xlPasteValues Range("B672:F691").PasteSpecial Paste:=xlPasteValues Range("B994:F1013").PasteSpecial Paste:=xlPasteValues Range("B1316:F1335").PasteSpecial Paste:=xlPasteValues End Sub (マクロの初心者) 2018/02/22(木) 22:28
'1日の午前 Range("B6:F25").Copy Range("B328:F347").PasteSpecial Paste:=xlPasteValues Range("B650:F669").PasteSpecial Paste:=xlPasteValues Range("B972:F991").PasteSpecial Paste:=xlPasteValues Range("B1294:F1313").PasteSpecial Paste:=xlPasteValues '1日の午後 Range("B28:F47").Copy Range("B350:F369").PasteSpecial Paste:=xlPasteValues Range("B672:F691").PasteSpecial Paste:=xlPasteValues Range("B994:F1013").PasteSpecial Paste:=xlPasteValues Range("B1316:F1335").PasteSpecial Paste:=xlPasteValues End Sub (マクロの初心者) 2018/02/22(木) 22:31
Sub オフセット() Range("B6:F25").Offset(322).Select End Sub
(マナ) 2018/02/22(木) 22:48
Sub オフセット2() Range("B6:F25").Offset(322 * 2).Select End Sub
(マナ) 2018/02/22(木) 23:05
コピー範囲、貼付け範囲の位置関係の規則性がわかりますか。
こんなときには、Offsetが使えます。
2018/02/22(木) 22:31 のマクロをOffsetを使って書換えてみてください。
(マナ) 2018/02/22(木) 23:20
Sub test()
'1日の午前 Range("B6:F25").Copy Range("B6:F25").Offset(322).Select Range("B6:F25").Offset(322 * 2).Select Range("B6:F25").Offset(322 * 3).Select Range("B6:F25").Offset(322 * 4).Select
'1日の午後 Range("B28:F47").Copy Range("B28:F47").Offset(322).Select Range("B28:F47").Offset(322 * 2).Select Range("B28:F47").Offset(322 * 3).Select Range("B28:F47").Offset(322 * 4).Select
End Sub
(マクロの初心者) 2018/02/23(金) 07:42
考えたものをこうですか?と書き込むのではなくて、 試してから書き込んでください。 うまくいかない場合は、こう書きかえたけどこういうエラーが出るとか、 こうなってしまうとか書き込んでください。 (semm) 2018/02/23(金) 10:22
>Range("B6:F25").Offset(322).Select
は、B6:F25の322行下を選択(Select)する
という意味です。
Range("B6:F25").Offset(322)
が
Range("B328:F347")
なので、
Range("B328:F347").Select
と同じことになります。
範囲.Select
という構文は、セルを選択するものです。
Range("A1").Select
ならば、セルA1を選択です。
で、今回は選択(Select)したいのではなく
値貼り付けしたいのですよね。
値貼り付けの構文は
貼り付け先.PasteSpecial Paste:=xlPasteValues
です。
Selectしないで、PasteSpecialしてください。
(マナ) 2018/02/23(金) 20:42
Sub test()
'1日の午前 Range("B6:F25").Copy Range("B6:F25").Offset(322).PasteSpecial Paste:=xlPasteValues Range("B6:F25").Offset(322 * 2).PasteSpecial Paste:=xlPasteValues Range("B6:F25").Offset(322 * 3).PasteSpecial Paste:=xlPasteValues Range("B6:F25").Offset(322 * 4).PasteSpecial Paste:=xlPasteValues '1日の午後 Range("B28:F47").Copy Range("B28:F47").Offset(322).PasteSpecial Paste:=xlPasteValues Range("B28:F47").Offset(322 * 2).PasteSpecial Paste:=xlPasteValues Range("B28:F47").Offset(322 * 3).PasteSpecial Paste:=xlPasteValues Range("B28:F47").Offset(322 * 4).PasteSpecial Paste:=xlPasteValues End Sub (マクロの初心者) 2018/02/24(土) 23:33
何回もでてくる、Range("B6:F25")とかRange("B28:F47")を
With〜End Withを使って、省略する書き方です。
動作確認してください。
結果的に行数は増えちゃいますが、
慣れると、このほうが見やすくなります。
With〜End Withについては、リンク先に目を通してください。
Sub 値貼り付け1日用() '1日の午前 With Range("B6:F25") .Copy .Offset(322).PasteSpecial Paste:=xlPasteValues .Offset(322 * 2).PasteSpecial Paste:=xlPasteValues .Offset(322 * 3).PasteSpecial Paste:=xlPasteValues .Offset(322 * 4).PasteSpecial Paste:=xlPasteValues End With '1日の午後 With Range("B28:F47") .Copy .Offset(322).PasteSpecial Paste:=xlPasteValues .Offset(322 * 2).PasteSpecial Paste:=xlPasteValues .Offset(322 * 3).PasteSpecial Paste:=xlPasteValues .Offset(322 * 4).PasteSpecial Paste:=xlPasteValues End With
End Sub
'---
これで、1日のデータをコピーできました。
これを7日分繰り返すことになります。
まずは、1日用のマクロを参考に、2日用のマクロを考えてみてください。
(マナ) 2018/02/25(日) 10:32
Sub 値貼り付け2日用()
'1日の午前 With Range("B6:F25") .Copy .Offset(322).PasteSpecial Paste:=xlPasteValues .Offset(322 * 2).PasteSpecial Paste:=xlPasteValues .Offset(322 * 3).PasteSpecial Paste:=xlPasteValues .Offset(322 * 4).PasteSpecial Paste:=xlPasteValues End With '1日の午後 With Range("B28:F47") .Copy .Offset(322).PasteSpecial Paste:=xlPasteValues .Offset(322 * 2).PasteSpecial Paste:=xlPasteValues .Offset(322 * 3).PasteSpecial Paste:=xlPasteValues .Offset(322 * 4).PasteSpecial Paste:=xlPasteValues End With '2日の午前 With Range("B52:F71") .Copy .Offset(322).PasteSpecial Paste:=xlPasteValues .Offset(322 * 2).PasteSpecial Paste:=xlPasteValues .Offset(322 * 3).PasteSpecial Paste:=xlPasteValues .Offset(322 * 4).PasteSpecial Paste:=xlPasteValues End With '2日の午後 With Range("B74:F93") .Copy .Offset(322).PasteSpecial Paste:=xlPasteValues .Offset(322 * 2).PasteSpecial Paste:=xlPasteValues .Offset(322 * 3).PasteSpecial Paste:=xlPasteValues .Offset(322 * 4).PasteSpecial Paste:=xlPasteValues End With End Sub (マクロの初心者) 2018/02/26(月) 07:20
それでもOKですが、さずがに7日分となると長くなりすぎです。
なので、繰り返し用の構文を使います。
'----
まずは、今の2日用のマクロを少し修正から。
1日の午前の場合は、Range("B6:F25")をコピーしました
2日の午前の場合は、Range("B52:F71")をコピーしました
3日の午前の場合は、…
規則性があるはずです。
Sub オフセット3() Range("B6:F25").Offset(46).Select End Sub
'----
Sub 値貼り付け2日用() を Offset を使って書換えてみてください。
(マナ) 2018/02/26(月) 19:48
Sub 値貼り付け2日用()
'1日の午前 With Range("B6:F25").Offset(46).Select With Range("B28:F47").Offset(46).Select With Range("B52:F71").Offset(46).Select With Range("B74:F93").Offset(46).Select .Copy .Offset(322).PasteSpecial Paste:=xlPasteValues .Offset(322 * 2).PasteSpecial Paste:=xlPasteValues .Offset(322 * 3).PasteSpecial Paste:=xlPasteValues .Offset(322 * 4).PasteSpecial Paste:=xlPasteValues End With End Sub (マクロの初心者) 2018/02/27(火) 07:26
それとは別に、「Excel VBA 繰り返し」なども調べてみましょう。
(通りすがり) 2018/02/27(火) 09:51
Sub オフセット3() Range("B6:F25").Offset(46).Select End Sub
(マナ) 2018/02/27(火) 19:30
Range("B52:F71")
は、Offsetを使って
Range("B6:F25").Offset(46)
と書き換えることが出来るということです。
理解できますか。
(マナ) 2018/02/27(火) 20:59
Sub 値貼り付け2日用() '1日の午前 With Range("B6:F25") .Copy .Offset(322).PasteSpecial Paste:=xlPasteValues .Offset(322 * 2).PasteSpecial Paste:=xlPasteValues .Offset(322 * 3).PasteSpecial Paste:=xlPasteValues .Offset(322 * 4).PasteSpecial Paste:=xlPasteValues End With '1日の午後 With Range("B28:F47") .Copy .Offset(322).PasteSpecial Paste:=xlPasteValues .Offset(322 * 2).PasteSpecial Paste:=xlPasteValues .Offset(322 * 3).PasteSpecial Paste:=xlPasteValues .Offset(322 * 4).PasteSpecial Paste:=xlPasteValues End With '2日の午前 With Range("B6:F25").Offset(46) .Copy .Offset(322).PasteSpecial Paste:=xlPasteValues .Offset(322 * 2).PasteSpecial Paste:=xlPasteValues .Offset(322 * 3).PasteSpecial Paste:=xlPasteValues .Offset(322 * 4).PasteSpecial Paste:=xlPasteValues End With '2日の午後 With Range("B6:F25").Offset(46) .Copy .Offset(322).PasteSpecial Paste:=xlPasteValues .Offset(322 * 2).PasteSpecial Paste:=xlPasteValues .Offset(322 * 3).PasteSpecial Paste:=xlPasteValues .Offset(322 * 4).PasteSpecial Paste:=xlPasteValues End With
End Sub
(マナ) 2018/02/28(水) 19:41
Sub 値貼り付け2日用() '1日の午前 With Range("B6:F25") .Copy .Offset(322).PasteSpecial Paste:=xlPasteValues .Offset(322 * 2).PasteSpecial Paste:=xlPasteValues .Offset(322 * 3).PasteSpecial Paste:=xlPasteValues .Offset(322 * 4).PasteSpecial Paste:=xlPasteValues End With '1日の午後 With Range("B28:F47") .Copy .Offset(322).PasteSpecial Paste:=xlPasteValues .Offset(322 * 2).PasteSpecial Paste:=xlPasteValues .Offset(322 * 3).PasteSpecial Paste:=xlPasteValues .Offset(322 * 4).PasteSpecial Paste:=xlPasteValues End With '2日の午前 With Range("B6:F25").Offset(46) .Copy .Offset(322).PasteSpecial Paste:=xlPasteValues .Offset(322 * 2).PasteSpecial Paste:=xlPasteValues .Offset(322 * 3).PasteSpecial Paste:=xlPasteValues .Offset(322 * 4).PasteSpecial Paste:=xlPasteValues End With '2日の午後 With Range("B28:F47").Offset(46) .Copy .Offset(322).PasteSpecial Paste:=xlPasteValues .Offset(322 * 2).PasteSpecial Paste:=xlPasteValues .Offset(322 * 3).PasteSpecial Paste:=xlPasteValues .Offset(322 * 4).PasteSpecial Paste:=xlPasteValues End With
End Sub
(マナ) 2018/02/28(水) 19:52
Sub 値貼り付け7日用() '1日の午前 With Range("B6:F25") .Copy .Offset(322).PasteSpecial Paste:=xlPasteValues .Offset(322 * 2).PasteSpecial Paste:=xlPasteValues .Offset(322 * 3).PasteSpecial Paste:=xlPasteValues .Offset(322 * 4).PasteSpecial Paste:=xlPasteValues End With '1日の午後 With Range("B28:F47") .Copy .Offset(322).PasteSpecial Paste:=xlPasteValues .Offset(322 * 2).PasteSpecial Paste:=xlPasteValues .Offset(322 * 3).PasteSpecial Paste:=xlPasteValues .Offset(322 * 4).PasteSpecial Paste:=xlPasteValues End With '2日の午前 With Range("B6:F25").Offset(46) .Copy .Offset(322).PasteSpecial Paste:=xlPasteValues .Offset(322 * 2).PasteSpecial Paste:=xlPasteValues .Offset(322 * 3).PasteSpecial Paste:=xlPasteValues .Offset(322 * 4).PasteSpecial Paste:=xlPasteValues End With '2日の午後 With Range("B28:F47").Offset(46) .Copy .Offset(322).PasteSpecial Paste:=xlPasteValues .Offset(322 * 2).PasteSpecial Paste:=xlPasteValues .Offset(322 * 3).PasteSpecial Paste:=xlPasteValues .Offset(322 * 4).PasteSpecial Paste:=xlPasteValues End With '3日の午前 With Range("B6:F25").Offset(46 * 2) .Copy .Offset(322).PasteSpecial Paste:=xlPasteValues .Offset(322 * 2).PasteSpecial Paste:=xlPasteValues .Offset(322 * 3).PasteSpecial Paste:=xlPasteValues .Offset(322 * 4).PasteSpecial Paste:=xlPasteValues End With '3日の午後 With Range("B28:F47").Offset(46 * 2) .Copy .Offset(322).PasteSpecial Paste:=xlPasteValues .Offset(322 * 2).PasteSpecial Paste:=xlPasteValues .Offset(322 * 3).PasteSpecial Paste:=xlPasteValues .Offset(322 * 4).PasteSpecial Paste:=xlPasteValues End With '4日の午前 With Range("B6:F25").Offset(46 * 3) .Copy .Offset(322).PasteSpecial Paste:=xlPasteValues .Offset(322 * 2).PasteSpecial Paste:=xlPasteValues .Offset(322 * 3).PasteSpecial Paste:=xlPasteValues .Offset(322 * 4).PasteSpecial Paste:=xlPasteValues End With '4日の午後 With Range("B28:F47").Offset(46 * 3) .Copy .Offset(322).PasteSpecial Paste:=xlPasteValues .Offset(322 * 2).PasteSpecial Paste:=xlPasteValues .Offset(322 * 3).PasteSpecial Paste:=xlPasteValues .Offset(322 * 4).PasteSpecial Paste:=xlPasteValues End With '5日の午前 With Range("B6:F25").Offset(46 * 4) .Copy .Offset(322).PasteSpecial Paste:=xlPasteValues .Offset(322 * 2).PasteSpecial Paste:=xlPasteValues .Offset(322 * 3).PasteSpecial Paste:=xlPasteValues .Offset(322 * 4).PasteSpecial Paste:=xlPasteValues End With '5日の午後 With Range("B28:F47").Offset(46 * 4) .Copy .Offset(322).PasteSpecial Paste:=xlPasteValues .Offset(322 * 2).PasteSpecial Paste:=xlPasteValues .Offset(322 * 3).PasteSpecial Paste:=xlPasteValues .Offset(322 * 4).PasteSpecial Paste:=xlPasteValues End With '6日の午前 With Range("B6:F25").Offset(46 * 5) .Copy .Offset(322).PasteSpecial Paste:=xlPasteValues .Offset(322 * 2).PasteSpecial Paste:=xlPasteValues .Offset(322 * 3).PasteSpecial Paste:=xlPasteValues .Offset(322 * 4).PasteSpecial Paste:=xlPasteValues End With '6日の午後 With Range("B28:F47").Offset(46 * 5) .Copy .Offset(322).PasteSpecial Paste:=xlPasteValues .Offset(322 * 2).PasteSpecial Paste:=xlPasteValues .Offset(322 * 3).PasteSpecial Paste:=xlPasteValues .Offset(322 * 4).PasteSpecial Paste:=xlPasteValues End With '7日の午前 With Range("B6:F25").Offset(46 * 6) .Copy .Offset(322).PasteSpecial Paste:=xlPasteValues .Offset(322 * 2).PasteSpecial Paste:=xlPasteValues .Offset(322 * 3).PasteSpecial Paste:=xlPasteValues .Offset(322 * 4).PasteSpecial Paste:=xlPasteValues End With '7日の午後 With Range("B28:F47").Offset(46 * 6) .Copy .Offset(322).PasteSpecial Paste:=xlPasteValues .Offset(322 * 2).PasteSpecial Paste:=xlPasteValues .Offset(322 * 3).PasteSpecial Paste:=xlPasteValues .Offset(322 * 4).PasteSpecial Paste:=xlPasteValues End With End Sub (マクロの初心者) 2018/02/28(水) 22:08
Sub 値貼り付け7日用() '1日の午前 With Range("B6:F25") .Copy .Offset(322).PasteSpecial Paste:=xlPasteValues .Offset(322 * 2).PasteSpecial Paste:=xlPasteValues .Offset(322 * 3).PasteSpecial Paste:=xlPasteValues .Offset(322 * 4).PasteSpecial Paste:=xlPasteValues End With '1日の午後 With Range("B28:F47") .Copy .Offset(322).PasteSpecial Paste:=xlPasteValues .Offset(322 * 2).PasteSpecial Paste:=xlPasteValues .Offset(322 * 3).PasteSpecial Paste:=xlPasteValues .Offset(322 * 4).PasteSpecial Paste:=xlPasteValues End With '2日の午前 With Range("B6:F25").Offset(46) .Copy .Offset(322).PasteSpecial Paste:=xlPasteValues .Offset(322 * 2).PasteSpecial Paste:=xlPasteValues .Offset(322 * 3).PasteSpecial Paste:=xlPasteValues .Offset(322 * 4).PasteSpecial Paste:=xlPasteValues End With '2日の午後 With Range("B28:F47").Offset(46) .Copy .Offset(322).PasteSpecial Paste:=xlPasteValues .Offset(322 * 2).PasteSpecial Paste:=xlPasteValues .Offset(322 * 3).PasteSpecial Paste:=xlPasteValues .Offset(322 * 4).PasteSpecial Paste:=xlPasteValues End With '3日の午前 With Range("B6:F25").Offset(46 * 2) .Copy .Offset(322).PasteSpecial Paste:=xlPasteValues .Offset(322 * 2).PasteSpecial Paste:=xlPasteValues .Offset(322 * 3).PasteSpecial Paste:=xlPasteValues .Offset(322 * 4).PasteSpecial Paste:=xlPasteValues End With '3日の午後 With Range("B28:F47").Offset(46 * 2) .Copy .Offset(322).PasteSpecial Paste:=xlPasteValues .Offset(322 * 2).PasteSpecial Paste:=xlPasteValues .Offset(322 * 3).PasteSpecial Paste:=xlPasteValues .Offset(322 * 4).PasteSpecial Paste:=xlPasteValues End With '4日の午前 With Range("B6:F25").Offset(46 * 3) .Copy .Offset(322).PasteSpecial Paste:=xlPasteValues .Offset(322 * 2).PasteSpecial Paste:=xlPasteValues .Offset(322 * 3).PasteSpecial Paste:=xlPasteValues End With '4日の午後 With Range("B28:F47").Offset(46 * 3) .Copy .Offset(322).PasteSpecial Paste:=xlPasteValues .Offset(322 * 2).PasteSpecial Paste:=xlPasteValues .Offset(322 * 3).PasteSpecial Paste:=xlPasteValues End With '5日の午前 With Range("B6:F25").Offset(46 * 4) .Copy .Offset(322).PasteSpecial Paste:=xlPasteValues .Offset(322 * 2).PasteSpecial Paste:=xlPasteValues .Offset(322 * 3).PasteSpecial Paste:=xlPasteValues End With '5日の午後 With Range("B28:F47").Offset(46 * 4) .Copy .Offset(322).PasteSpecial Paste:=xlPasteValues .Offset(322 * 2).PasteSpecial Paste:=xlPasteValues .Offset(322 * 3).PasteSpecial Paste:=xlPasteValues End With '6日の午前 With Range("B6:F25").Offset(46 * 5) .Copy .Offset(322).PasteSpecial Paste:=xlPasteValues .Offset(322 * 2).PasteSpecial Paste:=xlPasteValues .Offset(322 * 3).PasteSpecial Paste:=xlPasteValues End With '6日の午後 With Range("B28:F47").Offset(46 * 5) .Copy .Offset(322).PasteSpecial Paste:=xlPasteValues .Offset(322 * 2).PasteSpecial Paste:=xlPasteValues .Offset(322 * 3).PasteSpecial Paste:=xlPasteValues End With '7日の午前 With Range("B6:F25").Offset(46 * 6) .Copy .Offset(322).PasteSpecial Paste:=xlPasteValues .Offset(322 * 2).PasteSpecial Paste:=xlPasteValues .Offset(322 * 3).PasteSpecial Paste:=xlPasteValues End With '7日の午後 With Range("B28:F47").Offset(46 * 6) .Copy .Offset(322).PasteSpecial Paste:=xlPasteValues .Offset(322 * 2).PasteSpecial Paste:=xlPasteValues .Offset(322 * 3).PasteSpecial Paste:=xlPasteValues End With End Sub (マクロの初心者) 2018/02/28(水) 22:26
確かに、そうですね。
でも、2月の場合はどうですか。1日目も、* 3 まででよいですよね。
今は、何も考えずに、* 4 まででよいです。
1日目も7日目も同じ処理にしておけば、
For〜Nextといった、繰り返し構文を使いやすいからです。
For〜Nextを使うと、7日目までのマクロでも
同じことを何行も記述する必要がなくなり
1日分+αの長さにすることが可能になります。
なので、もう少し、For〜Nextを使うための書換えを行います。
(マナ) 2018/03/01(木) 19:28
'1日の午前 With Range("B6:F25").Offset(46 * 0) --途中省略--
'2日の午前 With Range("B6:F25").Offset(46 * 1) --途中省略--
'3日の午前 With Range("B6:F25").Offset(46 * 2) --以下省略--
(マナ) 2018/03/01(木) 19:39
Sub 値貼り付け7日用() Dim i As Long
For i = 0 To 6 '午前 With Range("B6:F25").Offset(46 * i) .Copy .Offset(322).PasteSpecial Paste:=xlPasteValues .Offset(322 * 2).PasteSpecial Paste:=xlPasteValues .Offset(322 * 3).PasteSpecial Paste:=xlPasteValues .Offset(322 * 4).PasteSpecial Paste:=xlPasteValues End With '午後 With Range("B28:F47").Offset(46 * i) .Copy .Offset(322).PasteSpecial Paste:=xlPasteValues .Offset(322 * 2).PasteSpecial Paste:=xlPasteValues .Offset(322 * 3).PasteSpecial Paste:=xlPasteValues .Offset(322 * 4).PasteSpecial Paste:=xlPasteValues End With Next
End Sub
(マナ) 2018/03/01(木) 20:28
(マクロの初心者) 2018/03/02(金) 07:16
For i = 0 To 6 処理 Next
こんな構文です。
理解できますか。
大事なことなので、わからなければ言ってください。
理解できたら、ようやく最初の質問の
>日付が空欄の箇所は取り込まないというやり方が全くわからなくて、
についてです。
(マナ) 2018/03/02(金) 08:04
(マクロの初心者) 2018/03/05(月) 07:26
言い換えれば、月によって変わるのは
> .Offset(322 * 4).PasteSpecial Paste:=xlPasteValues
* 4 の場合だけですね。
'----
>日付枠は空欄となるよう関数を設定してますので
ということなので、
こんな感じで、空欄でないなら値貼り付け(PasteSpecial Paste:=xlPasteValues)
空欄なら、貼付け先のデータをクリア(ClearContents)します。
If .Cells(0, 1).Value <> "" Then
の部分が貼り付け先の一つ上(日付のセル)が空欄でないならに相当します。
Option Explicit
Sub 値貼り付け1カ月用() Dim i As Long
For i = 0 To 6 '午前 With Range("B6:F25").Offset(46 * i) .Copy .Offset(322).PasteSpecial Paste:=xlPasteValues .Offset(322 * 2).PasteSpecial Paste:=xlPasteValues .Offset(322 * 3).PasteSpecial Paste:=xlPasteValues With .Offset(322 * 4) If .Cells(0, 1).Value <> "" Then .PasteSpecial Paste:=xlPasteValues Else .ClearContents End If End With End With '午後 With Range("B28:F47").Offset(46 * i) .Copy .Offset(322).PasteSpecial Paste:=xlPasteValues .Offset(322 * 2).PasteSpecial Paste:=xlPasteValues .Offset(322 * 3).PasteSpecial Paste:=xlPasteValues With .Offset(322 * 4) If .Cells(0, 1).Value <> "" Then .PasteSpecial Paste:=xlPasteValues Else .ClearContents End If End With End With Next
End Sub
これで、期待通りの結果となるはずです。
月を変えて動作確認してみてください。
(マナ) 2018/03/05(月) 22:02
午前と午後で、ほぼ同じで、
違うのは、
With Range("B6:F25").Offset(46 * i)
と
With Range("B28:F47").Offset(46 * i)
だけです。
こういときは、共通部分を抜き出して
別のマクロにする方法が使えます。
あくまで、こんな書き方もできるというだけで
わかりやすいほうを使えばよいです。
'----
実行するのは、Sub 値貼り付け1カ月です。
Sub 値貼り付け1カ月() Dim i As Long
For i = 0 To 6 '午前 値貼り付け半日分 Range("B6:F25").Offset(46 * i) '午後 値貼り付け半日分 Range("B28:F47").Offset(46 * i) Next
End Sub
Private Sub 値貼り付け半日分(コピー範囲 As Range)
With コピー範囲 .Copy .Offset(322).PasteSpecial Paste:=xlPasteValues .Offset(322 * 2).PasteSpecial Paste:=xlPasteValues .Offset(322 * 3).PasteSpecial Paste:=xlPasteValues With .Offset(322 * 4) If .Cells(0, 1).Value <> "" Then .PasteSpecial Paste:=xlPasteValues Else .ClearContents End If End With End With
End Sub
(マナ) 2018/03/05(月) 22:14
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.