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

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

ただいまの
回答率

90.51%

  • VBA

    1808questions

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

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

受付中

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 4,669

seina

score 4

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
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

0

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

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/25 13:26

    回答ありがとうございます。ネットワークドライブだとそのようなエラーが発生するのですね!いただいたリンクを参照しながらさっそく課題解決に向けて取り組んでいるのですが、サーバー名やパスワードってどこに記載してあるものでしょうか?初心者で分からないことばかりで、ネットで検索しましたが良く分かりませんでした。アドバイスいただけたら嬉しいです。

    また2点目ではIf構文以下のエラーについての相談です。If構文でファイル名の変更をかけました。しかし何度もこのプログラムを使うとその処理が実行した回数分行われてしまいます。(当たり前なのですが...)そこで1度処理をしてファイル名が変更になったものは、再度処理を実行しないという風にしたいです。今最初のIf構文で変更後のファイル名のみが含む(_)の時はDir()にして処理を中止しようとしましたが、うまくいきませんでした。考える原因何かありますでしょうか?

    お返事いただけたら嬉しいです。よろしくお願いします。


    キャンセル

  • 2017/09/25 13:52

    回答そのものではないですが、誤解しないように、ちょっと追記しました。

    dir()は実行の度に取得しますからね。
    dir()のままでいくなら、編集用のフォルダを作っておいてそちらに出力して、終わったら正規の場所に移動する方法もありかと。

    FileSystemObjectを使用したループなら取得時点で内容は固定されるはずなので、大丈夫じゃないかと。
    詳細は時間が取れた時に、追記してみます。

    キャンセル

  • 2017/09/25 14:57

    お忙しい中回答ありがとうございます。

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

    キャンセル

  • 2017/09/25 19:05

    net useについては、ユーザー名やパスワードをロジックで指定する事になります。
    使用しているPCが共有にドメインで参加しているのかワークグループで参加しているのかによっても指定の方法が変わります。
    net useで行う事を(ネットワークドライブの割り当て)によって手動で行う事も可能ですけれど、seinaさんの実行されようとする環境はどのようなものですか?

    2点目については、FileSystemObjectを使用したサンプルの案内は出来ますが、再帰呼出を使用するなど手間が掛かるかもしれません。
    なので、今ファイル名での除外条件を確認した方が良さそうですね。
    ぱっと見では最初の「If InStr(openname, "_") <> 0 Then」のopenname = Dir()は不要ですね。
    これがあると、次のファイルは読むだけになってしまいます。
    ロジックからは処理後リネームしたものには"_"があり、未処理のものは"_"が無いという条件が満たされれば、この部分だけで良さそうに見えます。

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/25 14:54

    アドバイスありがとうございます。上記の方法を試したところエラーがなくなりました!!

    次回から確認はより正確な方法でしますね!やり方をご教授いただきありがとうございます。

    キャンセル

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

  • ただいまの回答率 90.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • VBA

    1808questions

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

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