[[20151125161340]] 『マクロで条件分岐でシートを指定』(忘却者) ページの最後に飛ぶ

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

 

『マクロで条件分岐でシートを指定』(忘却者)

いつもお世話になります。
どうしても思い出せないのでどなたかご教示下さい。

【処理内容】

マクロで使用するシートを指定(同じBook内です。)してから
次の処理に進みたいのですが、
どのようにすればよろしいでしょうか。
あまりにもひどい状態で申し訳ございません。

 Dim ans As Integer
 Dim sht As Worksheet

ans = MsgBox("今回のリストは月単位ですか?", vbQuestion + vbYesNo)

If ans = vbOK Then

sht("月").Select

Else

sht("週").Select

End If

Set sht = ThisWorkbook.Sheets("ans") ※指定できずマクロが停まります。

大変お手数をお掛けいたしますがよろしくお願いいたします。

< 使用 Excel:Excel2013、使用 OS:Windows7 >


 こうか?
    Dim ans As Integer
    Dim sht As Worksheet

    ans = MsgBox("今回のリストは月単位ですか?", vbQuestion + vbYesNo)
    If ans = vbYes Then
        Set sht = Worksheets("月")
    Else
        Set sht = Worksheets("週")
    End If

 vbYesNoの場合、返値はvbYesかvbNo

(ねむねむ) 2015/11/25(水) 16:38


ねむねむさん

コメント頂きまして有難うございます。
YesがOkになっていることに気がつきませんでした。
おかげ様で処理ができました。

関連してご教示頂きたいのですが、
条件分岐で選択されたシートを指定するにはどのようにすればよろしいでしょうか。

以前は、
Set sht = ThisWorkbook.Sheets("変更前のシート")で処理をしていました。

大変お手数をお掛けいたしますが
よろしくお願いいたします。
(忘却者) 2015/11/25(水) 17:09


     Dim ans As Integer
    Dim sht As Worksheet

    ans = MsgBox("今回のリストは月単位ですか?", vbQuestion + vbYesNo)
    If ans = vbYes Then
        Set sht = Worksheets("月")
    Else
        Set sht = Worksheets("週")
    End If

 これで「はい」を選択した場合にshtで「月」シートを、「いいえ」でshtで「週」シートにアクセスできるようになっているが
 実際に行いたいのはどのようなことか?
(ねむねむ) 2015/11/25(水) 17:13

ねむねむさん

早速コメント頂きまして有難うございます。
シートを指定した後に、呼び出した別ファイルから担当者別にデータを貼り付けた後、
指定したフォルダに保存する処理を考えております。
(忘却者) 2015/11/25(水) 17:30


 もう一つWorksheetの変数を用意してそちらにセットでいいのでは?

(ねむねむ) 2015/11/26(木) 09:14


ねむねむさん

コメント頂きまして有難うございます。
ご提案の方法を試してみたのですが、
マクロが停まりました。。。

原因と思われる箇所はこちらかと思われます。
下の○○の部分に条件分岐で選択した変数を入力すればよろしいかご教示下さい。
Set sht = ThisWorkbook.Sheets("○○")←Sheet名を指定しないので、マクロが停まるようです。

念のためコードの全体を掲載いたします。

(処理の流れ)
1 データ基のファイルを選択
2 作成ファイルの保存先 
3 (同じBook内の)貼付先Sheetの指定(条件分岐)
4 3のSheet内の日付入力(2種類)
5 データ基ファイルより担当者別に分ける 
6 貼付先に貼り付ける
7 ファイルを保存する
8 データ基がなくなるまで繰り返す
9 完了

 Sub ファイル作成()

    Dim z As Long
    Dim x As Long
    Dim ans As Integer
    Dim 連絡日 As Date
    Dim 年度 As String
    Dim sht As Worksheet
    Dim sht2 As Worksheet
    Dim c As Range
    Dim tSh As Worksheet
    Dim fList As Range
    Dim i As Long
    Dim svPath As String
    Dim fName As String
    Dim ff As Variant
    Dim fd As Object
    Dim Shell As Object, myPath As Object
    Dim hWnd As Long
    Dim r As Range
    Dim nBK As Workbook

    Const BIF_RETURNNONLYFSDIRS = &H1 'ディレクトリのみ選択可
    Const BIF_EDITBOX = &H10 'アイテム名入力用のEdit_boxを表示

   'ブックの選択
    ff = Application.GetOpenFilename("Excelブック,*.xls*", , "ファイルを選択してください")
    If ff = False Then Exit Sub     'キャンセルボタン

    '保存フォルダの選択
    hWnd = Application.hWnd
    Set Shell = CreateObject("Shell.Application")
    Set fd = Shell.BrowseForFolder(hWnd, "保存フォルダを選んでください", _
                                        BIF_RETURNNONLYFSDIRS Or BIF_EDITBOX)

    If fd Is Nothing Then Exit Sub      'キャンセルボタン

    svPath = fd.Items.Item.Path & "\"

    '連絡Sheetの選択

    ans = MsgBox("今回のリストは月単位ですか?", vbQuestion + vbYesNo)

    If ans = vbYes Then

          Set sht2 = Worksheets("月")

          連絡日 = Application.InputBox("「メール送信予定日」を入力してください" & vbLf & "例:2015/12/9", "", Date)

          Range("C4") = 連絡日

          年度 = Application.InputBox("「年」を入力してください" & vbLf & "例:2015年", "", "2015年")

          Range("C7") = 年

        Else

          Set sht2 = Worksheets("週")

          連絡日 = Application.InputBox("「メール送信予定日」を入力してください" & vbLf & "例:2015/12/9", Type:=1)

          Range("C4").Value = 連絡日

          年度 = Application.InputBox("「年度」を入力してください", "", "2015")

          Range("C7") = 年度

        End If

    Set wb = Workbooks.Open(ff)         'ファイルを作成する基データを開く
    Set shm = wb.Sheets("連絡用")
    Set sht2 = ThisWorkbook.Sheets ← ※ここでマクロが停まります。。。
    Set sht = ThisWorkbook.Sheets

    Application.ScreenUpdating = False

    z = shm.Cells(1, Columns.Count).End(xlToLeft).Column
    x = shm.Range("A" & Rows.Count).End(xlUp).Row - 1
    shm.Columns("D").Copy shm.Cells(1, z + 2)
    shm.Columns(z + 2).RemoveDuplicates Columns:=1, Header:=xlYes
    shm.Cells(1, z + 4).Value = shm.Range("D1").Value
    shm.Cells(1, z + 6).Resize(, 5).Value = shm.Range("A1:E1").Value

    For Each c In shm.Cells(1, z + 2).CurrentRegion
        If c.Row > 1 Then
            shm.Cells(2, z + 4).Value = c.Value
            shm.Range("A1").CurrentRegion.AdvancedFilter Action:=xlFilterCopy, _
                CriteriaRange:=shm.Cells(1, z + 4).Resize(2), CopyToRange:=shm.Cells(1, z + 6).Resize(, 5), Unique:=False
            With shm.Cells(1, z + 6).CurrentRegion.Resize(, 3)
                  sht.Range("C14:E43").ClearContents
                  Intersect(.Cells, .Cells.Offset(1)).Copy sht.Range("C14")
            End With

            sht.Range("C2").Value = shm.Cells(3, z + 10).Value
            sht.Range("C13").CurrentRegion.Borders.LineStyle = xlContinuous
            sht.Copy
            Set nBK = ActiveWorkbook

            With nBK.Sheets(1)
                On Error Resume Next
                Set r = .Range("C12:C43").SpecialCells(xlCellTypeBlanks)
                On Error GoTo 0
                If Not r Is Nothing Then r.EntireRow.Delete
            End With

            Range("A1").Select

           '作成したファイルを保存し、閉じる

            fName = shm.Range("N2").Value & "_" & shm.Range("O2").Value & ".xlsx"
            Application.DisplayAlerts = False
            With ActiveWorkbook
                    .SaveAs svPath & fName
                    .Close
                End With
          End If

    Next

    '元の状態に戻す

    shm.Cells(1, z + 2).CurrentRegion.Clear
    shm.Cells(1, z + 4).CurrentRegion.Clear
    shm.Cells(1, z + 6).CurrentRegion.Clear
    sht.Range("C2").Clear
    sht.Range("C14:E43").Clear
    Range("A1").Select
    shm.Parent.Close False

    Application.ScreenUpdating = True
    MsgBox "完了しました。"

 End Sub

よろしくお願いいたします。

(忘却者) 2015/11/26(木) 11:35


 判断部分で代入しているのでそのあとにまた代入しなおす必要はないはずだが?

 VBAからすると
 >Set sht2 = Worksheets("月")
 >Set sht2 = Worksheets("週")
 は
 >Set sht2 = ThisWorkbook.Worksheets("月")
 >Set sht2 = ThisWorkbook.Worksheets("週")
 なのかもしれないが。
 (きちんとVBAを追っていないのでそこの判断はそちらでしてくれ) 

(ねむねむ) 2015/11/26(木) 11:46


ねむねむさん

度々ご教示頂きまして有難うございます。
代入しなおしているコードを消してみたところ、
マクロが途中で停まることなく作動しました。
有難うございました。
大変助かりました。

(忘却者) 2015/11/26(木) 13:54


コメント返信:

[ 一覧(最新更新順) ]


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