[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『階層の違うブックからシートをコピーしたい』(メガネ)
C:\Users\●●\Desktop\〇〇\結果に入ってるブックでマクロを実行し
C:\Users\●●\Desktop\〇〇\部品単価に入っている価格表のシートを
マクロを実行したブックの最後のシートに追加したいのですが
  importWb.Worksheets("りすと").Copy After:=macroWb.Worksheets(macroWb.Worksheets.Count)
上記の部分でエラーが出てしまいます。
なんでエラーになるのかわからないので、教えていただけないでしょうか?
よろしくお願いします。
Sub リスト転記()
    Dim ws As Worksheet
    ' メッセージを非表示
    Application.DisplayAlerts = False
    ' 一覧シートがあるか確認あったら削除
    For Each ws In Worksheets
      If ws.Name = "りすと" Then
        ws.Delete
      End If
    Next ws
    ' メッセージを表示
    Application.DisplayAlerts = True
    Dim FolderPath, FilePath, FileName
    'フォルダパスを指定
    FolderPath = ThisWorkbook.Path & "\..\部品単価"
    'フォルダ内のファイル名を取得
    FileName = Dir(FolderPath & "\*")
    'ファイルパスを作成
    FilePath = FolderPath & "\" & FileName
    'ファイルを開く
    Workbooks.Open FileName:=FilePath
    'インポート先
    Dim importWb As Workbook
    Dim importPath As String
    'マクロを実行元のWorkbook
    Set macroWb = ThisWorkbook
    'インポート先の文字列を取得
    importPath = FilePath
    'データをインポート(シートの内容をコピー)
    Set importWb = Workbooks.Open(importPath)
    importWb.Worksheets("りすと").Copy After:=macroWb.Worksheets(macroWb.Worksheets.Count) 'Afterの場合、指定したシートの後ろに
    importWb.Close
End Sub
< 使用 Excel:unknown、使用 OS:unknown >
そのほかの気づき。
・同じファイルを二回開いていますが、意図したものですか?
・宣言していない変数(macroWb)があります。きちんと宣言したほうが安全です。
 モジュールの冒頭に、Option Explicitを書いてください。
 VBEのオプション設定で「変数宣言を強制する」にチェックを入れると、
 モジュールが作成されたときに、自動でそれを挿入してくれます。
 (生涯で一度、設定を実行するだけです。推奨します。)
・コメントが多すぎる印象。
 必要な情報が目立ちません。ほどほどがよいと思います。
 (老婆心なので気にしないでください。)
(γ) 2022/04/19(火) 06:41
■1
↓は思うとおりのパスになってますか?
FolderPath = ThisWorkbook.Path & "\..\部品単価"
[..\]とされているので、ThisWorkbook.Pathを起点に【相対的】にみたフォルダとされたいのだとおもいますが、上記だと↓のような文字列になっちゃいませんかね
C:\Users\●●\Desktop\〇〇\結果\..\部品単価
もしも[..\]を使いたいなら、↓のように先にカレントディレクトリを変えないとダメじゃないかなとおもいます。
ChDir ThisWorkbook.Path FolderPath = "..\部品単価"
※相対パスは自信がないので、他の回答さんの意見を聞いたり↓を参照いただいたほうが良いと思います。 [[20181228220926]] 『絶対パスではなく相対パスを取得する。』(アイス)
なお、絶対パスでよいのであれば、以下のように普通に文字列操作すればよいですね。
 (1)「ThisWorkbook.Path」で↓を調べる(取得する)
       C:\Users\●●\Desktop\〇〇\結果
 (2)(1)で取得した文字列を右から見て始めて"\"が出てくるのは全体の何文字目かInStrRev関数で調べる
       InStrRev("C:\Users\●●\Desktop\〇〇\結果","\")
 (3)Left関数を使って、(1)の文字列から(2)文字目までを取り出す
       Left("C:\Users\●●\Desktop\〇〇\結果", InStrRev("C:\Users\●●\Desktop\〇〇\結果", "\"))
 (4)(3)と"部品単価"を合体させる
       Left("C:\Users\●●\Desktop\〇〇\結果", InStrRev("C:\Users\●●\Desktop\〇〇\結果", "\")) & "部品単価"
■2
「りすと」シートがあれば削除する部分ですが↓のようにする方法もあるとおもいます。
    On Error Resume Next
    ThisWorkbook.Worksheets("りすと").Delete
    On Error GoTo 0
ただ、シートを"削除"するべきなのかは一旦再考した方がよろしいのではないでしょうか?
>価格表のシートをマクロを実行したブックの最後のシート
ということは、価格表を【更新】したいのですよね?
仮に、その価格表を参照するような数式を組んでいた場合、シートを削除した段階で参照が切れてしまいます。
※INDIRECT関数を使ってあるなどであれば別ですが
なので【更新】であれば、"クリア"してコピペというアプローチのほうが良いように思います。
■3
↓の部分について、ダメではないですが
Dim FolderPath, FilePath, FileName
慣れてきたら↓のように型も指定するようにすると良いですね。
Dim FolderPath As String, FilePath As String, FileName As String
■4
↓について、おそらくExcelブックを対象にした処理だとおもいますので、
FileName = Dir(FolderPath & "\*")
↓のように、Excelブックに限定したほうが安パイでしょう
FileName = Dir(FolderPath & "\*.xls?")
※指定のフォルダに1つしかファイルを保存しないというルールなら問題無いですが、そうで無い場合 「\*」だと関係ない(Excelブック以外の)ファイルもヒットしちゃいます。
更に言うと、そもそも【ブック名】は固定されていていたりしませんか?その場合、Dir関数で"探す"必要がそもそもないですよね。
※ブックが度々更新されるのでファイル名が決まってないということなら、"探す"必要があるのはわかりますが、 そうなると該当するファイル(Excelブック)が複数あった場合どうするのかということも少々心配です。
■5
既に指摘がありますが↓は同じブックを2回開くことになりますよ。
Workbooks.Open FileName:=FilePath Set importWb = Workbooks.Open(importPath)
■6
変数の宣言が無いと指摘されている↓ですが、そもそも変数に入れる必要あるんでしょうか?
Set macroWb = ThisWorkbook
"ThisWorkbook"と書けばそれでおしまいですが・・・
■7
というようなことを踏まえて整理すると↓のような感じになろうかと思います。
興味があれば【ステップ実行】して研究してみてください。
    Option Explicit
    Sub 研究用()
        Dim フォルダパス As String
        Dim ファイル名 As String
        Dim srcWB As Workbook
        With ThisWorkbook
            Stop 'ブレークポイントの代わり
            '■2参照
            Application.DisplayAlerts = False
            On Error Resume Next
            .Worksheets("りすと").Delete
            On Error GoTo 0
            Application.DisplayAlerts = True
            フォルダパス = Left(.Path, InStrRev(.Path, "\")) & "部品単価"
            '■4参照
            ファイル名 = Dir(フォルダパス & "\*.xls?")
            Set srcWB = Workbooks.Open(フォルダパス & "\" & ファイル名)
            '■2参照
            srcWB.Worksheets("りすと").Copy After:=.Worksheets(.Worksheets.Count)
            srcWB.Close False
        End With
    End Sub
(もこな2) 2022/04/19(火) 23:09
    Const cWshName As String = "りすと"
    Dim sFName As String
    Dim sMyPath As String
    Dim wbkTarget As Workbook
    Dim wsh As Worksheet
    sMyPath = Replace(ThisWorkbook.Path, "結果", "部品単価")
    sFName = Dir(sMyPath & "\*")
    If Len(sFName) = 0 Then Exit Sub
    Set wbkTarget = Workbooks.Open(sMyPath & "\" & sFName)
    On Error Resume Next
    Set wsh = wbkTarget.Worksheets(cWshName)
    On Error GoTo 0
    If wsh Is Nothing Then
        MsgBox "「リスト」シートが見つかりません。"
    Else
        On Error Resume Next
        ThisWorkbook.Worksheets(cWshName).Delete
        On Error GoTo 0
        wsh.Copy After:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count)
    End If
    wbkTarget.Close False
End Sub
作業の手順を再考してみては?
(まっつわん) 2022/04/20(水) 13:28
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
 Modified by kazu.