[[20240618165616]] 『複数シート合算時、リンクや入力規則を解除する方』(KICHI) ページの最後に飛ぶ

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

 

『複数シート合算時、リンクや入力規則を解除する方法』(KICHI)

Excelで、複数のシートを1つのブックに合算した時に、
各シートはもともとデータの入力規則でリストを設定しており、名前の管理も設定しているため、合算後のファイルを開こうとすると、
「ブック内の一部リンクはすぐに更新できません。
値を更新せずにそのままにするか、間違っていると思われるリンクを編集してください。」というメッセージが表示されます。
このメッセージが出ないように、シートを合算するときに、最後に入力規則・名前の管理を解除するマクロはないでしょうか。
20シート以上あるので、合算後手動で解除するのが厳しいためです。
宜しくお願い致します。

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


>シートを合算するときに、最後に入力規則・名前の管理を解除するマクロはないでしょうか。
単純に↓でよさそうに思います(試してないので断言はしませんが)が、何処で詰まっていますか?
 1.ブックの名前の定義を巡回して(削除できるものは)削除する
 2.ブックの各シートを巡回して、
   2-1.シートの名前の定義を巡回して(削除できるものは)削除する
   2-2.シートの入力規則をクリアする

とりあえず現状のコードを示して、具体的に説明(エラーが出るならその箇所・エラー番号・エラーメッセージを提示、エラーにはならないが想定通りにならないなら○○になるはずが××になるというように状況を提示)いただくとアドバイスできることがあるかもしれません。

(もこな2 ) 2024/06/18(火) 18:16:49


VBAの質問なんですか?
合算とはどのようにしているのでしょうか?
(確認) 2024/06/18(火) 19:21:40

合算は、お恥ずかしながらVBAではなく単純に合算するマクロです。

Application.DisplayAlerts = False

    Workbooks.Open Filename:="C:\ファイル\データ\りんご.xlsx"
'
       Sheets("?@りんごA").Select
    Sheets("?@りんごA").Copy Before:=Workbooks("合算ファイル.xlsm").Sheets(1 _
        )
    Windows("りんご.xlsx").Activate
    ActiveWindow.Close

    Sheets("りんごA").Name = "?@りんご"
    Range("A1").Select

    Workbooks.Open Filename:="C:\ファイル\データ\みかん.xlsx"

           Sheets("?AみかんA").Select
    Sheets("?AみかんA").Copy Before:=Workbooks("合算ファイル.xlsm").Sheets(2 _
        )
    Windows("みかん.xlsx").Activate
    ActiveWindow.Close

    Sheets("みかん").Name = "?Aみかん"
    Range("A1").Select

  これが20個くらい続き・・
  最後に、シートコピー・値にして終了です。
  この後に、入力規則・名前の管理を解除できればと思います。

   
   ActiveWindow.ScrollWorkbookTabs Position:=xlLast

    Sheets(Array("?@りんご", "?Aみかん", "?Cすいが", "?Dぶどう", "?Eいちご", "?Fバナナ", "?Gメロン" _
        , "?Hいちじく", "?Iもも", "?Jパイナップル", "?Kいよかん", "?Lさくらんぼ", "?Mマンゴー", "?Nパパイヤ", "?Oキウイ", _
        "?Pグレープフルーツ", "?Qでこぽん", "?Rあんず", " ?Sマスカット")).Select

    Sheets(Array("?@りんご", "?Aみかん", "?Cすいが", "?Dぶどう", "?Eいちご", "?Fバナナ", "?Gメロン" _
        , "?Hいちじく", "?Iもも", "?Jパイナップル", "?Kいよかん", "?Lさくらんぼ", "?Mマンゴー", "?Nパパイヤ", "?Oキウイ", _
        "?Pグレープフルーツ", "?Qでこぽん", "?Rあんず", " ?Sマスカット")).Copy
    ActiveWindow.TabRatio = 1

    Application.DisplayAlerts = True

 

(KICHI) 2024/06/20(木) 09:19:41


↑すみません まる1、まる2が ?マークにばぐっています
(KICHI) 2024/06/20(木) 09:20:57

質問以外も含めて何点か。

■1
>VBAではなく単純に合算するマクロです。

 マクロ・・・機能の名前
 VBA ・・・・Visual Basic for Applicationsの略でプログラミング言語

ということなので、提示されたものはVBAで書かれたマクロです。

 (マクロとVBAは厳密には違いますが、Excelにおいては、しばしば同一視されています)

■2
>まる1、まる2が ?マークにばぐっています
この掲示板では丸付き数字などの【環境依存文字】は、見る環境によっては文字化けするので使用を避けた方がよいとおもいます。

 (シート名に使っているようなのでどうしようもないのかもしれませんが)

■3
VBAの世界では基本的にブックやシートなど(オブジェクトと言います)は、いちいち選択したりアクティブにしたりしなくとも操作可能です。
また、【標準モジュール】にシートの指定を省略したコードを記述すると、ActiveSHeetを指定したとみなされるルールです。
わかっていてやるならば止めませんが、可読性向上の観点から、きちんとオブジェクトを指定するようにすることをお勧めします。

■4
>これが20個くらい続き・・
パターンが決まっていたりするのであれば、全部記述しなくても【ループ処理】という手法で単純化できます。
たとえば、【C:\ファイル\データ】というフォルダにある、「りんご、みかん、すいか、ぶどう、いちご」という名前のブックを片っ端から開いて、1番目のシートを自ブックに"集約"して、名前を変更するには↓のようにすればよいです。

    Sub 研究用01()
        Dim 名前 As Variant
        Dim フォルダ As String
        Dim ブック名 As String
        Dim srcWB As Workbook
        Dim i As Long

        フォルダ = "C:\ファイル\データ"
        With ThisWorkbook
            '▼ダミーシートを挿入してから、ダミーシート以外を削除
            Worksheets.Add after:=.Worksheets(.Worksheets.Count)
            Application.DisplayAlerts = False
            For i = .Worksheets.Count To 2 step ‐1
                .Worksheets(i).Delete
            Next i
            Application.DisplayAlerts = False

            '▼フォルダの中から条件(名前)に一致するブックを探して、1番目のシートを自ブックの末尾にコピー挿入
            For Each 名前 In Split("りんご、みかん、すいか、ぶどう、いちご", "、")
                ブック名 = Dir(フォルダ & "\" & 名前 & ".xls?")
                If ブック名 <> "" Then
                    Set srcWB = Workbooks.Open(フォルダ & "\" & ブック名)
                    srcWB.Worksheets(1).Copy after:=.Worksheets(.Worksheets.Count)
                    .Worksheets(.Worksheets.Count).Name = 名前
                    srcWB.Close False
                End If
            Next 名前

            '▼ダミーシートを削除(ダミーシート以外のシートが無いとエラーになるので、一応シート枚数を数えてから実行)
            If .Worksheets.Count > 1 Then Worksheets(1).Delete
        End With
    End Sub

■5
肝心の質問のほうは、既に述べたアプローチは検討はされたのでしょうか?
「2-1」は要らないっぽいので↓のようなアプローチで解決しそうですが、思う通りの結果になりませんでしたか?

     Sub 研究用2()
        Dim SH As Worksheet
        Dim MyName As Name

        With ThisWorkbook
            On Error Resume Next
            For Each MyName In .Names
                MyName.【名前の定義を削除する命令】
            Next MyName
            On Error GoTo 0

            For Each SH In .Worksheets
                SH.Cells.【入力規則】.【削除する命令】
            Next SH
        End With
    End Sub

(もこな2 ) 2024/06/20(木) 12:38:11


コメント返信:

[ 一覧(最新更新順) ]


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