ファイルを閉じたままの外部参照で最終行の行数取得

このQ&Aのポイント
  • VBAの初心者が、ファイルを閉じたまま外部参照する方法と、参照先の最終行を取得する方法について質問しています。
  • 現在、VBAの初心者がファイルを閉じたまま外部参照する方法について調べています。Application.ExecuteExcel4Macroを使用することで参照先の値を取得できることを知りましたが、最終行などの情報を取得する方法がわからないようです。
  • VBAの初心者がファイルを閉じたまま外部参照する方法について質問しています。参照先の最終行を取得するためにはどうすれば良いか教えて欲しいとのことです。
回答を見る
  • ベストアンサー

ファイルを閉じたままの外部参照で最終行の行数取得

こんにちは。VBA初心者、の段階から脱出を試みているものです。 ここやその他サイトを調べて、EXCELファイルを閉じたまま外部参照するには、Application.ExecuteExcel4Macroを使えばいいことがわかったのですが、参照先の最終行などの情報を取得するにはどうしたらいでしょうか。 私が調べた限りでは、以下のような単純に値を取得する方法しか説明されておらず、VBEのヘルプにも詳しい説明がありませんでした。 Cells(1, 1) = Application.ExecuteExcel4Macro _ ("'C:\My Documents\[Book2.xls]Sheet1'!R1C1") 参照先から値を取得する際に、必要な範囲だけ見るようにしてできるだけ速く処理できるようにしたいと思っています。 (したがって、 65535行目までループするとか、OPENメソッドで一旦ファイルを開くような手法は避けたいと思っています) なにかいい方法がありましたらご教示いただけないでしょうか。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • tossy2011
  • ベストアンサー率17% (3/17)
回答No.2

Application.ExecuteExcel4Macroに関して詳しくありませんが メモリ上に展開してもよいなら下記の形で取得できると思います。 Sub test() Dim appExcel As Object Dim sh As Worksheet Dim row As Integer Set appExcel = GetObject("C:\Book1.xls") row = appExcel.Worksheets(1).UsedRange.Find("*", , xlFormulas, , xlByRows, xlPrevious).row Set appExcel = Nothing End Sub

Kazu_creator
質問者

お礼

ご回答ありがとうございます。 このメモリ上に展開する手法は、さまざまな場面で応用が効きそうですね! 実は最終行を取得するのは第1ステップで、その後応用していろいろと処理するつもりだったので助かります。 FINDメソッドの部分も、検索対象をワイルドカードにして、Afterの部分を省略、SearchDirection を xlPreviousにすると最終行の値にヒットするというのも自分では決して思い付きませんでした(ちなみにLookInの部分はXlValueでもちゃんと動いたので、どちらでもいいんですよね?)。 大変勉強になりました。

その他の回答 (3)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

Sub Test1()  Dim fn As String  Dim a As Long, b As Long  Dim ret As Variant  Dim frml As String  fn = "'C:\My Documents\Excel\[TEST1.xls]"  frml = fn & "Sheet1'!C1"  On Error Resume Next  '数字検索  a = Application.ExecuteExcel4Macro("MATCH(" & 10 ^ 10 & "," & frml & ",1)")  '文字検索(ただし、"*"があればヒットしてしまいます。その場合は、"熙"のような文字が良い)  b = Application.ExecuteExcel4Macro("MATCH(""*""," & frml & ",1)")  On Error GoTo 0  If a > b Then   ret = a  Else   ret = b  End If  MsgBox ret  'Cells(1,1).Value = ret End Sub 私からの拙いアドバイス。 >VBA初心者、の段階から脱出を試みているものです。 こういう裏技から遠ざかることが、初心者からの脱却だと思います。しょせん、単発ワザは、裏技に過ぎません。もし、学ぶなら、Ver.4 マクロ関数、Ver.5 のテクニックを知っておくと良いのですが、今は、資料などはありません。また、それを学んでも、今では、あまり生産的ではありません。 初心者から離脱は、基本の積み重ねしかないと思います。それも、ほんのちょっとしたことで、暗黙のプロパティを使って、Cells(1, 1) ではなく、Cells(1, 1).Value とか、変数のデータ型の決め方とか、分かっているようで分からないことを覚えて、毎日、コードを書くことです。

Kazu_creator
質問者

お礼

ご回答、およびアドヴァイスありがとうございました。 プログラミング自体初心者みたいなところから始めて、参考書やWEBの情報を読みなら全くの独学でやっているので、結構基本的なところが抜けてしまっているかと思います。 たとえ意図したとおりに動いたとしても、わかってる人からみればよろしくない部分の多々あることでしょう。 #2のような回答をいただいても、ちょっと前の自分だったら、Set appExcel = GetObject("C:\Book1.xls")とオブジェクトを変数に格納せずに、いきなりGetObject("C:\Book1.xls").Worksheets(1).UsedRange.Findのようなかたちで応用していたかもしれません。 なぜオブジェクトを一旦変数に格納すべきなのかは、いまだにちゃんと理解していなのですが… (「たまにエラーになることもあるから」というレベルです、正直なところ)

回答No.3

#1です >今調べているのは、外部参照のファイルを閉じたままで同じ結果を得るにはどうしたら良いのかということです。 Range("A1").Value = "=COUNTA('C:\My Documents\[Book2.xls]Sheet1'!$A$1:$A $65536)" これは、セルA1にBook2.XLSのレコード数を計算する式を入力すると言うコードです。 質問者さんが仰るように、Book2.XLSはオープンしていないですが。 的外れな回答でしたらすみません。

Kazu_creator
質問者

お礼

度々ありがとうございます。 A1セルに「ワークシート関数」を入力するというわけですね。ナルホドです。 ExecuteExcel4MacroはセルをR1CI形式で参照しなければならないと説明されていたので、質問の意図が伝わっていないかと思ってしまいました。 確かにワークシート関数COUNTAを書けば、ファイルを閉じたままでも(空白セルがない)という前提で最終行が取得できますね。

回答No.1

'C:\My Documents\[Book2.xls]Sheet1'のA列には空白の行がなければ (B列でもC列でも良いのですが) Range("A1").Value = "=COUNTA('C:\My Documents\[Book2.xls]Sheet1'!$A$1:$A$65536)" アクティブシートのA1 に Book2.xls の 行数を書き込む ではどうでしょうか

Kazu_creator
質問者

補足

早速のご回答ありがとうございます。 質問の仕方が良くなかったのかもしれませんが、普通に最終行を調べるのなら Cells(Rows.Count, 1).End(xlUp).Row や Range("A1").SpecialCells(xlLastCell) などの方法があるのは存じております。 今調べているのは、外部参照のファイルを閉じたままで同じ結果を得るにはどうしたら良いのかということです。 以下のようなコードを試してみたのですが、前者は結果が「#NAME?」となり、後者はコードの実行時エラーになってしまいます。 Cells(1, 1) = Application.ExecuteExcel4Macro _ ("'D:\sample\[sample.xlsm]Sheet1'!R1C1.SpecialCells(xlLastCell)") Cells(1, 2) = Application.ExecuteExcel4Macro _ "'D:\sample\[sample.xlsm]Sheet1'!R65535C1.End(xlUp).Row") ExecuteExcel4Macroでなくてもよいので、なにか方法はないでしょうか。

関連するQ&A

  • エクセルVBAで他Bookを閉じたまま参照・訂正

    Cells(1, 1) = Application.ExecuteExcel4Macro _ ("'C:\My Documents\[Book2.xls]Sheet1'!R1C1") でBook2を開かずにセルを参照できますが、 1.別の記述方法があるのでしょうか。 2.逆に、閉じたBook2のセルに対し、値を訂正できないでしょうか。 よろしくお願いいたします。

  • Application.ExecuteExcel4Macroなに?

    No.373903を拝見しまして、閉じたままのブックを参照できるらしいので使いたいのですが、ブックが複数ある場合、[ ]内はどのように書けば良いのでしょう? 例) Cells(1, 1) = Application.ExecuteExcel4Macro _ ("'C:\My Documents\[Book2.xls]Sheet1'!R1C1") Book2・sheet1の部分が可変。 また、 Application.ExecuteExcel4Macro("get.document(50)") や Application.ExecuteExcel4Macro ("Halt(True)") 等の使い方もあるようですが、どなたかわかりやすく教えて頂けませんか?

  • ACCESSのVBで、エクセルファイルの最終行を取得

    題名の通り ファイルの最終行を知りたいのです ざっと エクセルファイルをオープンするは下記のように すると思いますが その後、最終行を取得するのに、どうするのか 教えてください ーーーーーーーーー------------ Set Xls = GetObject("エクセルのファイル") Xls.Application.Windows(1).Visible = True Xls.Application.worksheets("Sheet1").Activate

  • Excelでの外部ファイル参照

    環境:windowsXPPro、Excel2000 初めまして。 Excelの外部ファイル参照で悩んでいることがあり解決方法を模索中です。 基礎値.xls、集計.xls というBookがネットワーク上のファイルサーバーにあるのですが 集計.xlsに基礎値.xlsの値を参照する式がセルに設定されています。 [=vlookup(a1,'\\server\[基礎値.xls]Sheet1'!$A$1:$B$50,2,false)] 2つのファイルが同じサーバーのフォルダーにある場合は問題ないのですが、 集計値.xlsを各ローカルPCに移動して使用したところ基礎値.xlsの参照先が [=vlookup(a1,'c:\job\[基礎値.xls]Sheet1'!$A$1:$B$50,2,false)] となってしまいサーバー上のファイルを参照してくれません。 VBAなどで細工すれば解決はすると思いますが、マクロ・VBAを使わないで運用しなくてはなりません。 ファイルを移動させても参照先フォルダーを固定させるよい方法はないでしょうか?

  • Excel2000のマクロが2007で型が一致しませんと表示されます

    自作マクロを作成し別ブックから転記するものですがExcel2000では正常に動くのですが、Excel2007では、転記対象のセルが0なら空白にするという行(IF文)で「型が一致しません」と表示されてしまいます。 ExecuteExcel4Macroが悪いのか、いろいろ調べましたが型とは?などマクロ初心者なので分からないです。宜しくお願いします。 For i = 1 To 7 Cells(i, 1).Value = ExecuteExcel4Macro("'\[meca.xls]Sheet1'!R" & i & "C1") If ExecuteExcel4Macro("'\[meca.xls]Sheet1'!R" & i & "C1") = "0" Then Cells(i, 1).Value = "" Next i

  • エクセルマクロでファイルを開かず行をしらべたい

    こんにちは! エクセルマクロでファイルを開かず一番下の行を調べたいのですが、どうしたらよいでしょうか? 色々試行錯誤して、下記を組んでみましたが、上手くできませんでした。 test1のエクセルに下記のマクロを入れてあります。 C直下のtestフォルダの中のtest2.xlsのsheet1のファイルを読み込みたいです。 Dim line As Long Dim names As String names = "C:\test\[test2.xls]sheet1" line = ExecuteExcel4Macro("'" & names & "'!R1C1").End(xlUp).Row 「ファイルを開かず一番下の行を調べる」ことができれば、上記のマクロを動くようにするでも、別のマクロを提示するでも構いませんので、アドバイスのほどよろしくお願いいたします。

  • ブックを閉じたエクセルファイルの最終行を検索

    ・フォルダ内に複数のエクセルファイル(xlsx)がある ・それぞれのファイルに記載されている内容や量は異なる (少ないと200行。多いものだと3000行以上) これに対して以下の作業を行う方法は無いでしょうか? (1)ファイルを開かずに、それぞれのファイル内のデータがある最終行を調べる 例:book1のデータが300行あるのなら、「300」を返すような (2)フォルダ内にあるエクセルファイルに一括で(1)を行う 自分でもマクロなりでこれらのファイルの情報を取得しようと試行錯誤しております。 ExecuteExcel4Macroなど自分でも試してみたのですが、全くうまくできません。 マクロに限らず、これが出来るのであればツールややり方は問いません。 (1)、(2)の片方だけでも問題ございませんので、どなたかご教示頂けないでしょうか。

  • Excel VBA ExecuteExcel4Macroについて

    こんにちは。よろしくお願いします。 あるフォルダ"D:\test"のなかに、4つのxlsファイル"o.xls"、"a.xls"、"b.xls"、"c.xls"があるとします。 使用するシート名は、それぞれo,a,b,c(ファイル名から".xls"を除いたもの)とします。 このとき"o.xls"を開いて、下記のマクロを実行すると、1行目にパス名、2行名にファイル名、3行目以下に(1列目は"a.xls"の、2列目は"b.xls"の、3列目は"c.xls"の)セルA3以下が読み込まれます。 たとえば、結果は添付の図のようになります。図がうまくアップできなかったらごめんなさい。 Sub sample1() Application.Calculation = xlManual Application.ScreenUpdating = False Application.DisplayAlerts = False On Error Resume Next Worksheets("o").Cells.Clear Dim p As String, fn As String, fc As Long, i As Long, j As Long, d, e p = ActiveWorkbook.Path fn = Dir(p & "\" & "*.xls", 0) fc = 0 If fn <> "" Then fc = fc + 1 For j = 3 To 6 With Worksheets("o") .Cells(1, fc).Value = p & "\" & fn .Cells(2, fc).Value = fn d = ExecuteExcel4Macro("'" & p & "\[" & fn & "]" & Mid(fn, 1, Len(fn) - 4) & "'!R" & j & "C1") If d = 0 Or IsError(d) Then Exit For Else .Cells(j, fc) = d End If End With Next j End If Do fn = Dir() If fn <> "" Then fc = fc + 1 For i = 3 To 6 With Worksheets("o") .Cells(1, fc).Value = p & "\" & fn .Cells(2, fc).Value = fn e = ExecuteExcel4Macro("'" & p & "\[" & fn & "]" & Mid(fn, 1, Len(fn) - 4) & "'!R" & i & "C1") If e = 0 Or IsError(d) Then Exit For Else .Cells(i, fc) = e End If End With Next i Else Exit Do End If Loop Application.ScreenUpdating = True Application.DisplayAlerts = True Application.Calculation = xlAutomatic End Sub 上記の例は変数iとjが3から6までしか動きませんし、読み込むxlsファイルも3つしかありませんのですぐに終わりますが、実際には行やファイルがもっとたくさんあり、非常に時間がかかっています。そこで、 ExecuteExcel4Macro("'" & p & "\[" & fn & "]" & Mid(fn, 1, Len(fn) - 4) & "'!R" & i & "C1") を e = ExecuteExcel4Macro("'" & p & "\[" & fn & "]" & Mid(fn, 1, Len(fn) - 4) & "'!R3C1:R6C1") というような風にして、For~Nextも使用せず .range(Cells(3, fc),cells(6, fc)) = e というふうに範囲で読み込もうとしたのですがうまくいきません。 ExecuteExcel4Macroは範囲を読み込むことはできないのでしょうか? 何とかして処理速度を上げたいのですが、どうすればよいでしょうか。

  • EXCELのVBAにて閉じたブックの数値を拾い出したいため

    EXCELのVBAにて閉じたブックの数値を拾い出したいため ExecuteExcel4Macroを使用して次のように作成しましたが 生産管理ブック内の直出荷シートしか参照できません。 その他シートの参照して数値を拾い出したいため シートのループ処理(シート数不規則)を例えばworksheet(1)~処理終了の名前がついた シートまで行いたいのですがどの様に直出荷部分を書き込めばいいかわかりません。 いい方法を教えていただけ無いでしょうか? (:と生産計画の間 エン[ がうまく表示できません) Dim i As Long, idx As Long Dim hi As Integer For hi = 10 To 252 If Cells(2, 3) = ExecuteExcel4Macro("'E:\生産計画.xls]直出荷'!R" & 11 & "C" & hi) Then Exit For End If Next hi i = 7 For idx = 7 To 3000 For i = i To 300 If ExecuteExcel4Macro("'E:\生産計画.xls]直出荷'!R" & idx & "C" & 5) = 0 Then Exit Sub End If Cells(i, 1) = ExecuteExcel4Macro("'E:\生産計画.xls]直出荷'!R" & idx & "C" & 5) Cells(i, 2) = ExecuteExcel4Macro("'E:\生産計画.xls]直出荷'!R" & idx + 2 & "C" & 5) Cells(i, 3) = ExecuteExcel4Macro("'E:\生産計画.xls]直出荷'!R" & idx + 11 & "C" & hi) i = i + 1 Exit For Next i idx = idx + 57 Next idx

  • Excelにて外部Excelファイルのデータを参照する方法

    お世話になります。 Excelにて外部のExcelファイルのデータを参照する方法を教えていただけませんでしょうか。 具体的には、 1.Excelファイルa.xls b.xls c.xls・・・ があります。 2.a.xlsの a1 に b.xls の a1 の値を入力し、続けて a.xls の a2 に c.xls のa1・・・を繰り返していきます。上手く説明できないので、下を参照願います。 ------------------------------------------------ <a.xls> |a |b |c -+------- 1|a1|b1|c1 ←b.xls ないのa1-c1のデータ 2|a1|b1|c1 ←c.xls ないのa1-c1のデータ 3|a1|b1|c1 ←d.xls ないのa1-c1のデータ ------------------------------------------------ 上記を数百のファイル分行いたいのですが、外部ファイルを開いて該当のセルをコピーしていると非常に時間がかかります(といいますか無理でしょう)そこで、これらを数式から指定して、セルにコピーする事により、作業を効率化したいというわけです。 そのような方法がございましたら、教えていただけませんでしょうか。 よろしくお願い致します。

専門家に質問してみよう