2

わかった。この最終号だけでいいと思います。私は自分のコードを別の領域に持っていて、大きな助けを得ていました。彼(ラタフィア)はとても忙しく、今日は返事がないと思います。行 RwLast = Range("AI" & ActiveSheet.Rows.Count, 2).End(xlUp).Offset(1, 0).Row でこのランタイム エラーが発生しています。送信を押します。私が望まない1行のデータを置き換えています。フォームに入力して送信するときに、各行に追加する必要があります。どんな助けでも大いに感謝します。エクセルシートのコードは以下です。

           Option Explicit
Dim WrkSheet As Worksheet

Private Sub btnSubmit_Click()
Application.EnableEvents = False

Dim ssheet As Workbook
Dim cellVal1 As String, cellVal2 As String, cellVal3 As String, cellVal4 As String, cellVal5 As String, cellVal6 As String, cellVal7 As String, cellVal8 As String, cellVal9 As String, cellVal10 As String, cellVal11 As String, cellVal12 As String
Dim cellVal13 As String, cellVal14 As String, cellVal15 As String, cellVal16 As String, cellVal17 As String, cellVal18 As String, cellVal19 As String, cellVal20 As String, cellVal21 As String, cellVal22 As String
Dim cellVal23 As String, cellVal24 As String, cellVal25 As String, cellVal26 As String, cellVal27 As String, cellVal28 As String, cellVal29 As String, cellVal30 As String, cellVal31 As String, cellVal32 As String, cellVal33 As String, cellVal34 As String

Dim shtCmb As String
Dim RwLast As Long

shtCmb = Me.cmbListItem1.Value
If shtCmb = "" Then
    MsgBox "Please choose a month.", vbOKOnly
    Me.cmbListItem1.SetFocus
End If

cellVal1 = Me.cmbListItem1.Text
cellVal2 = Me.cmbListItem2.Text
cellVal3 = Me.cmbListItem3.Text
cellVal4 = Me.TextBox31.Text
cellVal5 = Me.TextBox1.Text
cellVal6 = Me.TextBox2.Text
cellVal7 = Me.TextBox3.Text
cellVal8 = Me.TextBox4.Text
cellVal9 = Me.TextBox5.Text
cellVal10 = Me.TextBox6.Text
cellVal11 = Me.TextBox7.Text
cellVal12 = Me.TextBox8.Text
cellVal13 = Me.TextBox9.Text
cellVal14 = Me.TextBox10.Text
cellVal15 = Me.TextBox11.Text
cellVal16 = Me.TextBox12.Text
cellVal17 = Me.TextBox13.Text
cellVal18 = Me.TextBox14.Text
cellVal19 = Me.TextBox15.Text
cellVal20 = Me.TextBox16.Text
cellVal21 = Me.TextBox17.Text
cellVal22 = Me.TextBox18.Text
cellVal23 = Me.TextBox19.Text
cellVal24 = Me.TextBox20.Text
cellVal25 = Me.TextBox21.Text
cellVal26 = Me.TextBox22.Text
cellVal27 = Me.TextBox23.Text
cellVal28 = Me.TextBox24.Text
cellVal29 = Me.TextBox25.Text
cellVal30 = Me.TextBox26.Text
cellVal31 = Me.TextBox27.Text
cellVal32 = Me.TextBox28.Text
cellVal33 = Me.TextBox29.Text
cellVal34 = Me.TextBox30.Text

RwLast = Worksheets(shtCmb).Range("AI" & Worksheets(shtCmb).Rows.Count).End(xlUp).Row

Worksheets(shtCmb).Range("AI" & RwLast + 1).Value = cellVal1
Worksheets(shtCmb).Range("AJ" & RwLast + 1).Value = cellVal2
Worksheets(shtCmb).Range("A" & RwLast + 1).Value = cellVal3
Worksheets(shtCmb).Range("AH" & RwLast + 1).Value = cellVal4
Worksheets(shtCmb).Range("B" & RwLast + 1).Value = cellVal5
Worksheets(shtCmb).Range("C" & RwLast + 1).Value = cellVal6
Worksheets(shtCmb).Range("D" & RwLast + 1).Value = cellVal7
Worksheets(shtCmb).Range("E" & RwLast + 1).Value = cellVal8
Worksheets(shtCmb).Range("F" & RwLast + 1).Value = cellVal9
Worksheets(shtCmb).Range("G" & RwLast + 1).Value = cellVal10
Worksheets(shtCmb).Range("H" & RwLast + 1).Value = cellVal11
Worksheets(shtCmb).Range("I" & RwLast + 1).Value = cellVal12
Worksheets(shtCmb).Range("J" & RwLast + 1).Value = cellVal13
Worksheets(shtCmb).Range("K" & RwLast + 1).Value = cellVal14
Worksheets(shtCmb).Range("L" & RwLast + 1).Value = cellVal15
Worksheets(shtCmb).Range("M" & RwLast + 1).Value = cellVal16
Worksheets(shtCmb).Range("N" & RwLast + 1).Value = cellVal17
Worksheets(shtCmb).Range("O" & RwLast + 1).Value = cellVal18
Worksheets(shtCmb).Range("P" & RwLast + 1).Value = cellVal19
Worksheets(shtCmb).Range("Q" & RwLast + 1).Value = cellVal20
Worksheets(shtCmb).Range("R" & RwLast + 1).Value = cellVal21
Worksheets(shtCmb).Range("S" & RwLast + 1).Value = cellVal22
Worksheets(shtCmb).Range("T" & RwLast + 1).Value = cellVal23
Worksheets(shtCmb).Range("U" & RwLast + 1).Value = cellVal24
Worksheets(shtCmb).Range("V" & RwLast + 1).Value = cellVal25
Worksheets(shtCmb).Range("W" & RwLast + 1).Value = cellVal26
Worksheets(shtCmb).Range("X" & RwLast + 1).Value = cellVal27
Worksheets(shtCmb).Range("Y" & RwLast + 1).Value = cellVal28
Worksheets(shtCmb).Range("Z" & RwLast + 1).Value = cellVal29
Worksheets(shtCmb).Range("AA" & RwLast + 1).Value = cellVal30
Worksheets(shtCmb).Range("AB" & RwLast + 1).Value = cellVal31
Worksheets(shtCmb).Range("AC" & RwLast + 1).Value = cellVal32
Worksheets(shtCmb).Range("AD" & RwLast + 1).Value = cellVal33
Worksheets(shtCmb).Range("AF" & RwLast + 1).Value = cellVal34

Application.EnableEvents = True

End Sub

Private Sub cmbListItem1_Change()

End Sub

Private Sub optionCancel_Click()
Unload Me
End Sub

Private Sub UserForm_Initialize()

    Dim SH As Worksheet
    Dim Entry As Variant

    ' MonthName(Month(Now)) - Will return the name of the current Month
    For Each SH In ThisWorkbook.Worksheets
        If SH.Name = MonthName(month(Now)) Then
            Set WrkSheet = SH
            Exit For
        End If
    Next

    'fill the combo box
    With Me.cmbListItem1
        For Each Entry In [List1]
            .AddItem Entry
        Next Entry
        .Value = MonthName(month(Now))
    End With
    'fill the combo box
    With Me.cmbListItem2
        For Each Entry In [List2]
            .AddItem Entry
        Next Entry
    End With
    'fill the combo box
    With Me.cmbListItem3
        For Each Entry In [List3]
            .AddItem Entry
        Next Entry
    End With

End Sub
4

1 に答える 1

0

私はあなたのアプリケーションの設計を 100% 認識しているわけではありませんが、次のことが役立つと思います。

Range("AI" & ActiveSheet.Rows.Count, 2).End(xlUp).Offset(1, 0).Row

は無効な構文です。あなたが望むのは だと思いますRange("AI" & ActiveSheet.Rows.Count).End(xlUp).Offset(1, 0).Row。これが行うことは、 column で最後に使用された行の下にある最初の空の行を調べることAIです。しかし、それは少し変更する必要があります..

Rangehere はおそらくActiveSheet、月のシートではなく、ユーザーフォームが存在するシートを指します。一般に、は(コードがモジュール内にある場合) またはそれが入力されたシートを参照する (シート モジュールに入力された場合)のRangeいずれかのショートカットであり、場合によっては危険な場合があります。Activeheet.RangeVBA

範囲を完全に修飾することをお勧めします:Worksheets(shtCmb).Range("AI" & Worksheets(shtCmb).Rows.Count).End(xlUp).Offset(1, 0).Row代わりに: これにより、ターゲット シートの最後の行 column を見ていることが保証されますAI

lastrow + 1それでは、なぜ代わりに行くのlastrowですか?

また、 の範囲Integersは までに制限され32,767ており、行番号がこの値を超えるとエラーが発生することにも注意してください。代わりに使用Longします。実際にIntegersは、とにかく内部的にLongs に変換されます (ただし、範囲を超えるとエラーがスローされます!) ため、最初に long を使用しないでください。

これで始められることを願っていますが、修正が役立つかどうかは、以下にコメントしてお知らせください。

最高、イオアニス

PS: また、面倒な作業が多すぎるため、これらすべての変数の代わりに配列を定義することを検討してください。

編集:

it is skipping a row per each entry submited

これはRwLast、空のセルを持つ最初の行である を識別し、新しいコンテンツを 1 行下に書き込むためです。

Worksheets(shtCmb).Range("AI" & RwLast + 1).Value = cellVal1

等々。これを修正するには、変更します

RwLast = Worksheets(shtCmb).Range("AI" & Worksheets(shtCmb).Rows.Count).End(xlUp).Offset(1, 0).Row

RwLast = Worksheets(shtCmb).Range("AI" & Worksheets(shtCmb).Rows.Count).End(xlUp).Row

EDIT2:

を追加すると、実行Application.EnableEvents=False中に何も自動的に起動しないことが保証Sub btnSubmit_Click()されます。ただし、注意が必要です。サブルーチンは次のように開始する必要があります。

Sub btnSubmit_Click()
    On Error GoTo errHandler
    Application.EnableEvents = False

そしてこのまま終わる

errHandler:
    Application.EnableEvents = True

End Sub

その場合、unlessbtnSubmit_Clickの変更には何もありません。がどのように定義されているかは明確ではありませんが、あなたはそれを処理したと思います。Row 2shtCmb WrkSheet = Worksheets(shtCmb) RwLast = 1WrkSheet

于 2013-10-23T20:20:03.930 に答える