- ベストアンサー
エクセルVBAで非アクティブブックのRow取得
非アクティブシートの最終行のRowを取得するマクロが xls形式のファイルだと動いていたのですが、xlsm形式に変更後、エラーになってしまいました。 これは仕様の変更によるものなのでしょうか? Activeteせずに対処する方法があれば教えて頂きたいです。 Sub ボタン1_Click() Dim 最終行 As Long 最終行 = Workbooks("1.xls").Worksheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row MsgBox 最終行 End Sub
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
> Workbooks("1.xls").Worksheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row > ↑ここでブックを指定してても取得するのはアクティブシートのRows.Countを取得するって事ですか? そうです。 ブックとシートを指定しているのはCellsに対してだけです。 Rows.Countに対してはブックもシートも指定していませんのでアクティブシートが対象になります。 ですから、"1.xls"のSheet1のRows.Countを使用したいなら Workbooks("1.xls").Worksheets("Sheet1").Cells(Workbooks("1.xls").Worksheets("Sheet1").Rows.Count, 1).End(xlUp).Row と、書く必要があります(Withを使えばもう少しきれいになりますが…)。 でも、xlsの場合Rows.Count = 65,536 と決まっているのですから、 Workbooks("1.xls").Worksheets("Sheet1").Cells(65536, 1).End(xlUp).Row で良いと思います。
その他の回答 (4)
- mt2008
- ベストアンサー率52% (885/1701)
> アクティブシートのRows.Countを取得するという点が理解できないのですが。 Rows.Countでは指定しない限りアクティブなシートの最終行を返します。 Rangeでも、ただ単にRange("A1")とするとアクティブなシートが対象ですよね。それと同じです。 もし、どうしても1.xlsの最終行を指定したいのでしたら以下の様にする方法も有ります。 Rows.Count ↓ Workbooks("1.xls").Worksheets("Sheet1").Rows.Count
補足
Workbooks("1.xls").Worksheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row ↑ここでブックを指定してても取得するのはアクティブシートのRows.Countを取得するって事ですか? 何度もつまらない質問ですみません。
- mt2008
- ベストアンサー率52% (885/1701)
Rows.Count が原因。 xlsxやxlsmのRows.Count(ワークシートの最終行)は、1,048,576ですがxlsは65,536 65,536行までしかないシートの1,048,576行を起点に使用している最終行を取得しようとしているからエラーになっています。 Rows.Count を やめて65536にしては?
補足
その通りでした。xlsxだと取得できました。 ただ1つ疑問なのが、非アクティブシートの("1.xls")上でのRows.Countを取得するわけでは無いのでしょうか? アクティブシートのRows.Countを取得するという点が理解できないのですが。 初歩的な質問ですみません。
私は2007ですが、そのマクロを実行させても問題無いですね。 ダミーファイルの拡張子はxlsxですが。 1.xlsのファイルを開いていない又はファイル名が間違っていれば、エラーになると思いますが。
補足
Excelは2010です。ファイルはもちろん開いている状態で実行しています。マクロを実行するファイルの拡張子がxlsとxlsmの違いだけでエラーになってしまいます。
- chie65536(@chie65535)
- ベストアンサー率44% (8755/19867)
>xlsm形式に変更後 >Workbooks("1.xls"). xlsm形式に変えたら、拡張子が「.xls」から「.xlsm」「.xlsx」「.xlsb」に変わってると思いますが「1.xls」のままで大丈夫なんですか? 最終行を求めたい「別ブックのシート」が、古いエクセル形式なら「1.xls」のままでも大丈夫でしょうけど…。 因みに、新形式のファイル拡張子と内容は、以下のようになっています。 「.xlsm」⇒新形式で、Open XML形式のテキストデータで、マクロが使える 「.xlsx」⇒新形式、Open XML形式のテキストデータ 「.xlsb」⇒旧来と同じバイナリ形式で、下位互換の為にある
補足
分かりづらくてすみません。 マクロを実行しているのは"2.xlsm"で、 このファイルがアクティブの状態で "1.xls"が非アクティブです。 "2.xls"のファイルだとエラーにならないのに "2.xlsm"のファイルだとエラーになってしまいます。
お礼
なるほど。納得しました。非常に勉強になりました。 長々と付き合っていただきありがとうございました。