質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

Q&A

解決済

3回答

845閲覧

Excel マクロ オフセット 変数

stkaz

総合スコア1

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

0グッド

0クリップ

投稿2020/11/12 08:50

編集2020/11/12 10:22

前提・実現したいこと

基礎的なExcelマクロでの質問です。
下記マクロで変数の定義が原因かオフセットがうまくいかず、
ループでのデータ貼り付けがうまくいきません。

実現したいこと
「d3」(例:10)になるまで「f3」を1ずつ足していき(例:10)になったら終了
その間「f3」の値の「B15:b16」をコピー、貼り付けし、次の下の行に改行し再度貼り付け

発生している問題・エラーメッセージ

Sub test1() Dim a As Worksheet Dim b As String Set ws = Worksheets("sheet1") b = (ws.Range("f3") - 1) * 2 Do Until ws.Range("f3") = ws.Range("d3") ws.Range("B15:b16").Copy Worksheets("マクロ用書き出し").Range("a9:a10").Offset(b).PasteSpecial Paste:=xlPasteValues ws.Range("f3") = ws.Range("f3") + 1 Loop End Sub

補足情報(FW/ツールのバージョンなど)

windows10,Excel(Office 365)追記サンプル1
追記サンプル2

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

あなたのマクロをできるだけ生かすようにしました。
こういうことでしょうか。

VBA

1Sub test1() 2 3 Dim ws As Worksheet 4 Dim b As Long 5 6 Set ws = Worksheets("sheet1") 7 b = (ws.Range("f3") - 1) * 2 8 Do 9 If ws.Range("f3") > ws.Range("d3") Then Exit Do 10 ws.Range("B15:b16").Copy 11 Worksheets("マクロ用書き出し").Range("a9:a10").Offset(b).PasteSpecial Paste:=xlPasteValues 12 If ws.Range("f3") = ws.Range("d3") Then Exit Do 13 ws.Range("f3") = ws.Range("f3") + 1 14 b = b + 2 15 Loop 16 17End Sub 18

投稿2020/11/12 11:32

tatsu99

総合スコア5438

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

stkaz

2020/11/12 11:50 編集

回答ありがとうございます。 あなたのマクロが理想のマクロです! ご教授ありがとうございました。 ベストアンサーとさせて頂きます。
guest

0

こういうことかな?

ExcelVBA

1Sub test001() 2 Dim ws As Worksheet 3 Dim b As Long 4 5 Set ws = Worksheets("Sheet1") 6 7 ws.Range("B15:B16").Copy 8 Do 9 Worksheets("マクロ用書き出し").Range("A9:A10").Offset(b).PasteSpecial Paste:=xlPasteValues 10 b = b + 2 11 Loop Until ws.Range("F3").Value + b > ws.Range("D3") 12 Application.CutCopyMode = False 13End Sub

ループしなくても貼り付け範囲を拡張したらいいかも?

ExcelVBA

1Sub test002() 2 Dim i As Long 3 4 With Worksheets("Sheet1") 5 i = .Range("D3").Value - .Range("F3").Value 6 .Range("B15:B16").Copy Worksheets("マクロ用書き出し").Range("A9:A10").Resize(i * 2) 7 End With 8End Sub

※こんな感じかなぁというイメージです。
動作確認は行ってません。細かい計算など修正願います。


画像見ました。

僕ならこんな感じで書きます。(いろんな書き方があります)

ExcelVBA

1Sub test003() 2 Dim rngFrom As Range 3 Dim rngTo As Range 4 Dim c As Range 5 Dim ixMin As Long 6 Dim ixMax As Long 7 Dim ix As Long 8 9 With Worksheets("Sheet1").Range("C5").CurrentRegion 10 Set rngFrom = Intersect(.Cells, .Offset(1), .Columns(2)) 11 ixMin = .Worksheet.Range("F3").Value 12 ixMax = .Worksheet.Range("D3").Value 13 End With 14 Set rngFrom = Application.Range(rngFrom(ixMin), rngFrom(ixMax)) 15 Set rngTo = Worksheets("マクロ用書き出し").Range("A9") 16 17 ix = 1 18 For Each c In rngFrom 19 c.Copy rngTo(ix, 1) 20 ix = ix + 2 21 Next 22End Sub

投稿2020/11/12 10:40

編集2020/11/12 11:01
mattuwan

総合スコア2136

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

stkaz

2020/11/12 11:50

ご回答ありがとうございます。 今回のものでは試したところうまく作動が出来ず、 加工、修正してもうまく動作が行えませんでした。 他の方からいただいた回答で何とか、解決案を出せそうです。 今回回答頂いたものは他の作成時に参考にさせて頂きます。 ありがとうございました。
guest

0

Dim a As Worksheet
Dim b As String

Dim ws As Worksheet
Dim b As Long
に定義しなおしてください。

なにをなさりたいのかがよくわかりません。
実行前のSheet1の内容と
実行後の期待する結果の「マクロ用書き出し」の内容を添付図のようにして提示してください。
イメージ説明
イメージ説明

投稿2020/11/12 09:54

tatsu99

総合スコア5438

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

stkaz

2020/11/12 10:25

回答ありがとうございます。 理想とするマクロ結果を画像にて追記しました。 もしよろしければご教示願います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問