• ベストアンサー

ExecuteExcel4Macro "FORMULA(""=R1C1"")"

ExcelのVBAのご質問です。 マクロの自動記録にて、オートシェイプに他セル参照を入れ込みました (つまり、オートシェイプを選択状態で数式バーに=A1などと入れ込んだ)。 すると、おそらくその部分に ExecuteExcel4Macro "FORMULA(""=R1C1"")" というプログラムが出て来るのですが、 ・・・これはどう理解したら良いのでしょうか。 調べてみたのですが、ExecuteExcel4Macroというものの理解が 今いちできないのと(他シートのマクロを実行させる時に 使ったりするらしいという事しかわかりませんでした) "FORMULA(""=R1C1"")" についても、FORMULAというのはR1C1形式でなくA1形式の時に 使うものじゃなかったっけ? なぜ"が2つ? などと混乱しています。 (=A1だからR1C1なので、A2ならR2C1だな、という事だけはわかる) 私の頭では、断片的な情報の統合ができず理解に苦しんでいます。 助けてくださる方いらしたらお願いいたします。

noname#101292
noname#101292

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

  • ベストアンサー
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.1

こんにちは、KenKen_SP です。 長文ですみません。できるだけわかり易く書こうと思ったのですが... ご参考になれば。 > ・・・これはどう理解したら良いのでしょうか。 ご質問にあるシェープにリンクの数式を設定することは、現在の VBA にはそ のメソッドが存在しないため不可能です。しかし、Excel 4.0 マクロにはその 命令が存在しました。それが FORMULA マクロ関数です。   MS サポートオンライン [マクロを使おう - FORMULA 関数]   http://support.microsoft.com/default.aspx?scid=kb;ja;410481 Excel 4.0 マクロは以前の Excel で使われていた、今で言う VBA に相当する 機能ですが、現在の VBA とは   「考え方も記述方法も完全に”別物”」 です。ここで、   Excel の幾つかのコマンドは、同等のコマンドが VBA 側で用意   されていないため、ExecuteExcel4Macro メソッドを使って記録   されることがある と MSDN で見かけましたことがあります。正確な情報ソースを失念してしまっ たのですが、   ・VBA では実現できない   ・Excel 4.0 マクロ関数の FORMULA なら実現可能   ・では、FORMULA 関数を使おう となって、 ExecuteExcel4Macro が記録されたのだと思います。 ExecuteExcel4Macro メソッドは、VBA ではない Excel 4.0 マクロのコマンド を実行するためのメソッドです。 余談ですが、Excel 4.0 マクロは互換性のため現在の Excel にも搭載されて おりますが、VBA が主流となり、MS も既に正式サポートしておりません。ず いぶん前の話です。今となっては情報量が極端に少なく、また、いつまで使え るのかも不透明なため、新たに覚える必要はないと思います。 しかし、ご質問の例のように現行 VBA で実現できないことが、Excel 4.0 マ クロでは実現できたりして完全にニーズが消え去ったわけではないです^^; > FORMULAというのはR1C1形式でなくA1形式の時に使うものじゃなかったっ > け? なぜ"が2つ? 上述のように FORMULA は VBA の Formula プロパティーとは完全に別物です。 ここで、ExecuteExcel4Macro メソッドのヘルプを見てみます。   ▼ [Excel2002 VBA Help - ExecuteExcel4Macro メソッド 引用]   Excel 4.0 マクロ関数を実行し、関数の結果を返します。値の取得   および設定が可能です。取得する型の種類は、対象の関数によって   異なります。   expression.ExecuteExcel4Macro(String)   (略)   String 必ず指定します。文字列型 (String) の値を使用します。   Excel 4.0マクロ言語関数を等号 (=) なしで指定します。   参照はすべて R1C1の文字列として指定する必要があります。   また、引数 String 内で二重引用符 (") を使うときは、二重引用符   を続けて記述してください。   [引用終わり] 簡単に解説すると、実行する Excel 4.0 マクロ関数を「文字列」で指定しな いといけないのです。これは VBA の ExecuteExcel4Macro メソッドの仕様で すね。 あとは FORMULA 関数の仕様で、参照式もまた文字列で指定しないといけない のですが、そうなると、文字列中に二重引用符 (")を使わなければなりません。 ここからは、VBA の記述方法の話になりますが、文字列中に”(二重引用符) を使うときは、””と2つ続けます。これをエスケープする...と言います。 例えば、MsgBox で "aaa と表示したいとき、どうコーディングしたら良いで しょうか? MsgBox "aaa ではコンパイルエラーですね... MsgBox "aaa" なら、エラーにはなりませんが、 aaa と表示されてしまいます。 MsgBox """aaa" とすると表示できます。”はプログラムで使われる特別な記号なので、このよ うな処理が必要なのです。

noname#101292
質問者

お礼

大変ありがとうございました。 よくわかりました。 4.0のマクロで、の意味だったとは・・・。 よく見るとヘルプにもそう書いてあるのに、 読んでも意味がわかりませんでした。 現在のVBAとまったく違うものだったという事も知りませんでした。 現在のVBAしか知らない(というかそれもあまり知らない)私が FORMURAで悩んでもわからない訳ですね。 こんなに丁寧に説明していただけるとは思いませんでした。 重ねてお礼申し上げます。

その他の回答 (3)

  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.4

ueno88さん、横からの便乗質問失礼いたしまし。 ueno88さんの質問はKenKen_SPさんの回答で解決しているとは思いましたが、 オブジェクトにないプロパティが実行されるのがちょっと府に落ちませんでしたので この場を借りて質問させていただきました。 KenKen_SPさんの仰るように、またueno88さんの感じているように VBAが気を利かせて実行しているのだろうと思います。 今回は面白いことが分かりました。 興味ある質問をして下さったueno88さん、回答を下さったKenKen_SPさん、ありがとうございました。 これからも宜しくお願いいたします。  

noname#101292
質問者

お礼

こちらこそ、よろしくお願いいたします。 締め切ります。

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.3

> これでは拙いのでしょうか。 いえ、そんなことはありません。#2 でご提示いただいたコードで確かに リンクを設定できるのですか。 実は、Selection というのは私はほとんど使いませんので、その実態と いうか、「どんな風に使えるのか?」を良く分かってないのです。 勉強になりました。ありがとうございます。 少しコメントさせていただきます。 まず、Shape オブジェクトには Formula プロパティーがありません。 これはオブジェクトブラウザで確認しました。 ここからは推測になるのですが、VBA で用意されていないメソッドやプロ パティーが実行されるはずもなく、   Selection.Formula = "=B5" というのは、VBA の実行過程で Excel 4.0 マクロをコールしている様な気 がします。これは、マクロの記録で同様の操作が、   ExecuteExcel4Macro "FORMULA(""=R1C1"")" と記録されることから推測したことです。この仮説が正しいのかどうかを 証明する術は、残念ながら私にはありません。

noname#101292
質問者

お礼

なるほど、ありがとうございます。 などと、すでに横合いから口を出しているような かたちの質問者なのですが。大変興味深く拝見しています。 存在しないプロパティが実行される不思議。 不便だろうと思ってマイクロソフトがSelection.Formula = "=B5" でも実行できるようにしてくれたんでしょうか。 でもこれじゃ、ヘルプから調べてSelectionにFormulaプロパティを 設定する事を思いつく事はできませんね。

  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.2

KenKen_SPさんの回答はいつも懇切丁寧、かつ的確ですのでとても参考になります。 今回の回答にちょっと気になるところがありましたので便乗質問させてください。 >シェープにリンクの数式を設定することは、 >現在の VBA にはそのメソッドが存在しないため不可能です Sub Test()  ActiveSheet.Shapes(1).Select  Selection.Formula = "=B5" End Sub これでは拙いのでしょうか。 尚、回答の意図を読み違えていましたら平にご容赦願います。    

noname#101292
質問者

お礼

ありがとうございました。 試してみました、・・・それでも実際動作は十分いけますね。 なぜわざわざExecuteExcel4Macroを使うかエクセル。 何か理由があるのかも知れませんが・・・もちろん私にはわかる訳もなく。 あ、ちなみに、私がここでひっかかっていた理由は、 R1C1形式でなくA1形式をとりたかった、という理由もあったのです。 そんな訳で、実際の問題解決のためにはそのものズバリの回答を いただいた事になります。 今回の質問では、大変勉強になりました。ありがたいことです。

関連するQ&A

  • ExecuteExcel4Macroについて

    エクセルで、フォームで挿入した「ラベル」に他シートのセルを参照させてマクロの記録をとると以下のようになります。 Sub Macro1() ActiveSheet.Labels.Add(526.5, 301.5, 76.5, 18).Select ExecuteExcel4Macro "FORMULA(""=FACE!R[7]C[10]"")" End Sub では、逆にラベルに設定された参照元を取得するにはどう記述すればようでしょうか? For Each sp In ActiveSheet.DrawingObjects i = i + 1 On Error Resume Next sh.Cells(i, 2) = TypeName(sp) sh.Cells(i, 3) = sp.Name sh.Cells(i, 4) = sp.Formula next では、取得出来ませんでした。

  • 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)") 等の使い方もあるようですが、どなたかわかりやすく教えて頂けませんか?

  • ExecuteExcel4Macroでセル値取得

    office2010 あるフォルダにファイルを入れて、ファイルを開かずに対象シートの対象セルの値を取得したいです。 この取得したいセル情報を、変数で指定したいのです。 C:\dataに取得元のファイルが入っています。 このファイル名((1))は、いろいろ変わりますが、中にH4という文字があります。 対象シートのシート名とセルアドレスは、別のファイル(これにマクロがあります) のsettingシートで指定します。 1例ですが、settingシートの B2に11_001 C2にAF9 と設定します。 (1)のファイルで11_001というシートのAF9セル値を取得したいのです。 Dim myPath As String Dim myFile As String myPath = "C:\data\" myFile = Dir(myPath & "*H4*.xlsm") Dim sheetname As String Dim cell As String sheetname = Worksheets("setting").Range("B2") cell = Worksheets("setting").Range("C2").Value ' 'Range("A1") = ExecuteExcel4Macro("'[" & myFile & "]" & sheetname & "'!R9C32") Range("A1") = ExecuteExcel4Macro("'[" & myFile & "]" & sheetname & "'!" & cell & "") 上記で、 Range("A1") = ExecuteExcel4Macro("'[" & myFile & "]" & sheetname & "'!R9C32") は、値取得できます。 このR9C32を変数にする所で、エラーが発生します。 実行時エラー1004と。 いろいろWEB見て、’,スペース等を入れてみましたが、どうしても分からず、 Range("A1") = ExecuteExcel4Macro("'[" & myFile & "]" & sheetname & "'!" & cell & "") の最後のセル指定を、変数で設定する方法を教えて頂きたく。

  • ExecuteExcel4Macroを使って他のブックを開かずにセルを

    ExecuteExcel4Macroを使って他のブックを開かずにセルを参照しているのですが、worksheet(1)という記述を使いたいのですがどうすればよいでしょうか? Target1 = "'" & Path & "[" & buf & "]sheet1'!R75C3" 上記だとsheet1という名前でなかったらエラーが出てしまうので・・・。

  • ExecuteExcel4Macroでのデータ取得

    office365 従来、ドメイン配下のサーバに登録されているファイルをExecuteExcel4Macroでファイルを開かずにセルの値を抽出していました。 今回、サーバがドメイン配下でなくなったので参照ツールを変更しようとしています。 サーバ名が○○○○ IDがID パスワードがPW で Gドライブのinフォルダに登録されてる ファイル名:A001.xslsm シート名 :1_001_01 セルアドレス:A1 の内容を refer.xslmファイルのセルアドレスR1にExecuteExcel4Macroで表示させるマクロをベタで教えていただきたく。 ExecuteExcel4Macroでデータ抽出する構成にしているのは、参照するファイル容量が大きいので、 ファイルを開いてコピペ方式だとレスポンスが悪いからです。 サーバにはリモートディスクトップ接続をバッチファイルで起動したら入れる様にはなってます。 kido.batの中身 @echo off Set SERVER=○○○○ Set USERNAME=ID Set PASSWORD=PW Cmdkey /generic:TERMSRV/%SERVER% /user:%USERNAME% /pass:%PASSWORD% Start mstsc /v:%SERVER% Timeout 3 Cmdkey /delete:TERMSRV/%SERVER% kido.batを起動するマクロは下記 Sub RunBatShell() Dim dProcessId As Double Dim sPath sPath = "C:\Users\ID\Desktop\kido.bat" dProcessId = Shell(sPath) End Sub 上記バッチ内容もマクロに記述出来たら1本化したく。

  • 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は範囲を読み込むことはできないのでしょうか? 何とかして処理速度を上げたいのですが、どうすればよいでしょうか。

  • ExecuteExcel4Macroを使ったレコードの読み込み方法につ

    ExecuteExcel4Macroを使ったレコードの読み込み方法について 下記サンプルは、ファイルを指定して、指定したファイルの中にあるシートを選択し、その中にあるデータを読込むものになっています。 読込ませるファイルのsheet1には、『 ID,顧客番号,氏名,住所,電話番号 』 が入っています。 下記サンプルでは、顧客番号フィールドのデータは読込めるのですが、該当するレコード全体を読込むにはどう組み立てればいいかよくわかりません。 すみませんが、どなたかご教授いただけませんでしょうか。よろしくお願いいたします。 Public Sub testes() ' 変数の指定 Dim OpenFileName, SheetName, Target, buf As String Dim i, TargetCol As Long, GetNames() ' 対象ブックの選択 OpenFileName = Application.GetOpenFilename("Microsoft Excel ブック,*.xls") If OpenFileName = "False" Then Exit Sub ' ファイル名に[]を付ける OpenFileName = Replace(OpenFileName, Dir(OpenFileName), "[" & Dir(OpenFileName) & "]") ' 対象ワークシート名の指定と取得 SheetName = InputBox("対象ワークシート名を入力します") If SheetName = "" Then Exit Sub Target = "'" & OpenFileName & SheetName & "'!" ' ワークシートの正誤チェック On Error Resume Next buf = ExecuteExcel4Macro(Target & "R1C1") If Err <> 0 Then MsgBox "ワークシート [ " & SheetName & " ] を読めませんので終了します。", vbExclamation Exit Sub End If On Error GoTo 0 ' [顧客番号]フィールドを探す For i = 1 To 256 If ExecuteExcel4Macro(Target & "R1C" & i) = "顧客番号" Then TargetCol = i Exit For End If Next i If TargetCol = 0 Then MsgBox "[顧客番号]フィールドが確認できません。", vbExclamation Exit Sub End If ' データの読み込み For i = 1 To 10000 buf = ExecuteExcel4Macro(Target & "R" & i) If buf = "0" Then Exit For ' シートに出力する Worksheets("sheet3").Activate ActiveSheet.Cells(i, 1) = buf Next i End Sub

  • VBAでのExecuteExcel4Macroの値取得でエラー

    こんにちは。 Excel VBAより、ExecuteExcel4Macroを実行して、 外部のExcelファイルの、名前(店名、月度)を定義したセルの値を取得したいと思っています。 店名:文字列型 月度:Date型 そこで、ExecuteExcel4Macro()を実行し、以下のような処理を加えました。 ------------------------------------------------------------------------------------ dim 店名 as Variant, 月度 as Variant If 外部マクロ実行("'c:\[test.xls]出勤簿'!店名", 店名) = False Or _ 外部マクロ実行("'c:\[test.xls]出勤簿'!月度", 月度) = False Then MsgBox "取得失敗", vbExclamation End End If Public Function 外部マクロ実行(com As String, ByRef result As Variant) As Boolean On Error GoTo erron3 result = ExecuteExcel4Macro(com) On Error GoTo 0 外部マクロ実行 = True Exit Function erron3: 外部マクロ実行 = False End Function ------------------------------------------------------------------------------------ これを実行したところ、「月度」の値は取得できるのですが、 「店名」の値には「エラー 2042」という値が入ります。 ※dirname, filenameは正しい値が入っています。 ※シート「出勤簿」および「月度」「店名」のセル名の定義も存在します。 test.xlsを開いてるときは、上記の現象は起こらず、 「店名」の値は正常に取得できます。 また、試しに、test.xlsを開き、 Worksheets("出勤簿").Range("店名")を実行すると、正常な値が取得できました。 まとめると、 ・閉じたブックの、あるシートにある、セルに定義された名前を指定して ・ExecuteExcel4Macroで、文字列が入っている値を取得しようとした時、 ・正常に値が取得できない という現象に遭遇しています。 3日ほど調べているのですが、どうしても原因が分かりません。 解決策をお持ちの方、いらっしゃいましたらアドバイスを頂けると助かります。 環境:WindowsXP Pro SP3 Excel 2003 (11.5612.5606) 以上、よろしくお願いいたします。

  • EXCELマクロでの formula の使用に関して

    マクロ内で、 Range(c1).formula = "=A1+B1" と記述すれば セルC1に「=A1+B1」という式が入ります。 これはいいのですが・・・・ セルC1に 「=CONCATENATE(A1,"~",B1)」 というような「"」を使った数式を入れる場合、 どうにように formula文を作成すればいいのでしょうか? Range(C1).formula = "=CONCATENATE(A1,"~",B1)" ではダメです。 「"」の前に何か記号でもつけるのでしょうか?

  • Excel macro の R1C1形式の複数行選択

    excelのマクロでR1C1形式で複数行を選択するには どうしたら良いのでしょうか? A1形式なら Columns("F:H").Select なのですが、R1C1形式での表記がわかりません。

専門家に質問してみよう