2012-09-19 93 views
7

我需要找到工作簿中的第一個空白行,並將信息寫入(row,1)和(row,2)。我認爲我目前相當卡...找到第一個空白行,然後寫入它

Function WriteToMaster(num, path) As Boolean 

'Declare variables 
Dim xlApp As Excel.Application 
Dim wb As Workbook 
Dim ws As Worksheet 
Dim infoLoc As Integer 

Set xlApp = New Excel.Application 

Set wb = xlApp.Workbooks.Open("PATH OF THE DOC") 
Set ws = wb.Worksheets("Sheet1") 

'Loop through cells, looking for an empty one, and set that to the Num 
Cells(1, 1).Select 
For Each Cell In ws.UsedRange.Cells 
    If Cell.Value = "" Then Cell = Num 
    MsgBox "Checking cell " & Cell & " for value." 
Next 


'Save, close, and quit 
wb.Save 
wb.Close 
xlApp.Quit 

'Resets the variables 
Set ws = Nothing 
Set wb = Nothing 
Set xlApp = Nothing 

非常感謝您的幫助。

+0

這已經覆蓋了很多次。 [行中最後一個不爲空的單元格; Excel VBA](http://stackoverflow.com/questions/4872512/last-not-empty-cell-in-row-excel-vba) – brettdj

+1

@brettdj有一些重疊,但我當然不會說它是一個確切的副本。 okapishomapi詢問如何在工作表中找到第一個空白行。 Anonymous12345詢問是否在一行中找到最後一個未填充的單元格。 – StockB

回答

12

如果你的意思是使用的最後一行之後的行號,你可以用這個找到它:

Dim unusedRow As Long 
unusedRow = Cells.SpecialCells(xlCellTypeLastCell).Offset(1, 0).Row 

如果你的意思是一排恰好是空白頁與後的數據... ...它變得更加複雜。

這是我寫的一個函數,它會給你所提供的工作表的第一行空行的實際行號。

Function firstBlankRow(ws As Worksheet) As Long 
'returns the row # of the row after the last used row 
'Or the first row with no data in it 
    Dim rw As Range 
    For Each rw In ws.UsedRange.Rows 
     If rw.Address = ws.Range(rw.Address).SpecialCells(xlCellTypeBlanks). _ 
      Address Then 

       firstBlankRow = rw.Row 
       Exit For 
     End If 
    Next 
    If firstBlankRow = 0 Then 
     firstBlankRow = ws.Cells.SpecialCells(xlCellTypeLastCell). _ 
        Offset(1, 0).Row 
    End If 
End Function 

使用示例:firstblankRow(thisworkbook.Sheets(1))或傳遞任何工作表。

編輯:正如ooo指出的,如果您使用的範圍中沒有空白單元格,則會出錯。

+0

這不一定會找到第一個空白行,因爲工作表中的數據集之間可能有一個或多個完全空白的行。 –

+0

@ScottHoltzman的確,我在其餘的部分寫下了部分答案。 :-) –

+1

明白了。它有趣的是兩個程序員如何以不同的方式處理相同的任務... –

3

更新

由丹尼爾的代碼上面的事實,這是WAY啓發!我現在對自己的實際工作更感興趣,我創建了一個充滿希望的全功能功能來查找工作表中的第一個空白行。改進歡迎!否則,這是去我的圖書館:) 希望其他人也受益。

Function firstBlankRow(ws As Worksheet) As Long 
'returns the row # of the row after the last used row 
'Or the first row with no data in it 

    Dim rngSearch As Range, cel As Range 

    With ws 

     Set rngSearch = .UsedRange.Columns(1).Find("") '-> does blank exist in the first column of usedRange 

     If Not rngSearch Is Nothing Then 

      Set rngSearch = .UsedRange.Columns(1).SpecialCells(xlCellTypeBlanks) 

      For Each cel In rngSearch 

       If Application.WorksheetFunction.CountA(cel.EntireRow) = 0 Then 

        firstBlankRow = cel.Row 
        Exit For 

       End If 

      Next 

     Else '-> no blanks in first column of used range 

      If Application.WorksheetFunction.CountA(Cells(.Rows.Count, 1).EntireRow) = 0 Then '-> is the last row of the sheet blank? 

       '-> yeap!, then no blank rows! 
       MsgBox "Whoa! All rows in sheet are used. No blank rows exist!" 


      Else 

       '-> okay, blank row exists 
       firstBlankRow = .UsedRange.SpecialCells(xlCellTypeBlanks).Row + 1 

      End If 

     End If 

    End With 

End Function 

原來的答案

要找到一個表中的第一個空白,替代你的這部分代碼:

Cells(1, 1).Select 
For Each Cell In ws.UsedRange.Cells 
    If Cell.Value = "" Then Cell = Num 
    MsgBox "Checking cell " & Cell & " for value." 
Next 

有了這個代碼:

With ws 

    Dim rngBlanks As Range, cel As Range 

    Set rngBlanks = Intersect(.UsedRange, .Columns(1)).Find("") 

    If Not rngBlanks Is Nothing Then '-> make sure blank cell exists in first column of usedrange 
     '-> find all blank rows in column A within the used range 
     Set rngBlanks = Intersect(.UsedRange, .Columns(1)).SpecialCells(xlCellTypeBlanks) 

     For Each cel In rngBlanks '-> loop through blanks in column A 

      '-> do a countA on the entire row, if it's 0, there is nothing in the row 
      If Application.WorksheetFunction.CountA(cel.EntireRow) = 0 Then 
       num = cel.Row 
       Exit For 
      End If 

     Next 
    Else 

     num = usedRange.SpecialCells(xlCellTypeLastCell).Offset(1).Row     

    End If 


End With 
+2

如果使用所有行,則無法分配num。 –

+0

謝謝,斯科特! @Daniel - 當現在的Excel用完時Excel不分配新行嗎? – okapishomapi

+0

@okapishomapi當然,它允許新的行。我說他的代碼不會確定下一個空行,如果usedrange中沒有行是空白的。因爲它在查看已使用的範圍之後不進行檢查,以確保找到空行。 –

4

我會這樣做。短而甜:)

Sub test() 
Dim rngToSearch As Range 
Dim FirstBlankCell As Range 
Dim firstEmptyRow As Long 

Set rngToSearch = Sheet1.Range("A:A") 
    'Check first cell isn't empty 
    If IsEmpty(rngToSearch.Cells(1, 1)) Then 
     firstEmptyRow = rngToSearch.Cells(1, 1).Row 
    Else 
     Set FirstBlankCell = rngToSearch.FindNext(After:=rngToSearch.Cells(1, 1)) 
     If Not FirstBlankCell Is Nothing Then 
      firstEmptyRow = FirstBlankCell.Row 
     Else 
      'no empty cell in range searched 
     End If 
    End If 
End Sub 

已更新,以檢查第一行是否爲空。

編輯:更新包括檢查是否整排是空

Option Explicit 

Sub test() 
Dim rngToSearch As Range 
Dim firstblankrownumber As Long 

    Set rngToSearch = Sheet1.Range("A1:C200") 
    firstblankrownumber = FirstBlankRow(rngToSearch) 
    Debug.Print firstblankrownumber 

End Sub 

Function FirstBlankRow(ByVal rngToSearch As Range, Optional activeCell As Range) As Long 
Dim FirstBlankCell As Range 

    If activeCell Is Nothing Then Set activeCell = rngToSearch.Cells(1, 1) 
    'Check first cell isn't empty 
    If WorksheetFunction.CountA(rngToSearch.Cells(1, 1).EntireRow) = 0 Then 
     FirstBlankRow = rngToSearch.Cells(1, 1).Row 
    Else 

     Set FirstBlankCell = rngToSearch.FindNext(After:=activeCell) 
     If Not FirstBlankCell Is Nothing Then 

      If WorksheetFunction.CountA(FirstBlankCell.EntireRow) = 0 Then 
       FirstBlankRow = FirstBlankCell.Row 
      Else 
       Set activeCell = FirstBlankCell 
       FirstBlankRow = FirstBlankRow(rngToSearch, activeCell) 

      End If 
     Else 
      'no empty cell in range searched 
     End If 
    End If 
End Function 
+0

+1這是優越的。 – brettdj

+0

我喜歡它,但是這隻檢查實際上不符合OP要求的第一列。 –

+0

是的,你說得對。更新後檢查整行是空的。 – user3357963

0
ActiveSheet.Range("A10000").End(xlup).offset(1,0).Select 
2

我知道這不過是一箇舊的線程,我需要編寫一個返回的第一個空行內的距離的函數。我在網上找到的所有代碼實際上都會搜索整行(甚至是範圍之外的單元格)以查找空行。搜索範圍之外的數據觸發了使用的行。這在我看來是一個簡單的解決方案:

Function FirstBlankRow(ByVal rngToSearch As Range) As Long 
    Dim R As Range 
    Dim C As Range 
    Dim RowIsBlank As Boolean 

    For Each R In rngToSearch.Rows 
     RowIsBlank = True 
     For Each C In R.Cells 
     If IsEmpty(C.Value) = False Then RowIsBlank = False 
     Next C 
     If RowIsBlank Then 
     FirstBlankRow = R.Row 
     Exit For 
     End If 
    Next R 
End Function 
0

非常古老的線程,但..我是看着一個「容易」 ......較小的代碼

老實說,我不明白上述任何問題的答案:d - 我一個小白

但這應該做的工作。 (對於更小的薄片)

Set objExcel = CreateObject("Excel.Application") 
objExcel.Workbooks.Add 

從下向上讀取第1欄的每一個細胞,並在第一個空白單元停止

intRow = 1 
Do until objExcel.Cells(intRow, 1).Value = "" 
    intRow = intRow + 1 
Loop 

那麼你可以這樣寫

objExcel.Cells(intRow, 1).Value = "first emtpy row, col 1" 
objExcel.Cells(intRow, 2).Value = "first emtpy row, col 2" 

等你的信息...

然後我認識到它的vba線程...大聲笑

+0

「intRow = intRow + 1」看起來不像「自下而上」。 –

0

很老的線程,但一個簡單的起飛:)

Sub firstBlank(c) 'as letter 
    MsgBox (c & Split(Range(c & ":" & c).Find("", LookIn:=xlValues).address, "$")(2)) 
End Sub 
Sub firstBlank(c) 'as number 
    cLet = Split(Cells(1, c).address, "$")(1) 
    MsgBox (cLet & Split(Range(cLet & ":" & cLet).Find("", LookIn:=xlValues).address, "$")(2)) 
End Sub 
0

功能firstBlankRow()只要
昏暗emptyCells由於布爾

For Each rowinC In Sheet7.Range("A" & currentEmptyRow & ":A5000") ' (row,col) 

     If rowinC.Value = "" Then 
      currentEmptyRow = rowinC.row 
      'firstBlankRow = rowinC.row 'define class variable to simplify computing complexity for other functions i.e. no need to call function again 
      Exit Function 
     End If 
    Next 

端功能

相關問題