Excel (VBA)

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

 
(Windows 10 Pro : Excel 2016)
SharePointの指定フォルダ内にあるファイルを開く方法について
投稿日時: 21/03/03 21:47:06
投稿者: torao

お世話になっております。
 
データの保存先を社内サーバーから
クラウド上へと移行するにあたりプログラムの見直しを行っております。
 
下記のコードは、実行ファイルのあるフォルダ内のEXCELファイルを
ファイル名の一部から検索し順次データを取りこむ
 
という処理になります。
 
社内サーバでは問題なく動作しておりましたが
試しに、SharePoint内で同じようなフォルダ構成をつくり
動作確認をすると
 
 FolderFile = Dir(FolderPath & "\データ*.xlsm")
 
の部分でエラーとなります。
どうも、フォルダ内のファイル名が取得できずエラーが発生しているようでした。
 
※そこで・・・ファイル名を直接指定すると問題なく開けました。
 
質問です
 
下記のコードをSharePoint上でフォルダ内のファイルを順次参照させたいのですが
ファイル名の取得方法が分からず困っております。
 
皆様何卒アドバイスのほどよろしくおねがいします。
 
(プログラム本体があるフォルダ内のファイルを名前の一部から参照し取りこむまでのコード抜粋)
 
※フォルダ内には、テスト用EXCELブック名「データA、データB、データC・・・」と10コほどあります
※実際のファイル名は「ファイル名+部署名+日付」となっております。
 
Dim xlsApp As Application
 Set xlsApp = Application
 
Dim FolderPath As String '自身のフォルダパス格納
 FolderPath = xlsApp.ThisWorkbook.Path
 
Dim FolderFile As String '検索値:対象ファイル名(データA・データB・・・
 FolderFile = Dir(FolderPath & "\データ*.xlsm")
 
Dim WbB As Workbook
 
Do While Not FolderFile = ""
 
 '転記元ブックを開く(Book内の外部参照停止,読み取りで開く,読み取りアラート)
 Set WbB = xlsApp.Workbooks.Open(fileName:=FolderPath & "\" & FolderFile, _
                                        UpdateLinks:=False, ReadOnly:=True, _
                                        Ignorereadonlyrecommended:=True)
'データ取込処理
 
 WbB.Close SaveChanges:=False '開いたブック閉じる
 FolderFile = Dir() 'ファイル名リセットし次のブックへ
 
Loop
 
 
 
 

回答
投稿日時: 21/03/04 09:15:04
投稿者: Suzu

DIR関数 での制限があります。
 
エクセルの神髄
Dir関数の制限について
https://excel-ubara.com/excelvba4/EXCEL262.html
 
256バイトを超えるパス名が扱えない は該当しませんか?
 
 
クラウドでの確認ができないので、原因は判りかねますが
FileSystemObject をテスト使用してみてください。
 
あまり知られていないDir関数の特徴
https://www.moug.net/tech/exvba/0100048.html

投稿日時: 21/03/04 10:39:55
投稿者: torao

Suzu さん
 
ありがとうございます。
 
ファイルパスの文字数を数えたのですが、長くて100文字でした。
 
取り急ぎご報告致します。

回答
投稿日時: 21/03/04 18:25:37
投稿者: WinArrow
投稿者のウェブサイトに移動

>の部分でエラーとなります。
 
エラーメッセージの内容は?

回答
投稿日時: 21/03/04 18:32:50
投稿者: WinArrow
投稿者のウェブサイトに移動

確認です。
 
本当に赤字の個所でエラーになっているのでしょうか?
 
もしかしたら
Dir()
でエラーになっているとしたら・・・・・
開いたブックの中に自動実行プロシジャがあり、
そのなかで Dir関数を使っていませんか?
 

投稿日時: 21/03/04 18:42:17
投稿者: torao

WinArrow さま
 
エラーメッセージの内容です。
 

引用:
実行時エラー'52,:
ファイル名または番号が不正です。

 
となります。

回答
投稿日時: 21/03/04 21:02:27
投稿者: eden

最近体験しました。
テキストファイルを作成するopenで、ファイル名を確認してもらうと
(変数に矢印をのせて)
途中で?が。?は実際には絵文字ということで、変えてもらいました。
シフトJISにない文字とか使ってませんか。

回答
投稿日時: 21/03/04 22:26:45
投稿者: WinArrow
投稿者のウェブサイトに移動

外しているかもしれませんが
もしかしたら・・・ということで
 
>FolderPath = xlsApp.ThisWorkbook.Path
の変数の値を教えていただけますか?

投稿日時: 21/03/05 08:38:25
投稿者: torao

WinArrowさん
パスは下記のように表示されています。
赤の部分は会社名・フォルダ名等になります。
 
FolderPath="https://会社名.sharepoint.com/sites/43210/ABC/フォルダA/勤務表フォルダ"
 
フォルダ構成
・勤務表フォルダ内にある
 EXCELブック「取り込みツール」がプログラム本体で、ブック内のシートに
 同じフォルダ内のファイル名「勤務表*」がつくものを全て取り込みます。
 ※「勤務表・・・」以外にも関係ないファイルがあります。
 
SharePoint

会社名
├フォルダA
 ├勤務表フォルダ
   └取り込みツール.xlsm
   └勤務表 001 データA.xlsm
   └勤務表 002 データB.xlsm
   └勤務表 003 データC.xlsm
   └勤務表 004 データD.xlsm
   └勤務表 005 データE.xlsm
   └勤務表 006 データF.xlsm
   └勤務表 007 データG.xlsm
   └勤務表 008 データH.xlsm
   └勤務表 009 データI.xlsm
   └○○○.txt
   └○○○.xlsm
   └○○○.gif
 ├○○○
 ├○○○
├フォルダB
├○○○
├○○○
 
 
エラー52は下記で発生します。
FolderFile = Dir(FolderPath & "/データ*.xlsm")

投稿日時: 21/03/05 08:41:28
投稿者: torao

訂正します
 
エラー52は下記で発生します。
FolderFile = Dir(FolderPath & "/データ*.xlsm")
 
  ↓
  正
 
※先に示したフォルダ構成に修正しました
 
エラー52は下記で発生します。
FolderFile = Dir(FolderPath & "/勤務表*.xlsm")

投稿日時: 21/03/05 08:50:44
投稿者: torao

Dir関数の引数にはワイルドカードを使えます
 
とありますが、クラウド上では動作しないのでしょうか。

回答
投稿日時: 21/03/05 09:15:28
投稿者: WinArrow
投稿者のウェブサイトに移動

>FolderPath="https://会社名.sharepoint.com/sites/43210/ABC/フォルダA/勤務表フォルダ"
 
Dir関数に指定するパス(ファイル名を除く)は絶対パスでないと
エラー52になります。
https//
は使えません。

投稿日時: 21/03/05 10:43:48
投稿者: torao

WinArrowさん
 
同じような症状について記載がありました。まさしくこれですね^^;
 
https://teratail.com/questions/250814
 
Sub message()
 Dim フォルダー名 As String
 Dim ブック名 As String
  フォルダー名 = ThisWorkbook.Path & "\"
  ブック名 = Dir("フォルダー名" & "*.xlsx")
 Do While ブック名 <> " "
  MsgBox ブック名
  ブック名 = Dir()
 Loop
End Sub
 
5行目において、変数「フォルダー名」にダブルクォーテーションを付けた状態で上記の問題が発生します。ダブルクォーテーションがないと、5行目で「ファイル名または番号が不正です。」とエラーが出てしまいます。
 
上記読む限り、難しそうな印象です。
 
手っ取り早く
 Dir関数で扱えるように(決め打ち)
 シート内のどこかにファイル名を記入し参照できるようにしたほうが良いかなと
今考え中です。

回答
投稿日時: 21/03/05 11:00:03
投稿者: simple

私もSharePointを使ったことないですが、
"同期"処理をして、それを使うと上手くいくというような記事を見ました。
ところで、個人ユースではなく企業としてお使いなんですよね。
IT関連組織にお尋ねになると、環境を踏まえた適切な回答が得られるのではないですかね。
同様なことは色々なところで起きているはずなので。

回答
投稿日時: 21/03/05 11:22:24
投稿者: WinArrow
投稿者のウェブサイトに移動

私もSharePointを使ったことないです。
OneDriveもネットワークを使っていますが、
C:\Iser\○○\OneDrive
というようなフォルダと同期する形態になっています。
従って、ローカルのC:\Iser\○○\OneDrive配下にフォルダ/ファイルを置くことで
普通の絶対パスでアクセスできます。
SharePointには、このような仕組みがないのでしょうか?
 

投稿日時: 21/03/05 11:48:48
投稿者: torao

返信ありがとうございます。
 
システム担当者に確認するとセキュリティ上
OneDrive、SharePoint共に、ブラウザ上からのアクセスしか認められておらず
C:\Iser\○○\OneDrive のような方法が出来ないそうです。
 
ですので、
・ファイルのあるフォルダを特定・・・・OK
・ファイル名を決め打ち・・・これでやるしかないか・・・・
 
テストして以下で動作確認できました。
 
    Dim WbB As Workbook
    Dim folderPath As String
    Dim FolderFile As Variant
  folderPath = xlsApp.ThisWorkbook.path '自身のフォルダパス格納
  FolderFile = Range(sh_マスタ.Cells(2, 17), sh_マスタ.Cells(10, 17)) '対象ファイル名
    Dim itm As Variant
    'データ取込
    For Each itm In FolderFile
        xlsApp.StatusBar = "[処理中...] " & itm
        '転記元ブックを開く(Book内の外部参照停止,読み取りで開く,読み取りアラート)
        Set WbB = xlsApp.Workbooks.Open(fileName:=folderPath & "\" & itm & ".xlsm", _
                                        UpdateLinks:=False, ReadOnly:=True, _
                    Ignorereadonlyrecommended:=True)
 
Stop
        WbB.Close SaveChanges:=False
    Next itm
 

投稿日時: 21/03/12 12:13:11
投稿者: torao

皆様ありがとうございました。
 
アドバイスをもとに試行錯誤やってみたいと思います。