[[20221223211522]] 『エラー「シート名が正しくありません」』(りりー) ページの最後に飛ぶ

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

 

『エラー「シート名が正しくありません」』(りりー)

オートフィルターで抽出したデータをシートごとに分ける下記マクロでArray内の品名に「*」をつけて抽出しても品名ごとのシート名になるようにするにはどのような変更をすればよいか教えてください。
Sub TEST2()

  Dim A
  '種別リストを作成
  A = Array("いちご*", "みかん*", "めろん*", "ばなな*", "ぶどう*", "かき*") 
  For i = 0 To UBound(B)
    '種別でフィルタ
    Sheets(1).Range("A3").AutoFilter 2, A(i)
    'シートを追加
    Sheets.Add after:=Sheets(Sheets.Count)
    ActiveSheet.Name = A(i) 'シート名を変更
    'フィルタ結果を転記
    Sheets(1).Range("B3").CurrentRegion.Copy Range("B3")
    Sheets(1).Range("B3").AutoFilter 'オートフィルタを解除
  Next 
End Sub

< 使用 Excel:Microsoft365、使用 OS:Windows11 >


Office TANAKA - Excel VBA Tips[シート名に設定できる文字列かどうかを判定する]
http://officetanaka.net/excel/vba/tips/tips68.htm

(白茶) 2022/12/23(金) 21:42:34


既に紹介されたサイトを見れば解りますが、
アスタリスク「*」はシート名に使えません。
A(i)に対して、Replace関数で「*」を消してみるとか。

(木天蓼) 2022/12/23(金) 21:58:40


ワイルドカードも使えません。
ワイルドカードは、シート名を比較する時しか使えません。
実際のシート名でしか使えません。

実際、人に聴く前に自分でやってみれば解るでしょうに

Sheets("Sheet*").Select

(自分で色々試しなさい) 2022/12/23(金) 22:58:57


原因は皆さんが仰るとおりですし、解決方法は既に木天蓼さんが提示されていますが、別アプローチで。
    Sub 別案()
        Stop 'ブレークポイントの代わり
        Dim キーワード As Variant
        Dim dstSH As Worksheet

        With Sheets(1)
            .Range("A3").AutoFilter
            For Each キーワード In Array("いちご", "みかん", "めろん", "ばなな", "ぶどう", "かき")
                .AutoFilter.Range.AutoFilter Field:=2, Criteria1:="=" & キーワード & "*"

                If .Cells(.Rows.Count, "B").End(xlUp).Row > 3 Then
                    Set dstSH = Sheets.Add(after:=Sheets(Sheets.Count))
                    dstSH.Name = キーワード
                    .AutoFilter.Range.Copy dstSH.Range("B3")
                End If
            Next キーワード
            .AutoFilterMode = False
        End With
    End Sub

↑のように、オートフィルタで抽出するときだけワイルドカードを使って前方一致にしてはどうでしょうか?

(もこな2) 2022/12/24(土) 07:29:22


みなさん もこな2さん ありがとうございます。お示しいただいたコードは、私にも理解ができ助かります。しかし「オブジェクト変数または With ブロック変数が設定されていません。」とエラーになりました。
キーワードを検索語としても使い、シート名としても使う場合どのように変更すればよいか教えてください。
(りりー) 2022/12/25(日) 13:32:49


う〜んこちらでは正常にうごいてますけどねぇ・・
考えられることとしては、コード実行前にオートフィルタが設定されていたりしませんかね。

その場合↓でオートフィルタが解除される

 .Range("A3").AutoFilter

結果↓が存在しなくなるからエラーになる

 .AutoFilter.Range〜〜

もしそうであれば↓のように、オートフィルタをいったん解除してから設定するようにしてみてはどうでしょうか?

 With Sheets(1)
     .Range("A3").AutoFilter
       ↓
 With Sheets(1)
     .AutoFilterMode = False  ←いったん解除してから
     .Range("A3").AutoFilter    ←改めてオートフィルタを設定

(もこな2) 2022/12/25(日) 15:05:38


もこな2さん 助かりました。理解できるコードでエラーも解消され思ったような動きが実現できました。
ありがとうございます。

(りりー) 2022/12/25(日) 23:33:18


コメント返信:

[ 一覧(最新更新順) ]


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