質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

2回答

17046閲覧

ファイルが存在するのに存在しないとエラーが発生する・特定の条件のときは処理をスキップしたい

seina

総合スコア12

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2017/09/25 02:55

Set WB = Workbooks.Open(Filename:=filefolder & "まとめ.xlsx")でファイルが存在しませんとエラーが発生します。確かにこのフォルダーに存在するファイルなのですが。。。スペルミスも確認しましたが見当たりません。

またもう一点、Dirで返すファイル名の条件分けは変換する前のファイル名に数字は入っていないのでIf InStr(openname, "1234567890") というコードに変更して実行しました。結果コードは問題なく実行されましたが、私が欲しかったファイル名を変更したものではコードを実行しないという条件が満たされませんでした。

どなたかコードで改善点が見当たる方、またエラー解決への手順を教えてくださる方がいれば嬉しいです。よろしくお願いします。

Sub north_snow() Dim Mstr As String Dim filefolder As String Dim openname As String Dim orgShCnt As Long, iCnt As Long filefolder = "\\rfs\EC_INTL\Common\IEC\DATA\TB\01_RDC\" Set WB = Workbooks.Open(Filename:=filefolder & "まとめ.xlsx") openname = Dir(filefolder & "*.xls?") Do Until openname = "" If InStr(openname, "_") <> 0 Then openname = Dir() Else If openname <> ThisWorkbook.Name And openname <> "まとめ.xlsx" And openname Like "*-*" Then Set CB = Workbooks.Open(Filename:=filefolder & openname) CB.Worksheets(CB.Worksheets.Count).Copy after:=WB.Worksheets(WB.Worksheets.Count) CB.Close savechanges:=False Mstr = Replace(openname, ".xlsx", "") Mstr = Format(DateValue(Mid(Mstr, InStr(Mstr, "-") + 1, 3) & "/1"), "yyyy_mm") & openname Name filefolder & openname As filefolder & Mstr End If End If openname = Dir() Loop Application.DisplayAlerts = False WB.Sheets(1).Delete Application.DisplayAlerts = True WB.Save WB.Close Set CB = Nothing Set WB = Nothing End Sub

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ネットワークドライブだから、という回答がついていますが、私の環境で試したところ、ネットワークドライブでも問題なくオープンすることができました。
アクセス権の問題でしょうかねぇ。
あとはパスが本当に正しいか再確認してください。
filefolderまとめ.xlsxを連結した文字列(\rfs\EC_INTL\Common\IEC\DATA\TB\01_RDC\まとめ.xlsx)をコピーして、エクスプローラーの上部にあるエリアに貼り付けて開けるか試してみてください。
もしくはファイル名を指定して実行でも可。
こういう場合は目視で確認するよりも上記のように確実な方法で行ったほうが良いでしょう。

投稿2017/09/25 04:14

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

seina

2017/09/25 05:54

アドバイスありがとうございます。上記の方法を試したところエラーがなくなりました!! 次回から確認はより正確な方法でしますね!やり方をご教授いただきありがとうございます。
guest

0

指定しているパスがネットワークドライブだからじゃないでしょうか。
エクスプローラーでそのファイルが見えている状態ではエラーが起きないなら、該当するかと。

その場合は、net useコマンドで、ネットワーク接続を確立してから行えば、解消するんじゃないかな。

こちらの「ネットワーク上の共有ドライブに接続するサンプルプログラム」が参考になるかと。

もう1点の方は、やりたいことと、やっていることが良く理解できませんでした。

投稿2017/09/25 03:34

編集2017/09/25 04:46
sazi

総合スコア25173

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

seina

2017/09/25 04:26

回答ありがとうございます。ネットワークドライブだとそのようなエラーが発生するのですね!いただいたリンクを参照しながらさっそく課題解決に向けて取り組んでいるのですが、サーバー名やパスワードってどこに記載してあるものでしょうか?初心者で分からないことばかりで、ネットで検索しましたが良く分かりませんでした。アドバイスいただけたら嬉しいです。 また2点目ではIf構文以下のエラーについての相談です。If構文でファイル名の変更をかけました。しかし何度もこのプログラムを使うとその処理が実行した回数分行われてしまいます。(当たり前なのですが...)そこで1度処理をしてファイル名が変更になったものは、再度処理を実行しないという風にしたいです。今最初のIf構文で変更後のファイル名のみが含む(_)の時はDir()にして処理を中止しようとしましたが、うまくいきませんでした。考える原因何かありますでしょうか? お返事いただけたら嬉しいです。よろしくお願いします。
sazi

2017/09/25 04:52

回答そのものではないですが、誤解しないように、ちょっと追記しました。 dir()は実行の度に取得しますからね。 dir()のままでいくなら、編集用のフォルダを作っておいてそちらに出力して、終わったら正規の場所に移動する方法もありかと。 FileSystemObjectを使用したループなら取得時点で内容は固定されるはずなので、大丈夫じゃないかと。 詳細は時間が取れた時に、追記してみます。
seina

2017/09/25 05:57

お忙しい中回答ありがとうございます。 私の知識の範囲では想像もつかないようなやり方ばかりで、とても’勉強になります。ご丁寧な返信とても分かりやすく参考になります。ありがとうございます。
sazi

2017/09/25 10:05

net useについては、ユーザー名やパスワードをロジックで指定する事になります。 使用しているPCが共有にドメインで参加しているのかワークグループで参加しているのかによっても指定の方法が変わります。 net useで行う事を(ネットワークドライブの割り当て)によって手動で行う事も可能ですけれど、seinaさんの実行されようとする環境はどのようなものですか? 2点目については、FileSystemObjectを使用したサンプルの案内は出来ますが、再帰呼出を使用するなど手間が掛かるかもしれません。 なので、今ファイル名での除外条件を確認した方が良さそうですね。 ぱっと見では最初の「If InStr(openname, "_") <> 0 Then」のopenname = Dir()は不要ですね。 これがあると、次のファイルは読むだけになってしまいます。 ロジックからは処理後リネームしたものには"_"があり、未処理のものは"_"が無いという条件が満たされれば、この部分だけで良さそうに見えます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問