Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1124 / 13645 ツリー ←次へ | 前へ→

【76193】シート名の先頭が変化するシートを特定したい ペンネーム船長 14/10/12(日) 23:30 質問[未読]
【76194】Re:シート名の先頭が変化するシートを特定... γ 14/10/13(月) 6:02 発言[未読]
【76195】Re:シート名の先頭が変化するシートを特定... γ 14/10/13(月) 9:32 発言[未読]
【76202】Re:シート名の先頭が変化するシートを特定... ペンネーム船長 14/10/13(月) 18:43 お礼[未読]

【76193】シート名の先頭が変化するシートを特定し...
質問  ペンネーム船長  - 14/10/12(日) 23:30 -

引用なし
パスワード
   【質問】
『test』フォルダーの中に複数のエクセルがあります。
それぞれのエクセルのシート名が『01あいうえお』だったり『05あいうえお』だったり『89あいうえお』だったりします。
下記のコードは、シート名が『01あいうえお』の場合だけ機能します。
これを、上記のシート名でも動くコードにしたいのです。
御教授お願いします。
なお、シート名『あいうえお』は不変で、必ずその頭に2桁の数字が来ます。
一桁の数字の表現は『1』ではなく、『01』となります

Private Sub CommandButton1_Click()
  Worksheets("調査結果").Range("B8:B1000").Value = "" 'クリア
  Dim buf As String, Target As String, i As Integer, n As Integer, nn As Integer
  Const Path = "C:\Users\○●\Desktop\test\"
  buf = Dir(Path & "*.xls")

  Do While buf <> ""
    For i = 1 To 1000
    n = 0
    nn = 0
    Target = "'" & Path & "[" & buf & "]01あいうえお!R" & i & "C7"
     If ExecuteExcel4Macro(Target) = "2-" Then
       nn = n + 1 'セルに『2-』があったときに1を加える
       Exit For
     End If
    Next i
     If nn = 0 Then '合計が0のとき、そのエクセルの名前を書き出す
        Worksheets("調査結果").Cells(Rows.Count, 2).End(xlUp).Offset(1, 0) = buf
     End If
    buf = Dir()
  Loop
End Sub

【76194】Re:シート名の先頭が変化するシートを特...
発言  γ  - 14/10/13(月) 6:02 -

引用なし
パスワード
   こんにちは。
ht tp://excel-ubara.com/excelvba5/EXCELVBA242.html
を参考にして下さい。
ExecuteExcel4Macroは特定の場合に限って使うべきで、
シート名が特定出来ない場合は、適当ではありません。

エラー処理と組み合わせてシート名を割り出す方法で可能は可能でしょうし、
シート名を直接取得する方法があるのかもしれませんが、
古い時代のマクロについては資料も乏しく、
そこに資源を投入して検討することは、殆ど時間の無駄と思われます。

普通に開いて、worksheetsコレクションを
Like で調べるのがよろしいかと思います。

しかも多数のセルを走査するのであれば、時間的にも
普通に開いてFindを使う方が、4,5倍は速くなるはずです。
先日の投稿の例で実験してみて下さい。

【76195】Re:シート名の先頭が変化するシートを特...
発言  γ  - 14/10/13(月) 9:32 -

引用なし
パスワード
   >エラー処理と組み合わせてシート名を割り出す方法で可能は可能でしょうし、
は間違いです。
例えばこんな風です。

Function getSheetName(bookName As String) As String
  Dim sheet As String
  Dim target As String
  Dim s
  Dim k As Long

  For k = 1 To 99
    sheet = Format(k, "00") & "あいうえお"
    target = "'" & Path & "[" & bookName & "]" & sheet & "'!R1C1"
    s = ExecuteExcel4Macro(target)
    If TypeName(s) <> "Error" Then Exit For
  Next
  getSheetName = sheet
End Function
(Path などはモジュールレベルで定義済みとします。)

なお、上記を勧めているわけではなく、論理的な誤りを修正しただけです。

【76202】Re:シート名の先頭が変化するシートを特...
お礼  ペンネーム船長  - 14/10/13(月) 18:43 -

引用なし
パスワード
   γさん  kanabunさん 
アドバイス有難う御座いました。
みなさんのコードを使わせて頂いて下記のようなコードに変更したら、上手くゆきました。
ExecuteExcel4Macro は無闇に使わない方が良いという記事は参考になりました。
これからも宜しくお願いします。

Private Sub CommandButton1_Click()
On Error Resume Next 'エラーを無視する
  Dim buf As String
  Dim wb As Workbook
  Dim sh As Worksheet
  Dim sh2 As Worksheet
        
  Set sh2 = Worksheets("調査結果")
  Const path = "C:\Users\○●\Desktop\test\"
        
  buf = Dir(path & "*.xls")
        
  Do While buf <> ""
    Set wb = Workbooks.Open(path & buf)
    MsgBox "これからチェックするブックは『" & buf & "』です"
    For Each sh In Worksheets
      MsgBox "チェックするシートは『" & sh.Name & "』です"
      
      If sh.Name Like "*あいうえお*" Then
       Set obj = sh.Range("G:G").Find(what:="2-")
       MsgBox "objの内容は『" & obj & "』です"
 
         If obj Is Nothing Then
          MsgBox "『2-』が無いブック名は『" & buf & "』です"
          sh2.Cells(Rows.Count, 2).End(xlUp).Offset(1, 0) = buf
         End If
       Else
         MsgBox "このシートは調査対象ではありません"
      End If
      
    Next sh
    wb.Close False
    buf = Dir()
  Loop
End Sub

1124 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free