[[20230225091743]] 『データを項目別にシート分割(マクロ)がエラーと』(ヤッターマン) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『データを項目別にシート分割(マクロ)がエラーとなる』(ヤッターマン)

下記のURLのマクロを既に作成しているExcelにシート追加して使いたいのですが、下記のようなエラーが出てしまいます。

「申し訳ございません。C:\Users\他の人のユーザー名\Downlods\data_sheets_divide_others.xlsm.が見つかりません。名前が変更されたか移動や削除が行われた可能性があります。」

https://excel-macro.com/data-sheets-divide/

上記のエラーをさせる為には何か方法はありますでしょうか。

URLのコードは下記となります。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
Sub data_sheets_divide()

Application.ScreenUpdating = False '画面更新非表示
Cells(2, 3).ClearContents
Cells(2, 4).ClearContents

'ダイアログからファイルを開く
FilePath = Application.GetOpenFilename
Pos = InStrRev(FilePath, "\") 'ファイル名の文字位置を検索
FileName = Mid(FilePath, Pos + 1) 'ファイル名の取得

    If FilePath <> "False" Then
        'ブックが開いているか確認してから開く
        For Each wb In Workbooks
            If wb.FullName = FilePath Then
                Workbooks(FileName).Close '確認メッセージ表示させて閉じる
            End If
        Next wb
        Workbooks.Open FilePath, ReadOnly:=True   '読み取り専用で開く
    Else
        Exit Sub
    End If

    'ダイアログからシートを選択
    Set ws = ShowSelectSheetDialog()
    ws.Activate

    Application.StatusBar = "処理中です..."

    ws.Activate

    Dim c As Integer '対象列用
    '列取得
    Dim s As String
    Dim rng As Range

    Do '列が決まるか中止するまでのループ
        s = InputBox("項目名=(改行のみで終了)") '項目名取得
        If s = "" Then Exit Sub '空白なら終了
        Set rng = ws.Range(Cells(1, 1), Cells(1, Columns.Count)).Find(s, LookAt:=xlWhole) '項目名を1行目で探す
        If Not rng Is Nothing Then Exit Do '見つけたら抜ける
        MsgBox "項目名に[" & s & "]が見つかりません。"
    Loop

    If MsgBox("[" & rng.Value & "]で分けますか?", vbYesNo) <> vbYes Then Exit Sub '最終確認

    Application.ScreenUpdating = False '画面更新非表示
    c = rng.Column '対象列

    'AdvancedFilterで指定列のデータの重複しない候補を取得(AC列を作業列とする)
    Dim d As Variant
    'AC列に作業列を挿入
    Range("AC:AC").Insert
    '指定列の重複しない値をAC列に作成
    ws.Columns(c).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=ws.Range("AC1"), Unique:=True
    'AC列の値を配列に取得
    d = ws.Range("AC1", ws.Range("AC" & Rows.Count).End(xlUp))
    'AC列の作業列を削除
    Range("AC:AC").Delete

    'オートフィルタでシート別にコピー
    Dim i As Integer
    '指定列の重複しないデータを順に(1行目は見出しなので2行目から)(挿入位置の関係で最後から)
    For i = UBound(d) To 2 Step -1
        'シート追加(この時挿入したシートがActiveSheetになっている)
        Sheets.Add After:=ws
        'ActineSheet(挿入したシート)の名前を重複しないデータの注目データに設定
        ActiveSheet.Name = d(i, 1)
        '重複しないデータの注目データで対象列をオートフィルタ
        ws.Cells.AutoFilter field:=c, Criteria1:=d(i, 1)
        'オートフィルタで抽出した範囲をActineSheet(挿入したシート)のA1からにコピー
        ws.AutoFilter.Range.Copy ActiveSheet.Range("A1")
    Next

    '対象シートのオートフィルタ解除(後始末)
    ws.AutoFilterMode = False

    ws.Select

    ThisWorkbook.Sheets(1).Cells(2, 3) = ws.Name
    ThisWorkbook.Sheets(1).Cells(2, 4) = FilePath

    Application.StatusBar = False
    Application.ScreenUpdating = True '画面更新表示
MsgBox "完了しました"

End Sub

' // シート選択ダイアログを表示
' // 戻り値: 選択されたシートオブジェクト
Public Function ShowSelectSheetDialog() As Worksheet

    Dim ShBackup As Worksheet
    Application.ScreenUpdating = False
    Set ShBackup = ActiveSheet
    With CommandBars.Add(Temporary:=True)
        .Controls.Add(ID:=957).Execute
        .Delete
    End With

    Set ShowSelectSheetDialog = ActiveSheet

    ShBackup.Select
    Application.ScreenUpdating = True

End Function

< 使用 Excel:Excel2016、使用 OS:Windows10 >


 >       For Each wb In Workbooks
 >           If wb.FullName = FilePath Then

 ここでブックの確認とかしているのだったら
 カウントとかすれば良いんじゃない?
(♀) 2023/02/25(土) 09:47:26

話の前提を確認します。
そのエラーは、
・どのプロシージャの
・どの行を実行したときに
出たのでしょうか?
(abc) 2023/02/25(土) 09:53:25


 フォームコントロールに、他ブックのマクロを登録していて、
 そのマクロが入っているブックを削除したか移動したか名前を変えたかって感じで
 マクロが見つからなくなってます
(´・ω・`) 2023/02/25(土) 10:17:12

data_sheets_divide_others.xlsmというブックは、
そのサイトにあるサンプルブックですよね。
何故、他の人のダウンロードフォルダにあるそのブックを参照しているのでしょうか。
なんだか話の文脈が理解できません。
既に作成しているExcel とか、まだ説明されていないことがあるのでは?
(abc) 2023/02/25(土) 11:59:46

(♀)さん
(´・ω・`)さん
(abc)さん
返信いただき有難う御座います。
シートに追加せずにマクロを利用すると下記の行を実行したときにエラーとなっていたのですが、シート追加せずにそのまま利用することにしました。

【エラー部分】
FilePath = Application.GetOpenFilename
Pos = InStrRev(FilePath, "\") '

こちらのマクロ(シート追加せずそのまま使用)で、データ分割後の2つの項目をセルに入力させたいのですが、そのようなコードご存じないでしょうか。

分割されたシートの特定の文字列の2行目の項目を抜き出したいです。

例:
分割後のシート1

     A      B     C  
1   商品ID   商品名   会社名
2 4005 モンブラン A会社

分割後のシート2
     A      B     C  
1   商品ID   商品名   会社名
2 4000 ショートケーキ B会社

上記の商品ID、商品名の2行目の文字列を抜き出しセルに入力する。

〜    F     G
1    商品ID  商品名
2 4005 モンブラン
3 4000 ショートケーキ
(ヤッターマン) 2023/02/26(日) 06:02:07


 ちょっとよくわかりません。追加の質問に入る前に、もう少し説明をしてもらえますか?

 FilePath = Application.GetOpenFilename
 を実行するとファイルを選択する画面が出ると思いますが、
 そこでどのような指定をしたのでしょうか?

 変数の宣言とかはしない主義なんですか? 
 ダウンロードしたブックにあるマクロもそういう書き方なんでしょうか。

(abc) 2023/02/26(日) 08:08:29


(abc)さん
失礼しました。

FilePath = Application.GetOpenFilename

 を実行するとファイルを選択する画面が出ると思いますが、
 そこでどのような指定をしたのでしょうか?
 変数の宣言とかはしない主義なんですか? 
 ダウンロードしたブックにあるマクロもそういう書き方なんでしょうか
→こちらダウンロードしたブックのマクロコードが上記のような内容となっておりました。
ファイルを選択する画面が出てくるので、そこで該当のExcelを選択してから、シートを選択し、項目名を入れると項目毎にシートが分かれるようになっております。

この分割した項目名(今回は商品ID)と商品名に紐づく情報をシートに記載できればと思っております。
また、出来れば分割対象(元データ)の2行名からをカウントし対象数やシート数の情報も出せればと思うのですが、やり方が良く分からず…
(ヤッターマン) 2023/02/26(日) 19:56:22


https://axcis.co.jp/vba/?utm_source=yahoo&utm_medium=cpc&yclid=YSS.1001131688.EAIaIQobChMIu-iGnrHw-wIVUq6WCh3e_A-CEAAYASAAEgLGTfD_BwE
(相談) 2023/02/26(日) 20:35:01

FilePath = Application.GetOpenFilename
では、実際にあるファイルを見て指定しているはずです。
エラーになったときに、何を指定したのかの返答もいただけませんでしたので、
回答を続ける気持ちがなくなりました。
他の回答者さんの回答をお待ちください。

(abc) 2023/02/26(日) 21:41:58


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.