Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(指定なし : Excel 2013)
ExecuteExcel4Macroを使用したExcelのVBAが2016では動くのに2013では動かない
投稿日時: 25/11/12 17:03:32
投稿者: robin7500

VBA素人です。お世話になります。
 
ネットの情報を見様見真似でネットワーク上の特定フォルダの下位にあるフォルダ一覧を取得し、
取得したサブフォルダーにあるExcelファイルの特定シートからセル値を取得してアクティブシートに
一覧化するVBAを作成しています。
 
このExcel VBAについて、Excel2016では想定通りの結果を得られるのですが、Excel2013では
 エラー1004 このワークシート内にある1つ以上の式の参照に問題が見つかりました
となってしまいます。
 
Excel2013のセキュリティ設定でマクロを有効にしましたが結果は変わりません。
 
まったくの素人で恐縮ですが、ご教授いただけると助かります。

回答
投稿日時: 25/11/12 19:02:08
投稿者: abec

そのコードをここに書いてくれないと回答できないよ
(全部書くのが難しいなら最低限エラーが出て止まったあたりのコードだけでも)

投稿日時: 25/11/13 08:42:26
投稿者: robin7500

    FILE_PATH_CHK = " '" & FILE_PATH & arr(i, 1) & "\[" & arr(i, 1) & ".xls]シート名'!R2C1"
    On Error GoTo SkipFile
    Sheets(2).Cells(2, 2) = Application.ExecuteExcel4Macro(FILE_PATH_CHK)
     
    Sheets(1).Cells(j, 1).Value = arr(i, 1)
     
    For k = k To max_line
        For m = 2 To 5
            Sheet_PATH = " '" & FILE_PATH & arr(i, 1) & "\[" & arr(i, 1) & ".xls]シート名'!R" & k & "C" & m
 
            If m = 2 And Application.ExecuteExcel4Macro(Sheet_PATH) = 0 Then
                GoTo SkipFile
            Else
                If Application.ExecuteExcel4Macro(Sheet_PATH) = 0 Then
                    GoTo SkipLabel
                End If
            End If
            Cells(j, m + 1) = Application.ExecuteExcel4Macro(Sheet_PATH)
 
変数FILE_PATH_CHKに想定通りの値が格納されているところまでは確認できているのですが、
1つ目のExecuteExcel4Macroでエラーが出てしまいます。
この構文でExcel2016では動作しているのでExcel2013のPC依存かなと思っているのですが。
 
よろしくお願いします。

回答
投稿日時: 25/11/13 17:24:03
投稿者: Suzu

どんなエラーになっているのかは伝える様にしてくださいね。
 
 
Sheet_PATH = " '" & FILE_PATH & arr(i, 1) & "\[" & arr(i, 1) & ".xls]シート名'!R" & k & "C" & m
Sheets(2).Cells(2, 2) = Application.ExecuteExcel4Macro(FILE_PATH_CHK)
 
 
ExecuteExcel4Macro(引数)
は、引数に渡されたエクセルのブック/シート/セル の 値を参照します。
 
この、参照するセルを示す引数 が R1C1 形式になっています。
その実行環境の セル参照形式の アドレスを示す文字列を渡す必要があります。
 
Excel 2016 は R1C1 形式 になっているが
Excel 2013 は A1 形式 になっているため、エラーになっているものと思われます。
 
 Excelのオプション - 「数式」- 【数式の処理 の R1C1 参照形式を使用する】
 のチェック有り/無し が R1C1/A1形式 の切り替えです。

回答
投稿日時: 25/11/14 06:44:12
投稿者: abec

Excel2016とExcel2013で参照しているフォルダ名・ファイル名は全く同じですか?
Excel2013のフォルダやファイル名になにか変な文字が入っていたりはしてませんか

投稿日時: 25/11/14 13:38:35
投稿者: robin7500

お世話になります。
 
エラー:
実行時エラー'1004' このワークシート内にある1つ以上の式の参照に問題が見つかりました。
数式内のセル参照、範囲名、定義名、および他のブックへのリンクがすべて正しいことを確認してください。
 
Excelのオプション - 「数式」- 【数式の処理 の R1C1 参照形式を使用する】
2016,2013のどちらもチェックは外れています。
 
参照しているフォルダ・ファイルはすべて同じで、
2016で正常終了したすぐ後にそのまま2013で実行した結果がエラーとなっています。
 
よろしくお願いします。
 

回答
投稿日時: 25/11/14 16:45:43
投稿者: 半平太

引用:
2016で正常終了したすぐ後にそのまま2013で実行した結果がエラーとなって
2016と2013は同一PCに同居できないと思うのですが、2013は別PCですか?
そうだとすると、FILE_PATH_CHKが異なってくる可能性もあり得ますよね?
 
2013の時のFILE_PATH_CHKが適切なパスを示しているか確認されたらどうでしょうか。

投稿日時: 25/11/17 10:26:18
投稿者: robin7500

参照しているフォルダはネットワークフォルダになります。
 
@
2016のPCで実行した結果のFILE_PATH_CHKの内容と
2013のPCで実行した結果のFILE_PATH_CHKの内容をEXCELに保存して比較しましたが
同一でした。
 
A
@で保存したEXCELを2013のPCで開き、先頭に”=”を付与した結果、VBAで実行した結果と同じ
エラーが表示されました。
2016のPCで同じことをした結果は無事に参照できています。
 
B
@で取得したファイルパスの任意のEXCELを2013のPCで開き、任意のセルを空のファイルから
参照して空のファイルを保存し、参照元を閉じた後の空のファイル上の参照元を参照しているセルを
コピーして先頭の”=”を削除した結果で表示されるファイルパスを@のファイルパスと比較しましたが
同じ値でした。
その後、手動で”=”を付与した結果、VBAで実行した結果と同じエラーが表示されました。
 
Bの結果が不思議で仕方ないのですが、手動で参照した結果の”=”を削除してまた”=”を
付与しただけなのになぜエラーとなるのでしょうか。
Bの事象は今回のVBAで参照しているネットワークフォルダ以外でも再現することができ、
R1C1参照形式に関係なく発生します。
また、参照元ファイルを開いた状態では発生せず、閉じた状態の時のみ発生します。
 
VBAというよりネットワーク上の問題のような気がしているのですが、
このまま続けてよろしければ、引き続きよろしくお願いします。

回答
投稿日時: 25/11/17 15:55:26
投稿者: Suzu

引用:
Bの事象は今回のVBAで参照しているネットワークフォルダ以外でも再現することができ、
R1C1参照形式に関係なく発生します。
また、参照元ファイルを開いた状態では発生せず、閉じた状態の時のみ発生します。

 
Excel の設定差 であるなら、ブックの計算 「自動」や「手動」の違い
 
あとは
エクセルの別ファイル参照でREF・N/Aエラーの原因|外部
https://nyanto.jimdofree.com/%EF%BD%B4%EF%BD%B8%EF%BD%BE%EF%BE%99%E9%96%A2%E6%95%B0-%E5%95%8F%E9%A1%8C%E8%A7%A3%E6%B1%BA/%E3%82%A8%E3%82%AF%E3%82%BB%E3%83%AB%E3%81%A7%E5%88%A5%E3%82%B7%E3%83%BC%E3%83%88%E5%8F%82%E7%85%A7%E6%99%82%E3%81%AB-ref-%E3%82%84-n-a%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%AE%E5%8E%9F%E5%9B%A0%E3%81%AF/
 
の様に、\\IPアドレス指定の場合、エラーになるPCがあります。
 不確かではありますが、Windows 側の設定差で
  ファイル共有の SMBCプロトコルのバージョン、名前解決に何を使用しているかに依った記憶があります。
 
参考までに
他ブックを参照できる関数、他ブックを参照できない関数
https://excel-ubara.com/excel3/EXCEL026.html
 
 
なんでエラーになるかを解決する為、プロトコルの差や、Windowsの設定差を突き詰めるよりは
どうせVBAを使っているのですから、設定等に依存せず参照できれば良い。
かつ、連続セルの値を取得している様ですからですから、数式で参照させるのではなく、
 VBAを使ってそのブックを開き、値を取得して数式ではなく、値として貼り付けた方が
良いと思いますよ。

投稿日時: 25/11/17 16:28:48
投稿者: robin7500

引用:
なんでエラーになるかを解決する為、プロトコルの差や、Windowsの設定差を突き詰めるよりは
どうせVBAを使っているのですから、設定等に依存せず参照できれば良い。
かつ、連続セルの値を取得している様ですからですから、数式で参照させるのではなく、
 VBAを使ってそのブックを開き、値を取得して数式ではなく、値として貼り付けた方が
良いと思いますよ。

 
おっしゃる通り設定等に依存(変更)せず2016,2013,2010で同じ結果が得られるのがベストです。
ネットを調べている際に1つづつブックを開くやり方も目にしたのですが、
パフォーマンス的には遅いのかなとかロジックが素人には難しかった印象があったので
今回の方法にしました。
トラストセンターの設定も同じでしたし2013PCのネットワーク設定もいじってみたのですが
解決には至っていません。
 
いただいた情報をあらためて確認させていただいた上で総合的に判断させていただき、
あらためてお礼させていただきます。

回答
投稿日時: 25/11/17 19:06:44
投稿者: 半平太

robin7500 さんの引用:
1つづつブックを開くやり方も目にしたのですが、
パフォーマンス的には遅いのかなとか・・。
ExecuteExcel4Macroもそんなに速くないです。
 
結果をセルに出すのなら「VBAで数式をセル埋める」方が断然速いです。
その方式なら、今回のトラブルにおいても、
値化する前の数式で比較も出来るので容易にトラブルシュート可能です。

投稿日時: 25/11/18 16:34:23
投稿者: robin7500

いろいろとアドバイスありがとうございました。
 
原因を突き止めたいところではありますが、業務上の時間制限もありますので
Suzuさんのおっしゃる通り数式参照ではなく値として取得する方法に変更してみたいと思います。
 
abecさん
Suzuさん
半平太さん
ありがとうございました。