下記に記載しているものは、開いているエクセルファイル"X"に記載している文字(B列("B2"から記載)に対して、該当する"O"フォルダ内の複数のエクセルファイルを開き、書き込み(ファイルXに記載している事項)をして閉じるPROGRAM(B列記載の文字列を繰り返しで全て処理)なのですが、一番上に記載している文字のもの以外は一度の処理で終わるのですが、一番上の文字のものは何度も同じ処理を繰り返す(最初は書き込みされるが、次は書き込みが空欄で上書きされる)状態で、原因が分かりません。非常に分かりにくいかもしれませんが、もし分かれば、ご教授願えないでしょうか?(当方VBA初心者の為、分かりにくくて申し訳ありません。またおかしい構文があれば、教えて頂けると助かります。
Sub 書き込み()
Dim myPath As String
Dim myFile As String
Dim myFiles As String
Dim 書き込み1 As String
Dim 書き込み2 As String
Dim Number As Integer
Dim Column As Integer
myPath = "C:\O\"
Column = Range("B2").CurrentRegion.Rows.Count
For Number = 2 To Column
myFile = Cells(Number, 2)
書き込み1 = Cells(Number, 1)
書き込み2= Cells(Number, 3)
myFiles = Dir(myPath & myFile & "*.xls*")
If Dir(myPath & myFile & "*.xls*") <> "" Then
Workbooks.Open myPath & myFiles
ActiveSheet.Range("H8") = 書き込み1
ActiveSheet.Range("J4") = 書き込み2
Worksheets.Select
ActiveWorkbook.Close True
Else
MsgBox "処理を中断しました"
Exit For
End If
Next
Complete = MsgBox("処理が完了しました。", vbOKOnly + vbInformation, "確認")
ThisWorkbook.Close SaveChanges:=False
End Sub
No.1
- 回答日時:
> Column = Range("B2").CurrentRegion.Rows.Count
↓ 以下に変更してどうなりますか
Column = Range("B2").End(xlDown).Row
また、
If Dir(myPath & myFile & "*.xls*") <> "" Then
↓
If myFiles <> "" Then
動き)
C:\O\ に *.xls* ファイルが1つ以上あった際、
もし For Number = 2 To Column が余計に回った/空白があった場合
myFile は空白、その空白のままに
myFiles = Dir(myPath & myFile & "*.xls*")
すると C:\O\*.xls* が対象になるので、何かがヒットする
また、If Dir(myPath & myFile & "*.xls*") <> "" Then
の判別は意味が無い(気分的には、したつもり)
B列の空白を処理しない様に見直す
・余計なループをしない様にする
・空白ならスキップする様にする
等の変更が必要と思います。
回答ありがとうございます。
上手く起動しました。
ちなみに
"CurrentRegion.Rows.Count"と"End(xlDown).Row"の違いってどういうところなのでしょうか??
No.2
- 回答日時:
こんにちは。
>一番上の文字のものは何度も同じ処理を繰り返す(最初は書き込みされるが、次は書き込みが空欄で上書きされる)状態で、
これがよく分からないです。一番上というのは、B2のことを指しているのでしょうか?
コード自体よりも、B列のセルの内容次第だと思います。
コード自体では、細かいミスはあっても、それで、誤動作するというところまでは至っていません。
>myFile = Cells(Number, 2)
>書き込み1 = Cells(Number, 1)
>書き込み2= Cells(Number, 3)
これをみると、B列の2行目からの行のA列,B列が対応して書き込まれるというのは分かります。
そして、B列に入っているのは、ファイルベース名です。
例えば、枝番があるような場合は、かなりいい加減になってしまいます。
(こういう書き方ではダメ)
Excel B列 実際のファイル名
Test-1 Test-1-1a
Test-1-1 Test-1-1b
または、これもダメ
Test-1-1
Test-1-1
>myFiles = Dir(myPath & myFile & "*.xls*")
#1さんとは違った意味で、こういう「*」を使ったワイルドカードは無理があります。
決まったものは、予め実際のファイル名を取得して、ExcelのB列に貼り付けた方がよいです。
もちろん、Dir 関数をループして探す方法もあるのですが、こういう場合、ファイル名と書き込み内容が決められたものなら、ズバリ、B列は実際のファイル名の方がよいと思います。枝番があるものは、同じにするということもできますが、ややこしいように思います。
なお、
>Column = Range("B2").CurrentRegion.Rows.Count
>For Number = 2 To Column
Columnは、プロパティ名ですから、使わないほうがよいです。それに、カウントしているものは、Row( 行)です。For Number =2 は、行数ですから、To [終了値] は、長さではなく、行数でなくてはいけません。
例えば
Rw = Range("B2").CurrentRegion.Rows.Count + 1
For Number = 2 To Rw
Worksheets.Select 全部のシートを選択する意味がよく分かりません。
ざっと見たところ、このようなことが思い当たります。
回答ありがとうございます。
Rw = Range("B2").CurrentRegion.Rows.Count + 1
の+1の意味を教えて頂けないでしょうか?
Worksheets.Selectはこちらの都合で選択して保存をしております。
No.3
- 回答日時:
#1です
> "CurrentRegion.Rows.Count"と"End(xlDown).Row"の違いって・・・
CurrentRegion の動きは理解していますか?
以下、★★ 部分は未入力状態を表現し、A1 からの表示と仮定します
★★ ★★ ★★ D1 ★★
A2 B2 ★★ D2 ★★
★★ B3 C3 D3 ★★
A4 B4 C4 ★★ ★★
A5 ★★ C5 ★★ ★★
A6 ★★ ★★ ★★ ★★
★★ ★★ ★★ ★★ ★★
この時、B2 を指定した Range("B2").CurrentRegion 範囲、
Rows.Count / Columns.Count はどうなるのでしょう?
Public Sub test()
With Range("B2").CurrentRegion
Debug.Print .Rows.Count
Debug.Print .Columns.Count
End With
End Sub
これで確認してみると、イミディエイトウィンドウへの表示は
6
4
となります
この時の Range("B2").End(xlDown).Row は、4 ですね。
少なくとも空白セルは排除できるかと。
( B3 以降・・・B4,B5 ・・・空白なら、全く変な動きになると思います)
CurrentRegion の状況がわからない状態で +1 は無いと思います。
※ 行数と行位置を勘違いしない様に
上記パターンで D1 が未入力だった以下の場合
★★ ★★ ★★ ★★ ★★
A2 B2 ★★ D2 ★★
★★ B3 C3 D3 ★★
A4 B4 C4 ★★ ★★
A5 ★★ C5 ★★ ★★
A6 ★★ ★★ ★★ ★★
★★ ★★ ★★ ★★ ★★
Range("B2").CurrentRegion の Rows.Count / Columns.Count は
5
4
となります。
※
> 一番上に記載している文字のもの以外は
これは、タマタマ Dir("C:\O\*.xls*") した結果が一致しただけだと思います
No.4ベストアンサー
- 回答日時:
#2の回答者です。
>Rw = Range("B2").CurrentRegion.Rows.Count + 1
>の+1の意味を教えて頂けないでしょうか?
まあ、特殊な条件を言い始めればキリはありません。一応、データが四角形で埋まっていれば、2行目からということですから、最終行は、行幅がひとつ足りませんから、+1 を加えればよいという話です。
こうした話を広げると「たら・れば」になり、その「たら・れば」を言い始めれば、現実を通り越して、どれが正しいか分からなくなります。以下のサイトで、CurrentRegion では、どうやっても、以下のEndプロパティのようには、最終行は取れないことを再度確認したことはありますが、それも、「たら・れば」です。
いずれにしても、ただ、2^20行目(つまり最終行)に行ってしまうことだけ避けられればよいと思います。データの空白によるエラー処理だけすれば、それはそれで十分だと思います。
『VBAを使って、最終行と最終列を見つける5つの方法』
http://www.thespreadsheetguru.com/blog/2014/7/7/ …
ここの話を、『英語カテゴリ』(2015/02/05 #8914221)で書いたことがあります。その表をサンプルして、試してみるのもよいでしょう。(もう2つぐらいありますが。)
それはともかく、これは今回の質問の要点とは違うはずで、私の#2で書いていたB列の内容の部分が、気になる所なのですが……。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) あるフォルダーのファイルを違う親フォルダーのサブフォルダーに移したい 11 2023/02/15 19:00
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Excel(エクセル) フォルダ内の全ブックのシート名を変更したい 7 2022/09/22 21:34
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
- Visual Basic(VBA) フォルダの場所を可変にしたいです(マクロ) 4 2023/05/11 10:00
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Vba 実数および実数タイプの変...
-
Excelのマクロについて教えてく...
-
VBA レジストリの値の読み方に...
-
Excel VBA 定義されたプロージ...
-
Excel マクロについての相談
-
エクセルVBAについて
-
Vba SelStart、SelLen教えてく...
-
エクセルの合計を自動で表示さ...
-
Excelのマクロでワードのテキス...
-
Excelについて
-
2つのマクロでチェックボックス...
-
VBAに詳しい方教えてください。
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
VBAの質問になります Userform内で
-
VBA listBoxから
-
VBAで各列の"+"と"o"の合計数を...
-
VBA初心者 Ctrl+での操作、ボタ...
-
VBA 複数条件の分岐処理の上手...
-
VB.net(VB)で、フォームにExcel...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel VBA 定義されたプロージ...
-
Excel-VBAのmsgBox()の不思議
-
【VBA】マクロの入ったファイル...
-
VBA 複数条件の分岐処理の上手...
-
現在のブックを閉じないで、マ...
-
VBAで各列の"+"と"o"の合計数を...
-
VBAに詳しい方教えてください。
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
ユーザーフォームに別シートか...
-
エクセルのマクロについて教え...
-
ExcelVBA シート名を複数セルか...
-
エクセルのマクロについて教え...
-
VBA listBoxから
-
Excelのマクロについて教えてく...
-
エクセルのマクロについて教え...
おすすめ情報
この質問は特に30代・男性の方にリクエストされています!としてしまいしたが、間違えました。
どなたでも構いません、よろしくお願いします。