🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
VBA

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

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Q&A

3回答

4349閲覧

特定の行をスキップしながらIf構文

退会済みユーザー

退会済みユーザー

総合スコア0

VBA

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

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

0グッド

1クリップ

投稿2019/09/28 16:21

前提・実現したいこと

[日付を参照したい]
あらかじめ1〜30日まで日付が挿入された請求書シートに、
別シートの複数データを該当の日付と同じ行にコピーするマクロを作成したいです。

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

いまの私の作成したIf構文を使用したVBAコードでは上から順に詰めてコピーされ、
1日目から順にあらかじめ振られた日付を無視して貼り付けられてしまいます。
日付を参照してコピーをすることで、データのない日は空欄のままにしたいです。

※VBA初心者です。

エラーメッセージ

該当のソースコード

VBA

1Sub 会社ごとの受注データを請求書へ() 2 3 '請求書のタイトル行を取得する 4 Dim r As Integer 5 r = Worksheets("請求書").Range("B17").Row 6 7 '請求書へ受注データを書き写す 8 Dim LastRow As Integer 9 LastRow = Worksheets("受注一覧").Cells(Rows.Count, 2).End(xlUp).Row 10 11 Dim i As Integer 12 For i = 2 To LastRow 13 14 If Worksheets("請求書").Range("B5").Value = _ 15 Worksheets("受注一覧").Range("B" & i).Value Then 16 r = r + 1 17 18 '日付 A2 - B18 19 Worksheets("請求書").Range("B" & r).Value = _ 20 Worksheets("受注一覧").Range("A" & i).Value 21 '商品 C2 - C18 22 Worksheets("請求書").Range("C" & r).Value = _ 23 Worksheets("受注一覧").Range("C" & i).Value 24 '単価 D2 - E18 25 Worksheets("請求書").Range("E" & r).Value = _ 26 Worksheets("受注一覧").Range("D" & i).Value 27 '個数 E2 - F18 28 Worksheets("請求書").Range("F" & r).Value = _ 29 Worksheets("受注一覧").Range("E" & i).Value 30 '料金 G2 - H18 31 Worksheets("請求書").Range("H" & r).Value = _ 32 Worksheets("受注一覧").Range("G" & i).Value 33 End If 34 Next i 35End Sub

試したこと

And構文をIf構文へ追加しようとしましたが、いまいちどう書けばよいかわかりません。

Microsoft Excel for Mac 16.28 (最新版)

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

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

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

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

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

meg_

2019/09/29 01:21

「If Worksheets("請求書").Range("B5").Value = _」で「B5」のセルが固定されていますが、ここは問題ないですか?
guest

回答3

0

あらかじめ1〜30日まで日付が挿入された請求書シートに、
別シートの複数データを該当の日付と同じ行にコピーする

Worksheets("請求書").Range("A18")が1日で、
そこから下に2日、3日と続くんですよね?
ならば、探さなくても
30日ならば、

Worksheets("請求書").Range("B18").Cells(30,1)
が、
30日のセルになります。

同じようにRangeプロパティでも相対位置が示せます。

Worksheets("受注一覧").Range("G1").Range("B1")

変数を上手く使いながら、セルの位置をこんな感じで示せれば、
すっきり読めるコードになるのではないでしょうか?

ExcelVBA

1Sub test() 2 Dim rngTable As Range '請求書転記基準セル 3 Dim rngList As Range '受注一覧データセル範囲 4 Dim r As Range 'セル範囲中の各行 5 Dim ix As Long '相対の行数(=日付) 6 7 'セル範囲の定義 8 Set rngTable = Worksheets("請求書").Range("B18").Resize(31, 8) 9 Set rngList = Worksheets("受注一覧").Range("A1").CurrentRegion 10 'セル範囲からタイトル行を除く 11 Set rngList = rngList.Resize(rngList.Rows.Count - 1).Offset(1) 12 13 '一覧セル範囲を行毎に繰り返し 14 For Each r In rngList.Rows 15 ix = Day(r.Cells(2).Value) 16 rngTable.Cells(ix, "B").Value = r.Range("A1").Value '日付 17 rngTable.Cells(ix, "C").Value = r.Range("C1").Value '商品 18 rngTable.Cells(ix, "E").Value = r.Range("D1").Value '単価 19 rngTable.Cells(ix, "F").Value = r.Range("E1").Value '個数 20 rngTable.Cells(ix, "H").Value = r.Range("G1").Value '料金 21 Next 22End Sub

投稿2019/09/29 23:49

mattuwan

総合スコア2163

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

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

0

以下サイトにIF構文の事例がたくさんありますので参考にしてみてください。

エクセルマクロVBAのIF文を20事例で解説|複数条件(and or)からelse not elseif likeの使い方まで

投稿2019/09/29 00:54

TanakaHiroaki

総合スコア1063

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

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

0

B列に日付が入力されているということですね。
昇順になっているならMatch、そうでないならFindメソッドで検索して、一致した行に代入するという処理にしてください。

【ExcelVBA入門】MATCH関数を使ったセル範囲を検索する方法を徹底解説! | 侍エンジニア塾ブログ(Samurai Blog) - プログラミング入門者向けサイト

Office TANAKA - セルの操作[セルの検索]

投稿2019/09/29 00:50

hatena19

総合スコア34073

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問