Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Microsoft 365)
セル範囲を指定しなくてもコピーできないでしょうか
投稿日時: 23/07/12 10:00:43
投稿者: takatada72

お疲れさまです。
 
VBAのコードが自分で作れないため、GPTを使って利用しております。
下記のコードでは、セルの範囲を選択した状態で、マクロを
実行すると、別ファイルの構築.xlsxに追記されるようになり
ました。
 
ただ、毎回、コピーする範囲を選択するので、そちらを簡略化
できないかと考えております。
 
範囲としては、A2からNの最終行までの範囲になります。
毎日、新しい登録アイテム数が出てくるので、日々、最終行が
異なります。
 
また、下記のコードでは、構築.xlsxのファイルを開いておかないと、
エラーになるため、手動で開いて置くのですが、手動で開かなくても
データの貼付けができるようになると嬉しいです。
 
お忙しいとは思いますが宜しくお願い致します。
 
☆★☆★☆★☆★☆★☆★☆★☆★★☆☆★☆★☆★☆★☆★☆★☆★☆★☆
' 選択範囲を取得する
Dim rng As Range
Set rng = Selection
 
 
' 選択範囲をクリップボードにコピーする
rng.Copy
 
' RT一時記録.xlsmの貼り付け場所 (初)シートに貼り付ける
Dim wb As Workbook
Workbooks.Open "\\共有\構築.xlsx"
Set wb = ActiveWorkbook
 
'Set wb = Workbooks("構築.xlsx")
Dim ws As Worksheet
Set ws = wb.Sheets("貼付")
ws.Range("A2").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
 
' データが入っていたら、最終行に追加する
If ws.Range("A2").End(xlDown).Row <> ws.Rows.Count Then
ws.Range("A2").Offset(ws.Range("A2").End(xlDown).Row, 0).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
End If

回答
投稿日時: 23/07/12 10:30:29
投稿者: WinArrow

引用:
ただ、毎回、コピーする範囲を選択するので、そちらを簡略化
できないかと考えております。

 
これもGPTにお願いしたら?

回答
投稿日時: 23/07/12 10:40:04
投稿者: sk

引用:
下記のコードでは、セルの範囲を選択した状態で、マクロを
実行すると、別ファイルの構築.xlsxに追記されるようになり
ました。
  
ただ、毎回、コピーする範囲を選択するので、そちらを簡略化
できないかと考えております。
  
範囲としては、A2からNの最終行までの範囲になります。

それがどのブックのどのワークシートに含まれるセル範囲なのか、
具体的に明記されることをお奨めします。
 
・そのマクロが記述されているモジュールを含むマクロ有効ブックにある
 特定の名前を持つワークシート
 
・そのマクロが記述されているモジュールを含むマクロ有効ブックにある
 何番目かのワークシート
 
・特定のフォルダに保存されている特定の名前を持つ
 ( 構築.xlsx でもなく、そのマクロ有効ブックでもない)
 ブックにある特定の名前を持つワークシート
 
・特定のフォルダに保存されている特定の名前を持つ
 ( 構築.xlsx でもなく、そのマクロ有効ブックでもない)
 ブックにある何番目かのワークシート
 
・ファイルダイアログによって選択された任意のブックにある
 特定の名前を持つワークシート
 
・ファイルダイアログによって選択された任意のブックにある
 何番目かのワークシート
 
・上記以外

回答
投稿日時: 23/07/12 10:44:51
投稿者: WinArrow

GPTを使う前に
マクロの記録でコードを作成してみましょう。

投稿日時: 23/07/12 14:38:34
投稿者: takatada72

WinArrowさん
ご確認をありがとうございます。
何度もGPTへ確認してみました。私がコードを理解していないため、何をどのように
修正してよいのかがわからなくこちらへ投稿させて頂きました。
※また、マクロの記録も試してみましたが、理解でてきいないため、GPTと同様になっておりました。
 
skさん
ご回答をありがとうございます。
理解ができていないため、中途半端な回答になりますが、少しでも進展したいためご指導頂けない
でしょうか
  
・そのマクロが記述されているモジュールを含むマクロ有効ブックにある
 特定の名前を持つワークシート
→構築.xlsx()には、コピーを貼り付けるだけで、マクロは、登録しておりません。
※シート名:貼付
→コピーをするデータは、Table.xlsxのPPSと言うシートにあり、マクロは、Personal
マクロからCTR+SHIFT+Lでセルを選択後にショートカットを使っています。
  
・そのマクロが記述されているモジュールを含むマクロ有効ブックにある
 何番目かのワークシート
→Personalマクロのため、どこからでも呼び出すことができます。
Table.xlsxを開いて、ショートカットキーを押してもマクロが起動している
ことは理解しております。
 
  
・特定のフォルダに保存されている特定の名前を持つ
 ( 構築.xlsx でもなく、そのマクロ有効ブックでもない)
 ブックにある特定の名前を持つワークシート
→ごめんなさい、理解ができません。もう少し分かりやすく教えてもらえないでしょうか
  
・特定のフォルダに保存されている特定の名前を持つ
 ( 構築.xlsx でもなく、そのマクロ有効ブックでもない)
 ブックにある何番目かのワークシート
→構築.xlsxには、1つしかシートはありません。(シート:貼付)
  
・ファイルダイアログによって選択された任意のブックにある
 特定の名前を持つワークシート
→ごめんなさい、何を言われているのかがわかりません。
 
・ファイルダイアログによって選択された任意のブックにある
 何番目かのワークシート
→ごめんなさい、何を言われているのかがわかりません。
 
お忙しいとは思いますが宜しくお願い致します。

回答
投稿日時: 23/07/12 14:52:16
投稿者: WinArrow

コードの件は、別にして、
 
複写する仕事を、あなたが指示されたとして、
複写元を説明しなかったら、その仕事ができると思いますか?
 
これと同じ状態で、GPTに作業依頼したのですよ。
 

回答
投稿日時: 23/07/12 17:15:16
投稿者: simple

>範囲としては、A2からNの最終行までの範囲になります。
特定の列のデータが入っている最終行が求まれば、範囲が指定できますよね。
その方法は、あなたの過去スレッドであなた自身が何度もコードを提示していますよ。
 
右サイドバーの「検索」の「詳細検索」から入って、
・キーワードを End(xlUp)
・投稿者を あなたのHN
として検索してみてください。
 
なお、こちらの質問掲示板の「即効テクニック」というコーナーには
https://www.moug.net/tech/exvba/0050088.html
という記事があります。
そちらも参考にしてください。
最終行を求めるというのは、頻出する基本的事項ですので、
どんなVBAの参考図書にも必ず出てきます。お手元に書籍はないのですか?
なければ、ぜひ購入することをお薦めします。

回答
投稿日時: 23/07/12 22:14:24
投稿者: WinArrow

引用:

VBAのコードが自分で作れない

誰が作ったものでも、コードの修正/変更は、あなたの仕事になります。
その都度、誰かに教えてもらうことができないと考えて方がよいです。
 
>Set rng = Selection
Selectionとは、
コードを実行する時点で開いているブックの最前面のシートの選択したセル範囲
というようにExcel君は解釈します。
操作ミスがあったとしても、Excel君は、消化不良を起こさない限り処理します。
意図した結果にならないこともありえます。
Sectionだけでは、結果を保証されません。
どのブックのどのシートのセル範囲を指定する方法は、選択(Select)しなくてもできます。
 
コードを1行づつ、このコードは何をしてるのか?
を理解するのは、マクロの記録が最適です。

回答
投稿日時: 23/07/13 08:28:59
投稿者: simple

こちらの記事も参考になると思います。
「最終行の取得(End,Rows.Count)」
https://excel-ubara.com/excelvba1/EXCELVBA318.html

回答
投稿日時: 23/07/13 18:02:27
投稿者: sk

引用:
コピーをするデータは、Table.xlsxのPPSと言うシートにあり、

Table.xlsx はどこに保存されているのでしょうか。
 
引用:
マクロは、PersonalマクロからCTR+SHIFT+Lでセルを選択後に
ショートカットを使っています。

・そのマクロは、個人用マクロブック( PERSONAL.xlsb )内のモジュールに記述されている。
 
・そのマクロに対し、[フィルター]コマンドと同じショットカットキーを割り当てている。
 
ということでしょうか。
 
引用:
Personalマクロのため、どこからでも呼び出すことができます。
Table.xlsxを開いて、ショートカットキーを押してもマクロが起動している
ことは理解しております。

Table.xlsx を開く操作はご自身の手でされているのでしょうか。

投稿日時: 23/07/18 16:59:36
投稿者: takatada72

皆様、お忙しい中でのご確認をありがとうございました。
 
私自身は、この所、バタバタしているのと、土日、祝日などは、
家にいるため、Excel を使うことができない状況です。
 
現状の状態を記入させて頂きますので引き続き、お時間がある時
にでもご確認頂けると幸いです。
 
投稿の内容にも、至らない点が数々あるかと思いますが、その点
についてVBAの理解度が足りないためご理解頂けると幸いです。
 
現状の状態です。
・教えて頂いたように、元データの最終行が判明したことで、マクロを実行すると、
範囲をコピーしています。
・その後、構築.xlsxのファイルがオープンされます。ただ、オープンしても、最終行に
セルを移動して、CTR+Vを行うと、データが貼り付けられる形になりました。
 
あと少しで、構築.xlsxを開いて、最終行にデータを貼り付けるだけになります。
 
お忙しいとは思いますが宜しくお願い致します。

 
 
 
最終行 = Cells(Rows.Count, 1).End(xlUp).Row
Range(Cells(2, 1), Cells(最終行, 14)).Select
Selection.Copy
 
' 選択範囲をクリップボードにコピーする
'rng.Copy
 
' RT一時記録.xlsmの貼り付け場所 (初)シートに貼り付ける
Dim wb As Workbook
Workbooks.Open "\\共有\構築.xlsx"
Set wb = ActiveWorkbook
 
'Set wb = Workbooks("構築.xlsx")
Dim ws As Worksheet
Set ws = wb.Sheets("貼付")
ws.Range("A2").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
 
' データが入っていたら、最終行に追加する
If ws.Range("A2").End(xlDown).Row <> ws.Rows.Count Then
ws.Range("A2").Offset(ws.Range("A2").End(xlDown).Row, 0).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
End If

回答
投稿日時: 23/07/18 18:07:55
投稿者: 半平太

こんなのでワークしませんか?
 

Dim 最終行 As Long
Dim src As Range
    
最終行 = Cells(Rows.Count, 1).End(xlUp).Row
Set src = Range(Cells(2, 1), Cells(最終行, 14))
    
With Workbooks.Open("\\共有\構築.xlsx").Sheets("貼付")
    src.Copy
    .Cells(.Rows.Count, "A").End(xlUp).Offset(1).PasteSpecial xlPasteValues, xlNone, False, False
End With

投稿日時: 23/07/19 09:07:50
投稿者: takatada72

半平太さん
 
早速、ありがとうございました。
 
 
下記のプログラム(構築.xlsxを開いた状態です。)を実行したところ、構築.xlsxの最終行に
データが貼り付けられておりました。
※こちらのコードだけでできるとは嬉しいです。
 
残り、自動で、構築.xlsxを開いてデータを貼り付けてから、構築.xlsxを閉じる仕様にした
いのですが、下記のコードを追加すると、構築.xlsxは、開いてくれるのですが、データは、
貼付けられませんでした。
 
何がいけないのでしょうか
Workbooks.Open ("\\共有\構築.xlsx")
     
 
お忙しいとは思いますが宜しくお願い致します。

回答
投稿日時: 23/07/19 10:03:13
投稿者: WinArrow

引用:
何がいけないのでしょうか

 
1行だけ、掲示しても、回答者には、伝わりません。
全体のコードを掲示しませんか?

回答
投稿日時: 23/07/19 10:36:20
投稿者: 半平太

言っていることがちょっと解からないですね。
 
構築.xlsxは閉じた状態からスタートしたい、じゃなかったですか?
何故、「構築.xlsxを開いた状態です。)を実行したところ」なのですか?
 
保存して閉じたいなら、
       ↓
  .Parent.Close True  '←1行挿入
>End With
 
質問内容が根本的に変わったのですか?

投稿日時: 23/07/19 13:50:02
投稿者: takatada72

私の報告の仕方が悪いせいで申し訳ありません。
自分では、全てを書いたつもりになっておりました。
半平太さんが伝授していただいたコードだけで実行してます。
 
マクロを実行すると、データをコピーして、その後、構築.xlsxが
開いていれば、書き込むコードになっていました。ただ、構築.xlsx
を開いていないと、構築.xlsxがひらくものの、データは、コピー
されませんでした。
 
そこで、私なりに、考えて、事前に構築.xlsxを開いておけば良いと
考えて下記の太字のコードを追加したのですが、そちらを追加すると、
構築.xlsxは、開くのですが、データの貼付けができなくなってしまうのです。
 
お忙しいとは思いますが宜しくお願い致します。
 
Dim 最終行 As Long
Dim src As Range
     
最終行 = Cells(Rows.Count, 1).End(xlUp).Row
Set src = Range(Cells(2, 1), Cells(最終行, 14))
Workbooks.Open ("\\共有\構築.xlsx")
     
With Workbooks.Open("\\共有\構築.xlsx").Sheets("貼付")
    src.Copy
    .Cells(.Rows.Count, "A").End(xlUp).Offset(1).PasteSpecial xlPasteValues, xlNone, False, False
End With

回答
投稿日時: 23/07/19 14:44:59
投稿者: WinArrow

太字のコードは不要です。
  
最初の

引用:

最終行 = Cells(Rows.Count, 1).End(xlUp).Row
Set src = Range(Cells(2, 1), Cells(最終行, 14))

この時点でアクテイブになっているブックとワークシートを確認してみてください。
  
意図するワークシートになっていない可能性があります。
  
Skさんのレスにある
>それがどのブックのどのワークシートに含まれるセル範囲なのか
を、無視していませんか?

投稿日時: 23/07/19 15:15:29
投稿者: takatada72

WinArrowさん
 
ご回答をありがとうございます。
 
現状では、半平太さんが教えて頂いた下記のコードのみで実行すると、
アクティブになっている、Table.xlsxのPPSシートにあるデータをコピー
して、構築.xlsxが開いていれば、構築.xlsx→貼付シートの最終行に貼り付
けられます。
※本来、構築.xlsxが閉じていても、開くようなコードなのでしょうか
※手動で、構築.xlsxを開かなくても、良いようにしたいと考えております。
 
引き続きご指導をお願い致します。
 
 
Dim 最終行 As Long
Dim src As Range
      
最終行 = Cells(Rows.Count, 1).End(xlUp).Row
Set src = Range(Cells(2, 1), Cells(最終行, 14))
Workbooks.Open ("\\共有\構築.xlsx")
      
With Workbooks.Open("\\共有\構築.xlsx").Sheets("貼付")
    src.Copy
    .Cells(.Rows.Count, "A").End(xlUp).Offset(1).PasteSpecial xlPasteValues, xlNone, False, False

回答
投稿日時: 23/07/19 16:22:27
投稿者: WinArrow

引用:

最終行 = Cells(Rows.Count, 1).End(xlUp).Row

の前に、次のコードを記述して、確認してみてください。
 
Msgbox "(1)" & Activeworkbook.Name
Msgbox "(2)" & ActiveworkSheet.Name
 
 
 

投稿日時: 23/07/19 16:25:38
投稿者: takatada72

 WinArrowさん
 
ありがとうございます。
 
追加しましたところ、下記の方だけ、定義されておりませんとエラーになりました。
これで、何がわかるものでしょうか
 
お忙しいとは思いますが宜しくお願い致します。
 
MsgBox "(2)" & ActiveworkSheet.Name

投稿日時: 23/07/19 16:34:56
投稿者: takatada72

こちらを追加して、実行すると、ファイルは、
 
(1)Table.xlsx
(2)PPS なりました。
こちらの内容から、何がわかりますか
 
宜しくお願い致します。
 
Dim ActiveworkSheet As Worksheet
Set ActiveworkSheet = ActiveSheet
 
MsgBox "(1)" & ActiveWorkbook.Name
MsgBox "(2)" & ActiveworkSheet.Name

回答
投稿日時: 23/07/19 17:33:51
投稿者: WinArrow

引用:
MsgBox "(2)" & ActiveworkSheet.Name

 
↑、申し訳ありません。
MsgBox "(2)" & ActiveSheet.Name
の間違いでした。
 
ところで
この状態でならば、
構築.xlsxに追記されていると思いますが、
そちらの結果は如何がですか?
 

回答
投稿日時: 23/07/19 18:35:49
投稿者: WinArrow

太字のコードは不要
 
いままでの説明から
"\\共有\構築.xlsx"を、人手て開いているようなきがしますが、
>With Workbooks.Open("\\共有\構築.xlsx")
で開いています。
 
それに、加えて
全くい同じ命令を実行する必要はない‥‥ということです。
 

引用:

Workbooks.Open ("\\共有\構築.xlsx")
       
With Workbooks.Open("\\共有\構築.xlsx")

 
それよりも、大事なことは
複写元となる、ブック、シートを明示することです。

投稿日時: 23/07/20 09:38:50
投稿者: takatada72

WinArrowさん
ご確認をありがとうございました。
 
下記が現在のマクロになります。マクロを実行すると、MsgBox "(1)"=Table.xlsx/
MsgBox "(2)"=PPS が表示されます。
その後、構築.xlsxが開くだけで、データは、コピーされませんでした。
 
構築.xlsxを開いた状態でマクロを実行すると、データが貼り付けられて構築.xlsxは、
閉じていました。やはり、構築.xlsxを閉じていると下記のコードは、だめなのでしょうか
 
お忙しいとは思いますが引き続きよろ
 
 
Dim 最終行 As Long
Dim src As Range
 
Dim ActiveworkSheet As Worksheet
Set ActiveworkSheet = ActiveSheet
 
 
MsgBox "(1)" & ActiveWorkbook.Name
MsgBox "(2)" & ActiveSheet.Name
 
 
最終行 = Cells(Rows.Count, 1).End(xlUp).Row
Set src = Range(Cells(2, 1), Cells(最終行, 14))
     
With Workbooks.Open("\\共有\構築.xlsx").Sheets("貼付")
    src.Copy
    .Cells(.Rows.Count, "A").End(xlUp).Offset(1).PasteSpecial xlPasteValues, xlNone, False, False
    .Parent.Close True
End With

回答
投稿日時: 23/07/20 10:18:13
投稿者: WinArrow

>"\\共有\構築.xlsx"
がなんとなく?
 
手操作で開いた"構築.xlsx"のパスを確認sるための
コードをプロシジャの先頭の記述してください。
 
Dim wbk As Workbook
 
    For Each wbk In Workbooks
        Debug.Print wbk.FullName
    Next
 
イミディエイトウインドウに表示されます。

投稿日時: 23/07/20 10:57:42
投稿者: takatada72

WinArrowさん
 
ありがとうございました。
 
コードのトップにWinArrowさんのコードを貼り付けて実行しました。
結果、下記のような表示がイミディエイトウインドウに表示されました。
「構築.xlsx」の表示は、されませんでした。「構築.xlsx」は、閉じて、マクロを
実行しております。
C:\Users\●●●●●●●\AppData\Roaming\Microsoft\Excel\XLSTART\PERSONAL.XLSB
C:\Users\●●●●●●●\Desktop\Table.xlsx
 
「構築.xlsx」を開いてマクロを実行すると、下記が表示されました。
\\共有\構築.xlsx
 
 
引き続き宜しくお願い致します。

投稿日時: 23/07/20 14:14:19
投稿者: takatada72

お疲れさまです。
 
現在、社内掲示板にもExcel の質問を受けてもらえる所がありましたので、
そちらにも投稿中です。何か判明しましたら、報告させて頂きます。
 
宜しくお願い致します。

回答
投稿日時: 23/07/20 15:17:03
投稿者: WinArrow

想定する確認事項にういて、回答頂いたので、同名のブックをダブってOPENメソッドを実行するテストしてみました。
 
テスト1(手操作)
(1)A.xlsx を開く
(2)B.xlsx を開く
(3)続けた、B.xlsx を開く・・・なんのメッセージも表示されない、
重複して開かれてはいるわけではない。
 
同名のブックを開こうとした場合、エラーになったと思っていたが、記憶違いだったかな?
 
この現象は、手操作でもマクロでも同じです。
Excel2013以降、SDIになったことと関係しているのか?
 
あとは、ステップ実行で、流れを確認しないと、原因を特定できないと考えます。
 
現状では、現場を確認することができないので、
お手上げです。
別の方のレスを待って頂くようお願いします。
 
 
 

回答
投稿日時: 23/07/20 15:22:25
投稿者: simple

特に問題なく実行できましたよ。
何か確認方法に齟齬があると思います。
ステップ実行して確認する作業を端折っている質問者さん側の責任でしょう。
 
# なお、そうした相談場所があるのであれば、今後はそちらにお願いします。
# 文章だけのやりとりでは行き違いも多いです。
# そうした場があるなら、連絡とって対面で教えてもらってください。そのほうが早いです。

投稿日時: 23/07/20 16:32:58
投稿者: takatada72

みなさま、色々とご確認頂きましてありがとうございました。
 
社内の掲示板の方も同様な感じなので、対面で確認してもらうかを考えております。
 
お忙しいところをありがとうございました。
一旦クローズさせて頂きます。