Finding first blank row, then writing to it

后端 未结 8 1815
小鲜肉
小鲜肉 2020-12-02 00:30

I need to find the first blank row in a workbook and write information to (row, 1) and (row, 2). I think I\'m currently pretty stuck...

Function WriteToMaste         


        
相关标签:
8条回答
  • 2020-12-02 00:41

    Update

    Inspired by Daniel's code above and the fact that this is WAY! more interesting to me now then the actual work I have to do, i created a hopefully full-proof function to find the first blank row in a sheet. Improvements welcome! Otherwise, this is going to my library :) Hopefully others benefit as well.

        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
    

    Original Answer

    To find the first blank in a sheet, replace this part of your code:

    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 this code:

    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
    
    0 讨论(0)
  • 2020-12-02 00:42

    Function firstBlankRow() As Long
    Dim emptyCells As Boolean

        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
    

    End Function

    0 讨论(0)
  • 2020-12-02 00:45

    If you mean the row number after the last row that is used, you can find it with this:

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

    If you mean a row that happens to be blank with data after it... it gets more complicated.

    Here's a function I wrote which will give you the actual row number of the first row that is blank for the provided worksheet.

    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
    

    Usage example: firstblankRow(thisworkbook.Sheets(1)) or pass any worksheet.

    Edit: As ooo pointed out, this will error if there are no blank cells in your used range.

    0 讨论(0)
  • 2020-12-02 00:46

    I know this is an older thread however I needed to write a function that returned the first blank row WITHIN a range. All of the code I found online actually searches the entire row (even the cells outside of the range) for a blank row. Data in ranges outside the search range was triggering a used row. This seemed to me to be a simple solution:

    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 讨论(0)
  • 2020-12-02 00:47

    very old thread but .. i was lookin for an "easier"... a smaller code

    i honestly dont understand any of the answers above :D - i´m a noob

    but this should do the job. (for smaller sheets)

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

    reads every cell in col 1 from bottom up and stops at first empty cell

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

    then you can write your info like this

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

    etc...

    and then i recognize its an vba thread ... lol

    0 讨论(0)
  • 2020-12-02 00:48

    Very old thread but a simpler take :)

    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 讨论(0)
提交回复
热议问题