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

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

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

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

マクロ

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

Q&A

解決済

3回答

1807閲覧

VBA 転記前の初期化

kohan

総合スコア9

VBA

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

マクロ

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

0グッド

0クリップ

投稿2020/10/12 04:21

連投になってもうしわけないのですが、もう少しで思ったように動きそうです。初心者ながら、的確なアドバイスがあってこそです。感謝申し上げます。
リストビューの項目を転記することができました。ここから、
リストビューの内容をワークシートに転記→修正があれば、前のものを削除して→転記としたいのですが```、削除ボタンを挟むと確かに動きますが、
これを一度のボタン操作で、削除→再転記としたいのですが、速攻で転記削除になってしまいます、、

Private

1 2Dim ws As Worksheet 3 4 Dim rng As Range 5 6 Dim a As String 7 8 9 Set ws = Worksheets("送迎表") 10 11 a = ComboBox2 12 13 With ListView1 14 15 Dim i As Long 16 17 For i = 1 To .ListItems.Count 18 19 20 If a = ws.Range("B3") Then 21 22 23 ws.Range("B4").Resize(10, 30).Delete ←ここなのですが、、 24 25 ws.Range("B3").Offset(i, 0) = .ListItems.Item(i).Text 26 27 ws.Range("C3").Offset(i, 0) = .ListItems.Item(i).SubItems(1) 28 29 30 End with 31End If 32End sub 33ws.Range("B4").Resize(10, 30) <>” ” 34とか、<>Notihg 35としてもエラーになります、セルに数字や文字があれば削除としたいのですが、、 36よろしくご回答お願いいたします。 37 38 それと、別建て項目にあるかもしれませんが、withがあるのに、Withがないとか、Forがあるのに、ないとか、End Ifがないとか、、そういう場合って何が違うのでしょうか、、あるのに、、みたいなことがよくあるのですが、、

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

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

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

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

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

radames1000

2020/10/12 04:42

今回はEnd WithとEnd Ifが逆になってますよ。
kohan

2020/10/12 06:17

ご回答ありがとうございます。順番があるのですね、、
guest

回答3

0

ベストアンサー

まず、提示のコードではコンパイルエラーで実行すらできないはずですが。
コンパイルが通るように修正しましょう。

withがあるのに、Withがないとか、Forがあるのに、ないとか、End Ifがないとか、、そういう場合って何が違うのでしょうか、、あるのに、、みたいなことがよくあるのですが、、

提示のコードだと、下記の2点ですね。

With と End With, If と End If の入れ子関係がおかしい。

For に対応する Next がない。

コード書く時にインデントをきちんと入れるというのは重要です。
それができていると上記のようなミスは防げます。

VBA入門記事 インデント徹底解説! - t-hom’s diary

現状のコード(インデントに関係あるものだけにしてます。)

vba

1Private Sub CommandButton4_Click() 2 3With ws.Range("B3") 4 5For i = 1 To .ListItems.Count 6 7If a = ws.Range("B3") Then 8 9'略 10 11End With 12End If 13 14End Sub

インデントを入れるとそれぞれのブロックの始まりと終わりの対応がおかしいのに気がつきませんか。

vba

1Private Sub CommandButton4_Click() 2 3 With ws.Range("B3") 4 5 For i = 1 To .ListItems.Count 6 7 If a = ws.Range("B3") Then 8 9 '略 10 11 End With 12 End If 13 14End Sub

下記のようにブロックの始まりと終わりの位置が同じになるように記述するとこのようなミスが防げます。

vba

1Private Sub CommandButton4_Click() 2 3 With ws.Range("B3") 4 For i = 1 To .ListItems.Count 5 6 If a = ws.Range("B3") Then 7 8 '略 9 10 End If 11 Next 12 End With 13End Sub

まずは、この修正をしてください。

あとは、「前のものを削除して」の部分は、コンパイルが通るコードを書いてから、どこで削除すればいいのかよく考えてみましょう。

投稿2020/10/12 04:59

hatena19

総合スコア34075

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

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

kohan

2020/10/12 06:14

適切なアドバイスを頂きまして、まことにありがとうございます。 自己解決ではないですが、ほかにかけるところがなさそういなので、修正して動いたものを掲載させていただきました。  ありがとうございました。  きれいに整理すると、違っているところ、、というか、きっちりと順番にForやNextを対応さるということさえ知らなった、、という状態です。  今後ともご教授いただけるようよろしくお願い申し上げます。
guest

0

追加してから、元のデータを削除すれば良いのでは。

withがあるのに、Withがないとか、Forがあるのに、ないとか、End Ifがないとか、、そういう場合って何が違うのでしょうか

コンパイルエラーの事ですよね。
コンパイルのエラーについては、あまり嘘は吐きませんので、ネストで良く分からなくなって、Endの箇所が正しくなかったりしているんでしょう。

投稿2020/10/12 04:40

sazi

総合スコア25327

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

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

kohan

2020/10/12 06:15

ありがとうございます、そのとおりでございます、きれいに書くように心がけます。こういうところで躓くんですね、、順番があることもしらなかったです、、
sazi

2020/10/12 07:23

ひょっとして、ブレークポイントを設定してのデバッグの方法も知らなかったりしますか?
kohan

2020/10/13 06:11

はい。そのとおりです、、
guest

0

自己解決というわけではなく、このようにアドバイスをいただいて修正しましたということを記載させていただきました。
転記が始まる前に削除の一文を入れると動作しました。
ご指摘いただいたとおり、整理すると分かることもある、、というか、振り返ると、こういうのは多々ありました、、。

 お恥ずかしい限りです。まだきれいにとはなりませんが、もっとわかりやすいことを心がけます、。

あともう少しで、完成です。

Private

1 2 Dim ws As Worksheet 3 4 Dim rng As Range 5 6 Dim a As String 7 8 Dim i As Long 9 10 Set ws = Worksheets("送迎表") 11 12 a = ComboBox2 13 14 ws.Range("B4").Resize(10, 30).Delete 15 16 With ws.Range("B3") 17 18 19 20 For i = 1 To ListView1.ListItems.Count 21 22 23 If a = ws.Range("B3") Then 24 25 26 .Offset(i, 0) = ListView1.ListItems.Item(i).Text 27 28 .Offset(i, 1) = ListView1.ListItems.Item(i).SubItems(1) 29 30 31 32 End If 33 34 Next i 35 36 37 End With 38 39 40End Subここに言語を入力 41コード

投稿2020/10/12 06:09

kohan

総合スコア9

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

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

hatena19

2020/10/12 07:20

ちょっと無駄なインデントになってますね。 インデントの仕方にも人ぞれぞれで微妙にくせがありますが、ここの回答者さんのコードや、WEBのサンプルコード、MS公式のサンプルコードなどをみて、インデントの標準的な仕方を覚えるといいでしょう。 あと、 ws.Range("B4").Resize(10, 30).Delete の部分ですが、 Deleteではなく、Clear か ClearContents がいいでしょう。違いは検索して調べてみてください。 あと、 Resize(10, 30) とサイズを決め打ちせずに、データのある範囲を削除するというコードにした方がいいでしょう。 ws.Range("B4").CurrentRegion.Offset(1).ClearContents
kohan

2020/10/12 10:45

ご教授いただきまして、ありがとうございます。 美しい書き方には程遠いですが、意識するようにいたします。  更には、適切なメソッドやコードまでいただき、感謝いたします。 今後ともよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問