2016-10-16 6 views
-1

私の心は壊れています。私は日を過ごしましたなぜこれが起こっているのか理解しようとしています:1枚のシートで最後の空の行が見つからない

ユーザーフォームが記入されたら、対応するスプレッドシートに入力するボタンがあります。シートは、最初のコンボボックス(catSel.value)によって決定されます。最後の空の行を見つけるには、私は以下のコードのrngSrch部分を使用します。 1枚If Application.WorksheetFunction.CountA(Acell.EntireRow) = 0

は実行されませんように偽とfirstBlankRow = Acell.row戻ってきます。

Iは、シートを削除して(動作するものをコピー)新しいものを作成、名前を変更し、コードを変更/コメントアウトしようとしています。

これは何が起こっているのですか?またws.Range("A" & firstBlankRow) = Me.equipId.valueRun-time Error ‘1004’: method ‘Range’ of object ’_worksheet’ failed

Private Sub AddCont_Click() 

Dim firstBlankRow As Long 
Dim ws As Worksheet 
Dim srchRng As Range 
Dim Acell As Range 

Set ws = Worksheets(CatSel.value) 

On Error GoTo Err 


With ws 
    Set srchRng = .UsedRange.Columns(1).Find("") 
    If Not srchRng Is Nothing Then 
     Set srchRng =.UsedRange.Columns(1).SpecialCells(xlCellTypeBlanks) 
     For Each Acell In srchRng 
      If Application.WorksheetFunction.CountA(Acell.EntireRow) = 0  Then 
       firstBlankRow = Acell.row 
       Exit For 

      End If 

     Next 
    Else 
     If Application.WorksheetFunction.CountA(Cells(.Rows.Count, 1).EntireRow) = 0 Then 
      MsgBox "Please start a new sheet" 
     Else 
      firstBlankRow = .UsedRange.SpecialCells(xlCellTypeBlanks).row + 1 

     End If 
    End If 



'Equipment ID 
    ws.Range("A" & firstBlankRow) = Me.equipId.value 
'Parent or Next Level 
    ws.Range("B" & firstBlankRow) = Me.NextLev.value 
'Keyword 
    ws.Range("C" & firstBlankRow) = Me.KeySel.value 
'Cost Center 
    ws.Range("E" & firstBlankRow) = Me.CostSel.value 
'Department 
    ws.Range("F" & firstBlankRow) = Me.DepartSel.value 
'Location 1 
    ws.Range("G" & firstBlankRow) = Me.Loc1.value 
'Location 2 
    ws.Range("H" & firstBlankRow) = Me.Loc2.value 
'Location 3 
    ws.Range("I" & firstBlankRow) = Me.Loc3.value 
'Location 4 
    ws.Range("J" & firstBlankRow) = Me.Loc4.value 
'Beginning of specs 
'L5 
    ws.Range("L" & firstBlankRow) = Me.L3Sel.value 
'M5 
    ws.Range("M" & firstBlankRow) = Me.M3Sel.value 
'N5 
    ws.Range("N" & firstBlankRow) = Me.N3sel.value 
'O5 
    ws.Range("O" & firstBlankRow) = Me.O3Sel.value 
'P5 
    ws.Range("P" & firstBlankRow) = Me.P3Sel.value 
'Q5 
    ws.Range("Q" & firstBlankRow) = Me.Q3Sel.value 
'R5 
    ws.Range("R" & firstBlankRow) = Me.R3Sel.value 
'S5 
    ws.Range("S" & firstBlankRow) = Me.S3Sel.value 
'T5 
    ws.Range("T" & firstBlankRow) = Me.T3Sel.value 
'U5 
    ws.Range("U" & firstBlankRow) = Me.U3Sel.value 

    MsgBox ("successfully Added") 

End With 

Err: MsgBox ("something went wrong") 

End Sub 

答えて

1

に戻って来ていると思うコード

Set srchRng = .UsedRange.Columns(1).Find("") 
If Not srchRng Is Nothing Then 
    Set srchRng =.UsedRange.Columns(1).SpecialCells(xlCellTypeBlanks) 
    For Each Acell In srchRng 
     If Application.WorksheetFunction.CountA(Acell.EntireRow) = 0  Then 
      firstBlankRow = Acell.row 
      Exit For 

     End If 

    Next 
Else 
    If Application.WorksheetFunction.CountA(Cells(.Rows.Count, 1).EntireRow) = 0 Then 
     MsgBox "Please start a new sheet" 
    Else 
     firstBlankRow = .UsedRange.SpecialCells(xlCellTypeBlanks).row + 1 

    End If 
End If 

のこの部分では、あなたが新しいレコードを挿入することができるように、最初の空白行を見つけようとしています。

もしそうなら、私はあなたがそのコードを置き換える提案:

If IsEmpty(.Cells(.Rows.Count, 1)) Then 
    firstBlankRow = .Cells(.Rows.Count, 1).End(xlUp).Row + 1 
Else 
    MsgBox "Please start a new sheet" 
    Exit Sub 
End If 

このコードは、列Aの最後の非空のセルを探し、それの後に行を指すようにfirstBlankRow変数を設定します。


あなたの記録は時々列Aの空の値を持っていますが、あなたは常に値を持つことが保証できることを別の列を持っている場合は、単にその列に代わりの列を参照するために、上記のコードを変更します1.例えば(と仮定すると、列はDは常に読み込まれる):あなたはなし列が非空であることが保証されているレコードを持っている場合

If IsEmpty(.Cells(.Rows.Count, "D")) Then 
    firstBlankRow = .Cells(.Rows.Count, "D").End(xlUp).Row + 1 
Else 
    MsgBox "Please start a new sheet" 
    Exit Sub 
End If 

は、おそらくこのコードは動作します:だからこの

firstBlankRow = .Rows.Count + 1 
If IsEmpty(.Cells(.Rows.Count, "A")) Then 
    For firstBlankRow = .Cells(.Rows.Count, "A").End(xlUp).Row + 1 To .Rows.Count 
     If Application.WorksheetFunction.CountA(.Rows(firstBlankRow)) = 0 Then 
      Exit For 
     End If 
    Next 
End If 
If firstBlankRow = .Rows.Count + 1 Then 
    MsgBox "Please start a new sheet" 
    Exit Sub 
End If 
+0

働いた!しかし、それは列Aの最初の空のセルに行きました。最初の完全に空の行を探す方法はありますか? –

+0

@ShawnTaylor - あなたがシートに入れていたデータで判断すると、列に何かがあった場合、列Aには常にデータが入力されると予想されましたが、行の列が1つもない状況記入されることを保証することができます。 – YowE3K

関連する問題