Поиск первой пустой строки, затем запись на нее
Мне нужно найти первую пустую строку в книге и написать информацию (строки, 1) и (строки, 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
Большое спасибо за любую помощь.
- Как поместить двойные кавычки в строку в vba?
- Быстрый метод сравнения из 2 столбцов
- В Excel VBA для Windows, для разобранных JSON-переменных, что это такое JScriptTypeInfo?
- Ошибка времени выполнения «3061». Слишком мало параметров. Ожидаемый 1. (Access 2007)
- Рабочие книги VBA. Не запрашивать, если пользователь хочет сохранить?
- Как я зацикливаю таблицу excel 2010, используя его имя и колонку?
- Задержки времени в VBA
- Попытка вызвать Sub с помощью String - VBA
- Как добавить элементы в поле со списком в форме в excel VBA?
- Как я могу получить HTTP GET из Excel VBA для Mac 2011
- В Excel я вставил кучу URL-адресов, но они не являются живыми ссылками - как я могу преобразовать их в живые ссылки?
- Получение ScriptControl для работы с Excel 2010 x64
- Показывать или скрывать строки в листе excel при значении конкретной ячейки (excel 2007 и Windows 7)
Если вы имеете в виду номер строки после последней используемой строки, вы можете найти ее следующим образом:
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))
или передать любой рабочий лист.
Изменить: Как указывал Ооо, это будет ошибкой, если в используемом диапазоне нет пустых ячеек.
Я бы сделал это так. Короткие и сладкие 🙂
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
Обновить
Вдохновленный приведенным выше кодексом Дэниела и тот факт, что это ПУТЬ! более интересным для меня сейчас, а затем фактической работой, которую я должен сделать, я создал надежную полнофункциональную функцию, чтобы найти первую пустую строку на листе. Усовершенствования приветствуются! В противном случае это пойдет в мою библиотеку 🙂 Надеюсь, другие принесут пользу.
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
Я знаю, что это старый stream, но мне нужно написать функцию, которая вернула первую пустую строку WITHIN диапазона. Весь код, который я нашел в Интернете, фактически просматривает всю строку (даже ячейки вне диапазона) для пустой строки. Данные в диапазонах вне диапазона поиска запускали использованную строку. Это казалось мне простым решением:
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
ActiveSheet.Range("A10000").End(xlup).offset(1,0).Select
очень старая нить, но .. я искал «проще» … меньшего кода
я честно не понимаю ни одного из ответов выше: D – i’ma noob
но это должно выполнять эту работу. (для небольших листов)
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-stream … lol
Очень старая нить, но проще взять 🙂
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
Функция firstBlankRow () как долго
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 ie no need to call function again Exit Function End If Next
Конечная функция