投稿/コメントを表示します。

お世話になっております。
添削を宜しくお願いいたします。
ここまで取り組んだことで、仕事でマクロを使ったツール作成ができるようになっていて、大変うれしいです。
作成していて2点疑問があり、以下ご教示頂きたいです。
何卒宜しくお願いいたします。

1,workbookとworksheetを格納した変数で書くことはできないのでしょうか。
今回のマクロは別のExcelブック間を行き来しないので良いのですが発生する場合、変数で記載出来ればいいなと思って書いたらエラーとなってしまいました。
workbookやworksheetの書き方の規則はどんなものがあるのでしょうか。
Dim shF As Worksheet
Dim boF As Workbook
Set boF = Workbooks("s09_homework.xls")
Set shF = Worksheets("main")

動いた
shF.Range("A1").Value = "No."
Workbooks("s09_homework.xls").Worksheets("main").Range("A1").Value = "No."
boF.Worksheets("main").Range("A1").Value = "No."

動かない
boF.shF.Range("A1").Value = "No." ←このように記載できればと思っていました。
Workbooks("s09_homework.xls").shF.Range("A1").Value = "No."

2,kaishiのSubプロシージャですが、最後mainシートのA1を選択された状態で終了したいとしたとき、
shF.Range("A1").Select
とだけ書くとエラーとなり、
shF.Activate
といれるとちゃんと動くようになりました。
こちらはselectしたいのであれば一度そのシートをActivateの状態にしないとだめというルールなのですか?

何卒宜しくお願い致します。
Option Explicit
Private shF As Worksheet
Private shT As Worksheet
Private lnfz As Long
Private r As String

Public Sub kaishi()
    Set shF = Worksheets("main")
    lnfz = shF.Range("B" & Rows.Count).End(xlUp).Row
    
    sakuzyo
    Aretu
    r = "B"
    narabikae
    sakusei
    r = "A"
    narabikae
    shF.Range("A1:A" & lnfz).ClearContents
 ’なぜ一度シートをactiveteしなければshF.Range("A1").Selectが動かないのか
    shF.Activate
    shF.Range("A1").Select
End Sub

Private Sub Aretu()
    Dim boF As Workbook
    
    Set boF = Workbooks("s09_homework.xls")
'    Set shF = Worksheets("main")
'    lnFz = shF.Range("B" & Rows.Count).End(xlUp).Row
    
'    動く
'    shF.Range("A1").Value = "No."
'    Workbooks("s09_homework.xls").Worksheets("main").Range("A1").Value = "No."
'    boF.Worksheets("main").Range("A1").Value = "No."
    
'    動かない
'    boF.shF.Range("A1").Value = "No."
'    Workbooks("s09_homework.xls").shF.Range("A1").Value = "No."

    shF.Range("A1").Value = "No."
    shF.Range("A2").Value = 1
    shF.Range("A2").AutoFill Destination:=Range("A2:A" & lnfz), Type:=xlFillSeries

End Sub

Private Sub narabikae()
    
'    Set shF = Worksheets("main")
'    lnFz = shF.Range(r & Rows.Count).End(xlUp).Row
    
    With shF.Sort
        .SortFields.Clear
        .SortFields.Add2 Key:=Range(r & "2:" & r & lnfz), _
            SortOn:=xlSortOnValues, _
            Order:=xlAscending, _
            DataOption:=xlSortNormal
        .SetRange Range("A1:G" & lnfz)
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
End Sub

Private Sub sakusei()
    Dim gyo As Long
    Dim saki As Long
    Dim d As Long
    Dim Kaisya As String
    
    
'    Set shF = Worksheets("main")
'    lnFz = shF.Range("B" & Rows.Count).End(xlUp).Row
    
    For gyo = 2 To lnfz
        If shF.Range("B" & gyo).Value <> Kaisya Then
            If gyo <> 2 Then
                koushisen
                tuika1
            End If
            Kaisya = shF.Range("B" & gyo).Value
            Sheets("main1").Copy After:=Sheets(Worksheets.Count)
            Set shT = Sheets("main1 (2)")
            shT.Name = Kaisya
            saki = 16
        End If
        shT.Range("E" & saki).Value = shF.Range("D" & gyo).Value
        shT.Range("F" & saki).Value = shF.Range("E" & gyo).Value
        shT.Range("H" & saki).Value = shF.Range("F" & gyo).Value
        If shF.Range("G" & gyo).Value > 1 Then
            shT.Range("I" & saki).Value = shF.Range("G" & gyo).Value
        Else
            shT.Range("J" & saki).Value = shF.Range("G" & gyo).Value
        End If
        If saki = 16 Then
            shT.Range("K" & saki).Value = shF.Range("G" & gyo).Value
        Else
            shT.Range("K" & saki).Value = shF.Range("G" & gyo).Value + shF.Range("G" & gyo).Offset(-1).Value
        End If
        d = shF.Range("C" & gyo).Value
        shT.Range("B" & saki).Value = Format(d, "yy")
        shT.Range("C" & saki).Value = Format(d, "mm")
        shT.Range("D" & saki).Value = Format(d, "dd")
        saki = saki + 1
        
    Next
    koushisen
    tuika1
    
End Sub

Public Sub sakuzyo()
    Dim sh As Worksheet
    Application.DisplayAlerts = False
    For Each sh In Worksheets
        If Left(sh.Name, 4) <> "main" Then
            sh.Delete
        End If
    Next
    Application.DisplayAlerts = True
End Sub

Private Sub koushisen()
    Dim lnTz As Long
    
    lnTz = shT.Range("B" & Rows.Count).End(xlUp).Row
    
    With shT.Range("B16:K" & lnTz + 1)
        .Borders(xlDiagonalDown).LineStyle = xlNone
        .Borders(xlDiagonalUp).LineStyle = xlNone
        With .Borders(xlEdgeLeft)
            .LineStyle = xlContinuous
            .ColorIndex = 0
            .TintAndShade = 0
            .Weight = xlThin
        End With
        With .Borders(xlEdgeTop)
            .LineStyle = xlContinuous
            .ColorIndex = 0
            .TintAndShade = 0
            .Weight = xlThin
        End With
        With .Borders(xlEdgeBottom)
            .LineStyle = xlContinuous
            .ColorIndex = 0
            .TintAndShade = 0
            .Weight = xlThin
        End With
        With .Borders(xlEdgeRight)
            .LineStyle = xlContinuous
            .ColorIndex = 0
            .TintAndShade = 0
            .Weight = xlThin
        End With
        With .Borders(xlInsideVertical)
            .LineStyle = xlContinuous
            .ColorIndex = 0
            .TintAndShade = 0
            .Weight = xlThin
        End With
        With .Borders(xlInsideHorizontal)
            .LineStyle = xlContinuous
            .ColorIndex = 0
            .TintAndShade = 0
            .Weight = xlThin
        End With
    End With
    shT.Range("B16").Select

End Sub

Private Sub tuika1()
    Dim lnTz As Long
    
    lnTz = shT.Range("B" & Rows.Count).End(xlUp).Row
    
    Application.PrintCommunication = False
    With shT.PageSetup
        .PrintTitleRows = ""
        .PrintTitleColumns = ""
    End With
    Application.PrintCommunication = True
    shT.PageSetup.PrintArea = "$B$1:$K$" & lnTz + 1
    Application.PrintCommunication = False
    With shT.PageSetup
        .LeftHeader = "&A"
        .CenterFooter = "&D"
    End With
    Application.PrintCommunication = True

End Sub

2020/05/20 05:28