3

以下のコーディングで、マークされた行にObjectRequiredとしてエラーが発生しました。私を助けてください。一時ファイルはテンプレートを意味し、詳細は、テンプレートに入力する必要のあるデータであり、以下のコードに基づいて電子メールを送信するコンボコードから派生します。

Sub Emails()
    Dim R_No As Integer

    Templ.Select
    Templ.Range("C11") = ""
    Templ.Range("D11") = ""
    Templ.Range("E11") = ""
    Temp1.Range("F11") = "" <-------- Error
    Temp1.Range("G11") = ""
    Templ.Range("C14") = ""
    Templ.Range("D14") = ""
    Templ.Range("E14") = ""
    Temp1.Range("F14") = ""
    Temp1.Range("G14") = ""
    Rows("10:11").Select
    Selection.EntireRow.Hidden = True
    Rows("13:14").Select
    Selection.EntireRow.Hidden = True

    R_No = 2
    Do Until Combo.Cells(R_No, 1) = ""
        If Combo.Cells(R_No, 1) = "Order" Then
            Combo.Cells(R_No, 13) = Combo.Cells(R_No, 2)
        Else
            Combo.Cells(R_No, 13) = Combo.Cells(R_No, 2) & "  &  " & Combo.Cells(R_No, 4)
        End If

        If Combo.Cells(R_No, 7) = Combo.Cells(R_No + 1, 7) Then
            If Combo.Cells(R_No, 1) = Combo.Cells(R_No + 1, 1) Then
                If Combo.Cells(R_No, 1) = "Order" Then
                    Rows("10:11").Select
                    Selection.EntireRow.Hidden = False
                    If Templ.Range("C11") = "" Then
                        Templ.Range("C11") = Combo.Cells(R_No, 2)
                        Templ.Range("D11") = Combo.Cells(R_No, 3)
                        Templ.Range("E11") = Combo.Cells(R_No, 5)
                        Temp1.Range("F11") = Combo.Cells(R_No, 6)
                        Temp1.Range("G11") = Combo.Cells(R_No, 9)
                    Else
                        Templ.Range("C11") = Templ.Range("C11") & Templ.Range("I2") & Combo.Cells(R_No, 2)
                        Templ.Range("D11") = Templ.Range("D11") & Templ.Range("I2") & Combo.Cells(R_No, 3)
                        Templ.Range("E11") = Templ.Range("E11") & Templ.Range("I2") & Combo.Cells(R_No, 5)
                        Templ.Range("F11") = Templ.Range("F11") & Templ.Range("I2") & Combo.Cells(R_No, 6)
                        Templ.Range("G11") = Templ.Range("G11") & Templ.Range("I2") & Combo.Cells(R_No, 9)
                    End If
                End If
                If Combo.Cells(R_No, 1) = "Receipt" Then
                    Rows("13:14").Select
                    Selection.EntireRow.Hidden = False
                    If Templ.Range("C14") = "" Then
                        Templ.Range("C14") = Combo.Cells(R_No, 2) & "-" & Combo.Cells(R_No, 4)
                        Templ.Range("D14") = Combo.Cells(R_No, 3)
                        Templ.Range("E14") = Combo.Cells(R_No, 5)
                        Temp1.Range("F14") = Combo.Cells(R_No, 6)
                        Temp1.Range("G14") = Combo.Cells(R_No, 9)
                    Else
                        Templ.Range("C14") = Templ.Range("C14") & Templ.Range("I2") & Combo.Cells(R_No, 2) & "-" & Combo.Cells(R_No, 4)
                        Templ.Range("D14") = Templ.Range("D14") & Templ.Range("I2") & Combo.Cells(R_No, 3)
                        Templ.Range("E14") = Templ.Range("E14") & Templ.Range("I2") & Combo.Cells(R_No, 5)
                        Templ.Range("F14") = Templ.Range("F14") & Templ.Range("I2") & Combo.Cells(R_No, 6)
                        Templ.Range("G14") = Templ.Range("G14") & Templ.Range("I2") & Combo.Cells(R_No, 9)
                    End If
                End If
            Else
                If Combo.Cells(R_No, 1) = "Order" Then
                    Rows("10:11").Select
                    Selection.EntireRow.Hidden = False
                    If Templ.Range("C11") = "" Then
                        Templ.Range("C11") = Combo.Cells(R_No, 2)
                        Templ.Range("D11") = Combo.Cells(R_No, 3)
                        Templ.Range("E11") = Combo.Cells(R_No, 5)
                        Temp1.Range("F11") = Combo.Cells(R_No, 6)
                        Temp1.Range("G11") = Combo.Cells(R_No, 9)
                    Else
                        Templ.Range("C11") = Templ.Range("C11") & Templ.Range("I2") & Combo.Cells(R_No, 2)
                        Templ.Range("D11") = Templ.Range("D11") & Templ.Range("I2") & Combo.Cells(R_No, 3)
                        Templ.Range("E11") = Templ.Range("E11") & Templ.Range("I2") & Combo.Cells(R_No, 5)
                        Templ.Range("F11") = Templ.Range("F11") & Templ.Range("I2") & Combo.Cells(R_No, 6)
                        Templ.Range("G11") = Templ.Range("G11") & Templ.Range("I2") & Combo.Cells(R_No, 9)
                    End If
                End If
                If Combo.Cells(R_No, 1) = "Receipt" Then
                    Rows("13:14").Select
                    Selection.EntireRow.Hidden = False
                    If Templ.Range("C14") = "" Then
                        Templ.Range("C14") = Combo.Cells(R_No, 2) & "-" & Combo.Cells(R_No, 4)
                        Templ.Range("D14") = Combo.Cells(R_No, 3)
                        Templ.Range("E14") = Combo.Cells(R_No, 5)
                        Temp1.Range("F14") = Combo.Cells(R_No, 6)
                        Temp1.Range("G14") = Combo.Cells(R_No, 9)
                    Else
                        Templ.Range("C14") = Templ.Range("C14") & Templ.Range("I2") & Combo.Cells(R_No, 2) & "-" & Combo.Cells(R_No, 4)
                        Templ.Range("D14") = Templ.Range("D14") & Templ.Range("I2") & Combo.Cells(R_No, 3)
                        Templ.Range("E14") = Templ.Range("E14") & Templ.Range("I2") & Combo.Cells(R_No, 5)
                        Templ.Range("F14") = Templ.Range("F14") & Templ.Range("I2") & Combo.Cells(R_No, 6)
                        Templ.Range("G14") = Templ.Range("G14") & Templ.Range("I2") & Combo.Cells(R_No, 9)
                    End If
                End If
            End If
        Else
            If Combo.Cells(R_No, 1) = "Order" Then
                Rows("10:11").Select
                Selection.EntireRow.Hidden = False
                If Templ.Range("C11") = "" Then
                        Templ.Range("C11") = Combo.Cells(R_No, 2)
                        Templ.Range("D11") = Combo.Cells(R_No, 3)
                        Templ.Range("E11") = Combo.Cells(R_No, 5)
                        Temp1.Range("F11") = Combo.Cells(R_No, 6)
                        Temp1.Range("G11") = Combo.Cells(R_No, 9)
                    Else
                        Templ.Range("C11") = Templ.Range("C11") & Templ.Range("I2") & Combo.Cells(R_No, 2)
                        Templ.Range("D11") = Templ.Range("D11") & Templ.Range("I2") & Combo.Cells(R_No, 3)
                        Templ.Range("E11") = Templ.Range("E11") & Templ.Range("I2") & Combo.Cells(R_No, 5)
                        Templ.Range("F11") = Templ.Range("F11") & Templ.Range("I2") & Combo.Cells(R_No, 6)
                        Templ.Range("G11") = Templ.Range("G11") & Templ.Range("I2") & Combo.Cells(R_No, 9)
                End If
            End If
            If Combo.Cells(R_No, 1) = "Receipt" Then
                Rows("13:14").Select
                Selection.EntireRow.Hidden = False
                If Templ.Range("C14") = "" Then
                        Templ.Range("C14") = Combo.Cells(R_No, 2) & "-" & Combo.Cells(R_No, 4)
                        Templ.Range("D14") = Combo.Cells(R_No, 3)
                        Templ.Range("E14") = Combo.Cells(R_No, 5)
                        Temp1.Range("F14") = Combo.Cells(R_No, 6)
                        Temp1.Range("G14") = Combo.Cells(R_No, 9)
                    Else
                        Templ.Range("C14") = Templ.Range("C14") & Templ.Range("I2") & Combo.Cells(R_No, 2) & "-" & Combo.Cells(R_No, 4)
                        Templ.Range("D14") = Templ.Range("D14") & Templ.Range("I2") & Combo.Cells(R_No, 3)
                        Templ.Range("E14") = Templ.Range("E14") & Templ.Range("I2") & Combo.Cells(R_No, 5)
                        Templ.Range("F14") = Templ.Range("F14") & Templ.Range("I2") & Combo.Cells(R_No, 6)
                        Templ.Range("G14") = Templ.Range("G14") & Templ.Range("I2") & Combo.Cells(R_No, 9)
                End If
            End If
            Templ.Range("C6") = "Dear " & Left(Combo.Cells(R_No, 7), InStr(1, Combo.Cells(R_No, 7), " ") - 1) & ","
            Templ.Range("A1:H48").Select
            ThisWorkbook.EnvelopeVisible = False
            ThisWorkbook.EnvelopeVisible = True

            With ThisWorkbook.Sheets("Templete").MailEnvelope
               .Item.Subject = "Reminder- Order(s) / Receipt(s) Pending Your Urgent Approval"
               .Item.To = Combo.Cells(R_No, 8)
               .Item.cc = " "
               If Combo.Cells(R_No, 10) <> "" Then
                    .Item.cc = Combo.Cells(R_No, 12)
               Else
               End If
               .Item.Send

               Templ.Range("C11") = ""
               Templ.Range("D11") = ""
               Templ.Range("E11") = ""
               Templ.Range("F11") = ""
               Templ.Range("G11") = ""
               Templ.Range("C14") = ""
               Templ.Range("D14") = ""
               Templ.Range("E14") = ""
               Templ.Range("F14") = ""
               Templ.Range("G14") = ""

               Rows("10:11").Select
               Selection.EntireRow.Hidden = True
               Rows("13:14").Select
               Selection.EntireRow.Hidden = True
            End With
        End If
        R_No = R_No + 1
    Loop
End Sub
4

2 に答える 2

7

F11 ステートメントには、TEMPL の代わりに temp1 {ONE} があります。G11もそう

Templ.Range("E11") = ""
Temp1.Range("F11") = ""
于 2013-02-21T16:20:37.930 に答える
0

cardmagik が指摘したように、Temp1(末尾に数字の 1 を付ける) をTempl(末尾に文字 L を付ける) に置き換える必要があります。

さらに、コードの改善に関するいくつかの提案:

  • 常にOption Explicitモジュールの開始時に使用してください。このようにすると、この例のように変数のスペルを間違えた場合に通知されます!
  • 最初にセルを空にするには、Temp.Range("C11:G11,C14:G14").Value = ""すべてのセルをスペルアウトする代わりに、単純に書き込みます
  • ほとんどの場合X.SelectSelection.DoSomethingこれを次のように置き換えることができますX.DoSomething-読みやすく、エラーが発生しにくく、実行が高速です
  • 上記の2点を組み合わせると、簡単にすることができます
    行("10:11").選択
    Selection.EntireRow.Hidden = True
    Rows("13:14").Select
    Selection.EntireRow.Hidden = True
    
    Rows("10:11,13:14").EntireRow.Hidden = True
  • 繰り返しコードがたくさんあります。例えば、
    Templ.Range("C11") = Combo.Cells(R_No, 2)
    Templ.Range("D11") = Combo.Cells(R_No, 3)
    Templ.Range("E11") = Combo.Cells(R_No, 5)
    Temp1.Range("F11") = Combo.Cells(R_No, 6)
    Temp1.Range("G11") = Combo.Cells(R_No, 9)
    は 3 回呼び出されます。行 14 の非常によく似たコードを考えると、6 回も! 代わりに、Sub2 つのパラメーターを持つ を作成し、それを 6x と呼びます! このサブは次のようになります。
    Private Sub FillDefault(rowTarget As Long、rowSource as Long)
    Templ.Range("C" & rowTarget) = Combo.Cells(rowSource, 2)
    Templ.Range("D" & rowTarget) = Combo.Cells(rowSource, 3)
    Templ.Range("E" & rowTarget) = Combo.Cells(rowSource, 5)
    Templ.Range("F" & rowTarget) = Combo.Cells(rowSource, 6)
    Templ.Range("G" & rowTarget) = Combo.Cells(rowSource, 9)
    サブ終了
    
    そして、それをFillDefault 11, R_No呼び出すFillDefault 14, R_No
  • このバージョンでは、ネストされたIF...THEN...ELSE...ステートメントはまったく無意味です-すべてのブランチが同じことをしています!!! - 他のすべての手順に加えて、1 つのブランチでのみメールを送信します。そのため、前に他の手順を実行してから、メールを送信する方がはるかに優れています。
  • 代わりにIF cond1 Then x = 1 Else x = 2使用できますx = Iif(cond1, 1, 2)-これにより、多くの場合、コードが短くなります。x が長期の場合
  • あなたのシートは本当に呼ばれていますTempleteTemplate
  • 行番号を参照するときは、Integer の代わりに Long を使用することをお勧めします - Integer は 32,768 までしか機能しません

全体として、私はあなたのコードを作り直しました-そして、なんと169行から60行に減らしました(ただし、これはさらに減らすことができますが、読みやすさのために):

Sub Emails()
    Dim R_No As Long

    ClearSheet

    R_No = 2
    Do Until combo.Cells(R_No, 1) = ""

        combo.Cells(R_No, 13) = combo.Cells(R_No, 2) & _
            IIf(combo.Cells(R_No, 1) <> "Order", "  &  " & combo.Cells(R_No, 4), "")

        Select Case combo.Cells(R_No, 1)
            Case "Order":
                Rows("10:11").EntireRow.Hidden = False
                Fill rowTarget:=11, rowSource:=R_No, blnAdd:=(Templ.Range("C11") = "")
            Case "Receipt":
                Rows("13:14").EntireRow.Hidden = False
                Fill rowTarget:=14, rowSource:=R_No, blnAdd:=(Templ.Range("C14") = "")
        End Select

        If combo.Cells(R_No, 7) <> combo.Cells(R_No + 1, 7) Then
            SendMail R_No
            ClearSheet
        End If
        R_No = R_No + 1
    Loop
End Sub

Private Sub ClearSheet()
    Templ.Range("C11:G11,C14:G14").Value = ""
    Rows("10:11,13:14").EntireRow.Hidden = True
End Sub

Private Sub Fill(rowTarget As Long, rowSource As Long, _
    Optional blnAdd As Boolean = False)
    Dim a As Variant, i As Integer
    a = Array(2, 3, 5, 6, 9)
    For i = 0 To 4
        Templ.Cells(rowTarget, i + 3) = _
            IIf(blnAdd, Templ.Cells(rowTarget, i + 3) & Templ.Range("I2"), "") & _
            combo.Cells(rowSource, a(i))
    Next
End Sub

Private Sub SendMail(R_No As Long)
    Templ.Range("C6") = "Dear " & Left(combo.Cells(R_No, 7), _
        InStr(1, combo.Cells(R_No, 7), " ") - 1) & ","
    Templ.Range("A1:H48").Select
    ThisWorkbook.EnvelopeVisible = True

    With ThisWorkbook.Sheets("Templete").MailEnvelope.Item
       .Subject = "Reminder- Order(s) / Receipt(s) Pending Your Urgent Approval"
       .To = combo.Cells(R_No, 8)
       .cc = " "
       If combo.Cells(R_No, 10) <> "" Then
            .cc = combo.Cells(R_No, 12)
       End If
       .Send
    End With
End Sub

チッ!

于 2013-02-21T21:55:11.163 に答える