[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『複数のブックを開いた状態で指定した文字を含むブックをアクティブにする』(メロウ)
いつもお世話になっております。よろしくお願いします。
今回は、複数のブックを開いている時、指定した文字を含むブックをアクティブにする方法を教えてほしいです。
下記のようなコードを組みました。
内容は、今開いているブックじゃないブックを選択し、そのブックの各シートの指定セルを判定して、処理をする、というようなものです。
問題は、3つ以上ブックを開いた時、希望するブックをアクティブに出来ないところです。
ブック名は絶対変わらない文字列「小スケール」&数字(可変)なので、「小スケール」が入るブックを指定したいです。
どなたかご教授よろしくお願いします。
また、コード読んでいただける方いましたら、この方が良い!等のアドバイス等頂けると嬉しいです。
Sub test()
Dim wb As Workbook
For Each wb In Workbooks
If wb.Name <> ActiveWorkbook.Name Then wb.Activate Exit For End If Next wb
GO = MsgBox(ActiveWorkbook.Name & " で完了分を初期化します。" & vbCrLf & "よろしいですか?", vbOKCancel + vbQuestion)
If GO = vbOK Then
Dim r As Long For r = 4 To Worksheets.Count
If Worksheets(r).Range("K3") > 0 Then Worksheets(153).UsedRange.Copy Worksheets(r).Range("A1") Excel.Application.CutCopyMode = False On Error Resume Next Worksheets(r).Cells.SpecialCells(xlCellTypeComments).ClearComments End If Next r MsgBox "完了分の初期化が完了しました" Else MsgBox "キャンセルされました", vbExclamation End If
End Sub
< 使用 Excel:Excel2007、使用 OS:WindowsXP >
Sub test()
Dim wb As Workbook Dim r As Long For Each wb In Workbooks If wb.Name <> ActiveWorkbook.Name And wb.Name Like "小スケール*" Then wb.Activate GO = MsgBox( _ ActiveWorkbook.Name & " で完了分を初期化します。" & _ vbCrLf & "よろしいですか?", vbOKCancel + vbQuestion) If GO = vbOK Then For r = 4 To wb.Worksheets.Count If wb.Worksheets(r).Range("K3") > 0 Then ThisWorkbook.Worksheets(153).UsedRange.Copy _ wb.Worksheets(r).Range("A1") On Error Resume Next wb.Worksheets(r).Cells _ .SpecialCells(xlCellTypeComments).ClearComments On Error GoTo 0 End If Next r MsgBox "完了分の初期化が完了しました" Else MsgBox "キャンセルされました", vbExclamation End If End If Next wb End Sub
こういう事でしょうか?
(ウッシ) 2015/11/25(水) 13:52
カブリましたが。 目的のブックをアクティブにするところまでのコードです。
Sub Test() Dim wb As Workbook Dim targetWb As Workbook
For Each wb In Workbooks If wb.Name <> ThisWorkbook.Name And wb.Name Like "小スケール*" Then Set targetWb = wb Exit For End If Next
If targetWb Is Nothing Then MsgBox "目的のブックは開かれていません" Else targetWb.Activate 'ここで必要な処理を End If
End Sub
(β) 2015/11/25(水) 13:57
なお、この処理は、当該ブックをアクティブにしなくても実行できますよ。 実行結果を最後に目で見せるためにアクティブにするということであればわかりますが。
(β) 2015/11/25(水) 14:30
β様
ありがとございます!
まさに希望通りです!!
この作業はアクティブにしなくても出来るのですか?!
私が書いたコードではたぶんアクティブになってないとダメだと思うのですが、
お時間あればどのように書いたら良いか教えて頂きたいです!
実行結果は、最後にメッセージで出れば良いので大丈夫です。
よろしくお願いします。
(メロウ) 2015/11/25(水) 14:48
「小スケール」&数字のブックをアクティブにして実行してしまったのでは?
Sub test()
Dim wb As Workbook Dim r As Long Dim GO As Variant For Each wb In Workbooks If wb.Name Like "小スケール*" Then GO = MsgBox( _ ActiveWorkbook.Name & " で完了分を初期化します。" & _ vbCrLf & "よろしいですか?", vbOKCancel + vbQuestion) If GO = vbOK Then For r = 4 To wb.Worksheets.Count If wb.Worksheets(r).Range("K3") > 0 Then ThisWorkbook.Worksheets(153).UsedRange.Copy _ wb.Sheets(r).Range("A1") On Error Resume Next wb.Worksheets(r).Cells _ .SpecialCells(xlCellTypeComments).ClearComments On Error GoTo 0 End If Next r MsgBox "完了分の初期化が完了しました" Else MsgBox "キャンセルされました", vbExclamation End If End If Next wb End Sub
ついでですが、マクロブックには153枚以上のシートがあるのですか?
(ウッシ) 2015/11/25(水) 15:15
もう一度試しましたが、別のブックがアクティブだと、そのブックが対象になりました。
マクロブックにも、小スケールブックにも、153以上のシートを持っています。
ちなみに、
ThisWorkbook.Worksheets(153).UsedRange.Copy _
wb.Sheets(r).Range("A1") この箇所ですが、 ThisWorkbook ではなく、wb.Worksheets(153).UsedRange.Copy wb.Sheets(r).Range("A1") となります。
マクロブックは、やり方を明記したブックで、作業は小スケールブック内で行われます。
お時間さいて頂き、ありがとうございます!
(メロウ) 2015/11/25(水) 16:01
>>この作業はアクティブにしなくても出来るのですか?!
シート処理コードにブック修飾をしてやれば、そのブックがアクティブでなくても処理可能です。 ブックやシートやセルをアクティブにして処理するコードを【状況依存コード】と呼んだりしますが そういうコードは保守性に劣るもので、基本的には避けるべきです。
なお、153枚以上のシート! ウッシさんと同じく、ぎょっとしています。 これはこれで、問題がある構成かもしれません。 また、153枚目と固定で扱うのも、う〜ん と思いますね。 同じブックに存在させるとしても、シート名を決めておいて("テンプレート"とか)あつかうべきだと思いますね。 また、その 153枚目のブックは、処理の対象外にしなければいけないのでは? (処理対象になっても結果オーライでしょうけど)
いずれにしても、現行の構えで2例ほど。 書いただけで動かしてはいませんので不具合あれば御容赦。
Sub Test1() Dim wb As Workbook Dim targetWb As Workbook Dim r As Long
For Each wb In Workbooks If wb.Name <> ThisWorkbook.Name And wb.Name Like "小スケール*" Then Set targetWb = wb Exit For End If Next
If targetWb Is Nothing Then MsgBox "目的のブックは開かれていません" Else 'ここで目的のブックを処理 If MsgBox(targetWb.Name & " で完了分を初期化します。" & vbCrLf & "よろしいですか?", vbOKCancel + vbQuestion) = vbOK Then For r = 4 To targetWb.Worksheets.Count If targetWb.Worksheets(r).Range("K3") > 0 Then targetWb.Worksheets(153).UsedRange.Copy targetWb.Worksheets(r).Range("A1") On Error Resume Next targetWb.Worksheets(r).Cells.SpecialCells(xlCellTypeComments).ClearComments On Error GoTo 0 End If Next r MsgBox "完了分の初期化が完了しました" Else MsgBox "キャンセルされました", vbExclamation End If End If
End Sub
Sub Test2() Dim wb As Workbook Dim targetWb As Workbook Dim sh As Worksheets
For Each wb In Workbooks If wb.Name <> ThisWorkbook.Name And wb.Name Like "小スケール*" Then Set targetWb = wb Exit For End If Next
If targetWb Is Nothing Then MsgBox "目的のブックは開かれていません" Else 'ここで目的のブックを処理 If MsgBox(targetWb.Name & " で完了分を初期化します。" & vbCrLf & "よろしいですか?", vbOKCancel + vbQuestion) = vbOK Then For Each sh In targetWb.Worksheets If sh.Index >= 4 Then If sh.Range("K3") > 0 Then targetWb.Worksheets(153).UsedRange.Copy sh.Range("A1") On Error Resume Next sh.Cells.SpecialCells(xlCellTypeComments).ClearComments On Error GoTo 0 End If End If Next sh MsgBox "完了分の初期化が完了しました" Else MsgBox "キャンセルされました", vbExclamation End If End If
End Sub
(β) 2015/11/25(水) 16:17
そうなんですね〜。まだまだ勉強不足です。
このファイルは客先指定なので、現在は構成を変更する提案をする予定はありません。
とりあえず現状で作業しやすくなれば、と思い今回のコード組みました。
シート数はこれ以上増える予定はなく、153番シートは使用される可能性が限りなく0に近いため指定しています。
使用もされないので、作業対象になることもない予定です…(過去を見てもないので)
もっと使いやすいファイルに出来るんでしょうけど…。
test1を使用させて頂きます!
こんなにスマートになるんですね…!
ありがとうございました!
(メロウ) 2015/11/26(木) 12:04
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.