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

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

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

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

マクロ

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

Q&A

解決済

1回答

587閲覧

別ファイルのデータを転記するにあたり、1行目から最終行まで取得したいです。

pon_chan

総合スコア1

VBA

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

マクロ

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

0グッド

0クリップ

投稿2023/07/18 05:02

編集2023/07/18 05:13

実現したいこと

別ファイルのデータを転記するにあたり、1行目から最終行まで取得し転記したいです。

前提

1日分ずつのデータしか出力できないアプリを使用することになったのですが、数ヶ月分のファイルを1つ1つ開いて転記するのが大変です。
ネットで検索し複数ファイルのデータを集約し転記することができるコードを参考にさせていただいたのですが、元データの1行目(日付の記載欄があるのです)は取得できないようでして、どうしたらよいのか困っています。当方マクロ未経験のため、どうかお力を貸していただけますと幸いです。
アプリから出力されたファイルは1行目のB1のセルに日付が記載されており、B1~G1のセルが結合されています。

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

参考にさせていただいたコードのおかげで2行目~最終行の取得はできるのですが、最初の行から取得したい場合どうしたらよいのか分かりません。

該当のソースコード

Option Explicit 'プログラム1|プログラム開始 Sub GetExcelDataInFolder() 'プログラム2|シート設定 Dim ws1 As Worksheet Set ws1 = ThisWorkbook.Worksheets("Sheet1") 'プログラム3|FileSystemObjectの設定 Dim fs As FileSystemObject Set fs = New FileSystemObject 'プログラム4|対象フォルダを取得 Dim myfolder As Folder Set myfolder = fs.GetFolder(ThisWorkbook.Path) 'プログラム5|対象フォルダ内の全ファイルを処理 Dim myfile As File For Each myfile In myfolder.Files 'プログラム6|拡張子が「xlsx」のファイルのみを処理 If fs.GetExtensionName(myfile) = "xlsx" Then 'プログラム7|フォルダ内のエクセルを開いてシートを設定 Dim wb As Workbook Set wb = Workbooks.Open(Filename:=myfile) Dim ws2 As Worksheet Set ws2 = wb.Worksheets(1) 'プログラム8|開いたエクセルの最終行を取得 Dim cmax As Long cmax = ws2.Range("BH65536").End(xlUp).Row Debug.Print myfile.Name & "のcmax=" & cmax 'プログラム9|開いたエクセルのデータを転記 Dim i As Long For i = 1 To cmax Dim cmax1 As Long cmax1 = ws1.Range("BH65536").End(xlUp).Row ws1.Range("A" & cmax1 + 1 & ":BH" & cmax1 + 1).Value = ws2.Range("A" & i & ":BH" & i).Value Next 'プログラム10|エクセルを閉じる wb.Close 'プログラム11|オブジェクト解放 Set ws2 = Nothing Set wb = Nothing End If Next 'プログラム12|エクセルを保存 ThisWorkbook.Save 'プログラム13|オブジェクト解放 Set myfolder = Nothing Set fs = Nothing 'プログラム14|プログラム終了 End Sub

試したこと

プログラム9内の「+ 1」を「- 1」に変更したところマクロ実行時に1行目を取得している瞬間を目撃しましたがその後その後うまく転記されず・・・お手上げです。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

pon_chan

2023/07/18 06:26 編集

「こちらの質問が他のユーザーから「意図的に内容が抹消された質問」という指摘を受けました。」とあるのですが質問内容の編集はおこなっていません。
bebebe_

2023/07/18 06:52 編集

確認ですがコピー先のシートが空白の時に実行した時、1行目が空白で2行目からそのままコピーされてはいないですか?
pon_chan

2023/07/18 07:00

ご確認ありがとうございます・・・!1行目が空白で2行目からそのままコピーされました!
bebebe_

2023/07/18 07:08

となるとコピー自体は問題なくて1行目が空白になるのをどうにかしたいということですか? それとコピー元のほうでBH列に空白がある場合はないですか?
pon_chan

2023/07/18 07:21

BH列の1行目に空白が!ありました! "BH65536"を他の列に変更したら1行目から取得してくれました!!!!! 空白の行は取得してくれないということだったのでしょうか・・・!? bebebe_さんのおかげで助かりました!!!本当にありがとうございます・・・!
bebebe_

2023/07/18 07:56 編集

最終行を取得する「ws2.Range("BH65536").End(xlUp).Row」ですがBH65536のセルを選択した状態で「Ctrl」と「↑」キーを押して止まったセルの行番号を取得するという意味になります。 今回の場合はプログラム9の部分で1回目のコピーでBH65536セルからCtrl+↑をした行(1行目)+1の2行目にコピーした後、2回目のコピーでコピー先のBH65536セルからCtrl+↑をしたセルが空白のなのでまた1行目を取得してしまい+1した2行目に上書きでコピーしてしまってます。 なのでプログラム8と9の「Range("BH65536").End(xlUp).Row」の部分は空白にならない列を指定する必要があります。 うまく説明するのが難しいですがよくわからない場合はコードを入力している画面でF8(ステップイン)を押すと押すたびに1行ずつコードを実行するのでどこで動作がおかしくなるか確認するとわかるかもしれません。
pon_chan

2023/07/18 08:01

なるほど・・・!やっと納得できました、とても分かりやすい解説をありがとうございます! この質問を解決済みにするため、お手すきの際に回答欄への記入をお願いできますでしょうか?(bebebe_ さんのご助言あってこそなので自己解決の欄に書くべきではないと思いまして・・・!)
guest

回答1

0

ベストアンサー

最終行の取得でBH列に空白がある場合は空白になることがない列を指定する必要があります。

投稿2023/07/18 08:11

bebebe_

総合スコア520

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

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

pon_chan

2023/07/18 23:02

分かりやすくご説明いただき助かりました、ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問