Excel VBA 質問スレッド №1564 (解決済)

select caseの使い方について

投稿者 : ぴか     投稿日時 : 2023/09/14(Thu) 11:15:43     OS : 未指定     EXCEL : 未指定
五層目に格納されたフォルダの内、Sheets(1)のRange("F" & i)のセル内に書かれた文字列の左から10個の文字を含むフォルダがあれば、コピペする、とういう内容のロボットを作りたいです。
また、格納場所については、Sheets(1)のRange("D" & i)のセル内に書かれた文字列の左から3文字が「大阪府」であれば、指定した処理をしたうえで、指定したフォルダに格納し、「大阪市」、「その他」であれば、それぞれ別の処理を行いたいです。

まず、困っているのは★印をつけた「Case Left(.Sheets(1).Range("D" & i), 3) = "大阪府"」についてです。
実際のセルには、「大阪府」の文字が入っていて、イミディエイトウィンドウに「?Left(.Sheets(1).Range("D" & i), 3) = "大阪府"」と入力してみても「True」と表示されるのですが、以下の作業は飛ばされ、★★に移ってしまいます。
何かお気づきの点ありましたらご教授くださいませ。


Sub 大阪府()

    Application.ScreenUpdating = False
    Dim fso As New FileSystemObject
    Set fso = New FileSystemObject
    Dim fld1 As Folder, fld2 As Folder, fld3 As Folder, fld4 As Folder, fld5 As Folder
    
        Dim i As Long
        For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
               
        With ActiveWorkbook
        
            Set fld = fso.GetFolder("Z:\〇〇\〇〇〇")

            
            For Each fld2 In fld.SubFolders
                For Each fld3 In fld2.SubFolders
                    For Each fld4 In fld3.SubFolders
                        For Each fld5 In fld4.SubFolders
                            Select Case fld5.Name Like "*" & Left(.Sheets(1).Range("F" & i), 10) & "*"
                            
                                ★Case Left(.Sheets(1).Range("D" & i), 3) = "大阪府"
                                    .Range("D" & i) = Replace(.Sheets(1).Range("D" & i), "大阪府", "")
                                    .Range("D" & i) = Replace(.Sheets(1).Range("D" & i), "大阪", "")
                                    fld5.Copy Destination:="C:\Users\〇〇\Desktop\〇〇\〇〇\大阪府\*" & Left(.Sheets(1).Range("D" & i), 3) & "*"
        
                                ★★Case Left(.Sheets(1).Range("D" & i), 3) = "大阪市"
                                    fld5.Copy Destination:="C:\Users\〇〇\Desktop\〇〇\〇〇\オ大阪市\*" & Mid(.Sheets(1).Range("D" & i), 4, 3) & "*"
                                    
                                Case Else
                                    fld5.Copy Destination:="C:\Users\〇〇\Desktop\〇〇\3.市町村\*" & Left(.Sheets(1).Range("D" & i), 2) & "*"
                                                               
                            End Select
                        Next
                    Next
                Next
            Next
        End With
        Next

End Sub

スポンサーリンク
[返信 1] Re : select caseの使い方について
投稿者 : higeru     投稿日時 : 2023/09/14(Thu) 11:41:43
 コードは★のあたりしか見てませんが、残念ながら Select Case の使い方がめちゃくちゃです。
 ググればいくらでも出てきますが、

  【条件分岐(Select Case)|VBA入門】
   https://excel-ubara.com/excelvba1/EXCELVBA322.html

でも見てください。

[返信 2] Re : select caseの使い方について
投稿者 : higeru     投稿日時 : 2023/09/14(Thu) 11:51:37
 失礼しました。ちょっと早とちりだったようで、Select Case 自体は必ずしも間違ってないようですね。
 とりあえず前言撤回します。

[返信 3] Re : select caseの使い方について
投稿者 : higeru     投稿日時 : 2023/09/14(Thu) 12:02:05
 何度もすみません。もうちょっと(だけ)見てみましたが、

■[質問] ぴかさん(2023-09-14 11:15:43)の記事
> まず、困っているのは★印をつけた「Case Left(.Sheets(1).Range("D" & i), 3) = "大阪府"」についてです。
> 実際のセルには、「大阪府」の文字が入っていて、イミディエイトウィンドウに「?Left(.Sheets(1).Range("D" & i), 3) = "大阪府"」と入力してみても「True」と表示されるのですが、以下の作業は飛ばされ、★★に移ってしまいます。

 ということは

> ★Case Left(.Sheets(1).Range("D" & i), 3) = "大阪府"

これは "Case True"

> ★★Case Left(.Sheets(1).Range("D" & i), 3) = "大阪市"

こっちは "Case False" と同義ですから、つまりは

> Select Case fld5.Name Like "*" & Left(.Sheets(1).Range("F" & i), 10) & "*"

ここの fld5... の結果が False ということです。

[返信 4] Re : select caseの使い方について
投稿者 : ( 'ふ')     投稿日時 : 2023/09/14(Thu) 13:10:50
Select Caseは
Select Case 式
    Case 答
  End Select
となるので、式に対しての答がCaseで選ばれることになります。
式をfld5.Name Like "*" & Left(.Sheets(1).Range("F" & i), 10) & "*"にした場合答はTrueかFalseしかありません。
なので答をLeft(.Sheets(1).Range("D" & i), 3) = "大阪府"のようにしても思うような処理は出来ないでしょう。

ぴかさんの思うようなコードにする場合
If fld5.Name Like "*" & Left(.Sheets(1).Range("F" & i), 10) & "*" Then
Select Case Left(.Sheets(1).Range("D" & i), 3)
Case "大阪府"
処理
      Case "大阪市"
処理
Case Else
処理
End Select
End If
のようにすれば良いと思います。

[返信 5] Re : select caseの使い方について
投稿者 : ( 'ふ')     投稿日時 : 2023/09/14(Thu) 13:11:56
手書きだったのでインデントが変になりました。
すみません。

[返信 6] Re : select caseの使い方について
投稿者 : ぴか     投稿日時 : 2023/09/14(Thu) 13:51:17
higeruさん
アドバイスありがとうございます。


Select Case fld5.Name Like "*" & Left(.Sheets(1).Range("F" & i), 10) & "*"

> ここの fld5... の結果が False ということです。


やはりそうですか、私も怪しいと思っていました、、
「fld5」にカーソルを合わせると、まったく条件に当てはまらないフォルダ名が出てくるのです^^;

[返信 7] Re : select caseの使い方について
投稿者 : ぴか     投稿日時 : 2023/09/14(Thu) 13:56:56
( 'ふ')さん
コメントありがとうございます。

参考となるブログを見てみますと、
https://excel-ubara.com/excelvba1/EXCELVBA322.html

Select Case 対象・変数
Case 条件式
 処理内容
Case 条件式
 処理内容
Case Else
 その他の処理内容
End Select

という形で、合っているようなのですが、この形では処理できないのでしょうか?


> Select Caseは
> Select Case 式
>     Case 答
>   End Select
> となるので、式に対しての答がCaseで選ばれることになります。

[返信 8] Re : select caseの使い方について
投稿者 : ぴか     投稿日時 : 2023/09/14(Thu) 14:33:24
( 'ふ')さん

おっしゃる意味が分かった気がします。
試してみます。
ありがとうございました。

[返信 9] Re : select caseの使い方について
投稿者 : ぴか     投稿日時 : 2023/09/14(Thu) 16:00:21
解決できそうです。

お二方、ありがとうございました。

■[返信 8] ぴかさん(2023-09-14 14:33:24)の記事
> ( 'ふ')さん

> おっしゃる意味が分かった気がします。
> 試してみます。
> ありがとうございました。

当掲示板について
  • Excel VBA に関する掲示板です。Excel VBA に関する質問や疑問、それに対する解決方法など気軽に投稿してください。
  • 記事内ではHTMLのタグは使用できません。
  • 記事は一度投稿すると修正できません。内容を訂正したい場合は返信で対応してください。
  • Sub〜End Sub、Function〜End Function は自動的にプログラムコードとみなし、枠で囲って見やすくします。
  • Excel VBA とは関係ないことや、他人が不快に思うようなことなど、管理人が適当でないと判断した記事は削除する場合があります。
スポンサーリンク
返信入力フォーム
お 名 前  :
内  容   :

ステータス  :

認証コード  : キャプチャ画像 




( 処理日時 : 2023-10-01 23:55:41 )
タイトルとURLをコピーしました