プロが教える店舗&オフィスのセキュリティ対策術

エクセルVBAを始めたばかりの初心者です。
何処が悪くてエラーになるのか解りません。誰かわかりやすく教えてもらえないでしょうか?
Private Sub CommandButton2_Click()
Dim i As Long
i = 10
If Worksheets(”日報18-23”).Cells(i, 29) <> ”重複” Then
Else
Workbooks("日報DBの移行2").Worksheets("日報18-23").Range(Cells(i, 1), Cells(i, 25)).Copy _
Workbooks("日報DBの移行2").Worksheets("重複データ").Range(Cells(i, 1))
End If

End Sub

質問者からの補足コメント

  • 1.日報DBの移行2.xlsm
    2.(”日報18-23”).(”重複データ”)の2つのシートは同じブック(”日報DBの移行2.xlsm”)内にあります。
    3.マクロのコードは、「日報DBの移行2」内の「重複データ」に書いてあります。
    コマンドボタンは、重複データのワークシート上にあります。

    こんな感じで伝わりますか・・?
    よろしくお願いします。

    No.2の回答に寄せられた補足コメントです。 補足日時:2023/06/13 18:21

A 回答 (4件)

No1です。



>ブックの拡張子を書いてみましたが、変わりませんでした。
複数の間違いが含まれていますので、そのうちの一部だけを修正しても、エラーを全部無くさなければ動作はしません。
(別のところでエラーが発生しますので)

>3.マクロのコードは、「日報DBの移行2」内の「重複データ」に書いてあります。
ブックもシートもマクロを記載しているブック内で完結しているのなら、ブックの指定を省略しても大丈夫です。
デフォルトがそのブックになりますので。
(もちろん、ブックの指定から記述しても問題はありませんけれど・・)


>Workbooks("日報DBの移行2").Worksheets("日報18-23").Range(Cells(i, 1), Cells(i, 25)).Copy _
>Workbooks("日報DBの移行2").Worksheets("重複データ").Range(Cells(i, 1))

の部分を、以下のように修正すれば、動作するものと推測します。

 Worksheets("日報18-23").Cells(i, 1).Resize(,25).Copy _
 Worksheets("重複データ").Cells(i, 1)

※ 余談ですが、ご提示の内容に限って言うならば、変数 i の値は10で固定のようですので、必ずしも変数化する必要もなさそうですけれど・・
    • good
    • 0
この回答へのお礼

上記のコードで無時動くようになりました。
別のワークシートとのやり取りで複数セルを変数を使って行うとエラーが出る事が解りました。Range、cellsの使い方を詳しく勉強してみます。Resize使いやすそうです。
何日も迷走してましたが、出口に近づきました。
ありがとうございました。

お礼日時:2023/06/14 05:08

補足ありがとうございました。


>マクロのコードは、「日報DBの移行2」内の「重複データ」に書いてあります。

1.マクロのあるブック内での処理なので、ブック名は不要になります。
2.rangeを指定する場合、range(cells(i,1),cells(i,25))のように書いてはいけません。worksheets("Worksheets("日報18-23").cells(i,1)のようにワークシートで修飾する必要があります。
但し、range("A10:Y10")のように書く場合は、ワークシートの修飾は不要です。

これを踏まえて、以下のようになります。
1案
Private Sub CommandButton2_Click()
Dim i As Long
Dim ws1 As Worksheet
Dim ws2 As Worksheet
Set ws1 = Worksheets("日報18-23")
Set ws2 = Worksheets("重複データ")
i = 10
If ws1.Cells(i, 29) <> "重複" Then
Else
ws1.Range(ws1.Cells(i, 1), ws1.Cells(i, 25)).Copy _
ws2.Range(ws2.Cells(i, 1), ws2.Cells(i, 25))
End If
End Sub

2案
Private Sub CommandButton2_Click2()
Dim i As Long
i = 10
If Worksheets("日報18-23").Cells(i, 29) <> "重複" Then
Else
Worksheets("日報18-23").Range("A" & i & ":Y" & i).Copy _
Worksheets("重複データ").Range("A" & i & ":Y" & i)
End If
End Sub

どちらでも、望んだ結果が得られます。
好きな方を採用してください。
コピーする範囲の列(今回はA~Y)が、予め決まっているなら2案の方が簡単です。2案はrange(○○)の○○が"A1:Y10"になるように文字列を作り上げています。
コピーする範囲の列が可変の場合は、1案のほうが簡単です。
    • good
    • 0
この回答へのお礼

1案。2案のどちらでも無事に動きました。セル範囲の指定にもいろいろあるのですね。そのときどきに合わせて、エラーが出ないように使い分けられ
る様に覚えておきたいです。まだまだ勉強・・・です。
ありがとうございました。

お礼日時:2023/06/14 05:13

補足要求です。


いろいろと不明な点があるので、確認です。
1.「日報DBの移行2」のブックですが、拡張子は何でしょうか。
.xlsx、 .xls、 .xlsm 等が考えられますが、どれでしょうか。
拡張子まで含めて指定しないとエラーになります。

2.下記の
If Worksheets(”日報18-23”).Cells(i, 29) <> ”重複” Then
の”日報18-23”のシートは、「日報DBの移行2」のブック内のシートですか。
それとも他のブック内のシートでしょうか。

3.マクロは、「日報DBの移行2」内にあるのですか。
それとも、他のブック内にあるのでしょうか。
この回答への補足あり
    • good
    • 0

こんばんは



エラーの際には、エラーの発生個所とエラーの内容が表示されると思いますが、それらは両方とも解決への大きな手掛かりになります。
また、エラー発生時にVBE上で、変数などにカーソルを置くと、その値が表示される機能や、イミディエイトウインドウやウォッチ式なども活用なさると自力解決への近道になると思います。

ご提示のコードの場合、以下の2点が気になります。
・ブック名を名称のみにしていますが、拡張子付きの名称が必要と思われます。
 あるいは、マクロの記述してあるブックでの処理であるなら、ThisWorkbookとするか、
 ブックオブジェクトの記述を省略することも可能です。

・COPY先のRange指定が
>Workbooks("日報DBの移行2").Worksheets("日報18-23").Range(Cells(i, 1), Cells(i, 25))
>Workbooks("日報DBの移行2").Worksheets("重複データ").Range(Cells(i, 1))
となっていますが、ブック名に関しては上述の通り。
Rangeで指定する場合は
 Range("A10") のような方法か
 Cells(10, 1) のように指定します。(数値部分は変数でも可です)
ご提示の
>Range(Cells(i, 1))
の場合は、二つのミスがあります。
一つ目は、Rangeの指定方法は
 Range(Cells(a, b), Cells(c, d))
とすべきで、セル範囲を指定する方法になります。
1セルだけを指定したければ、上記のような方法で事足ります。

二つ目は、
 Range(Cells(a, b), Cells(c, d))
とした場合の、Cells(a, b)等はアクティブシートのセル指定となりますので、Rangeで指定しているブック、シートとアクティブシートが異なる場合にはエラーになります。
「Cells(a, b)」 の記述はブック、シートが省略されているものと判断されて、デフォルトのアクティブシートのセルだと解釈されます。
(たまたま、アクティブシートと一致していればエラーは発生しませんけれど・・)
    • good
    • 0
この回答へのお礼

イミディエイトウインドウやウォッチなど、エラーを探すためのツールがあるのですね。いろいろ試して勉強したみたいと思います。
ブックの拡張子を書いてみましたが、変わりませんでした。
アクティブシートについてもう少し調べて、頑張ってみます。
ありがとうございました。

お礼日時:2023/06/13 18:27

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!