Выбор непустых ячеек в Excel с VBA - PullRequest
11 голосов
/ 04 мая 2009

Я только начинаю погружаться в VBA, и мне удалось преодолеть некоторые препятствия.

У меня есть лист с 50+ столбцами, 900+ строками данных. Мне нужно отформатировать около 10 из этих столбцов и вставить их в новую рабочую книгу.

Как программно выбрать каждую непустую ячейку в столбце book1, выполнить ее через некоторые функции и удалить результаты в book2?

Ответы [ 4 ]

14 голосов
/ 26 сентября 2009

Я знаю, что опаздываю, но вот несколько полезных примеров:

'select the used cells in column 3 of worksheet wks
wks.columns(3).SpecialCells(xlCellTypeConstants).Select

или

'change all formulas in col 3 to values
with sheet1.columns(3).SpecialCells(xlCellTypeFormulas)
    .value = .value
end with

Чтобы найти последнюю использованную строку в столбце, никогда не полагайтесь на LastCell, который ненадежен (он не сбрасывается после удаления данных). Вместо этого я использую что-то вроде

 lngLast = cells(rows.count,3).end(xlUp).row
5 голосов
/ 04 мая 2009

Следующий код VBA поможет вам начать. Он скопирует все данные из исходной рабочей книги в новую рабочую книгу, но к каждому значению будет добавлено 1, а все пустые ячейки будут игнорироваться.

Option Explicit

Public Sub exportDataToNewBook()
    Dim rowIndex As Integer
    Dim colIndex As Integer
    Dim dataRange As Range
    Dim thisBook As Workbook
    Dim newBook As Workbook
    Dim newRow As Integer
    Dim temp

    '// set your data range here
    Set dataRange = Sheet1.Range("A1:B100")

    '// create a new workbook
    Set newBook = Excel.Workbooks.Add

    '// loop through the data in book1, one column at a time
    For colIndex = 1 To dataRange.Columns.Count
        newRow = 0
        For rowIndex = 1 To dataRange.Rows.Count
            With dataRange.Cells(rowIndex, colIndex)

            '// ignore empty cells
            If .value <> "" Then
                newRow = newRow + 1
                temp = doSomethingWith(.value)
                newBook.ActiveSheet.Cells(newRow, colIndex).value = temp
                End If

            End With
        Next rowIndex
    Next colIndex
End Sub


Private Function doSomethingWith(aValue)

    '// This is where you would compute a different value
    '// for use in the new workbook
    '// In this example, I simply add one to it.
    aValue = aValue + 1

    doSomethingWith = aValue
End Function
2 голосов
/ 04 мая 2009

Если вы ищете последнюю строку столбца, используйте:

Sub SelectFirstColumn()
   SelectEntireColumn (1)
End Sub

Sub SelectSecondColumn()
    SelectEntireColumn (2)
End Sub

Sub SelectEntireColumn(columnNumber)
    Dim LastRow
    Sheets("sheet1").Select
    LastRow = ActiveSheet.Columns(columnNumber).SpecialCells(xlLastCell).Row

    ActiveSheet.Range(Cells(1, columnNumber), Cells(LastRow, columnNumber)).Select
End Sub

Другие команды, с которыми вам нужно ознакомиться, это команды копирования и вставки:

Sub CopyOneToTwo()
    SelectEntireColumn (1)
    Selection.Copy

    Sheets("sheet1").Select
    ActiveSheet.Range("B1").PasteSpecial Paste:=xlPasteValues
End Sub

Наконец, вы можете ссылаться на таблицы в других книгах, используя следующий синтаксис:

Dim book2
Set book2 = Workbooks.Open("C:\book2.xls")
book2.Worksheets("sheet1")
0 голосов
/ 12 мая 2009

Это может быть совершенно не по основанию, но вы не можете просто скопировать весь столбец в новую электронную таблицу, а затем отсортировать столбец? Я предполагаю, что вам не нужно поддерживать целостность заказа.

...