Excel VBA Выбор диапазона на основе переменной - PullRequest
0 голосов
/ 01 июня 2018

У меня есть фрагмент кода VBA, который берет данные из электронной таблицы и форматирует их во входной файл.Этот код перебирает заголовок каждого столбца, чтобы убедиться, что он может найти столбец, который ищет, а затем смещает его на один, чтобы выйти из строки заголовка, а затем копирует данные в другой шаблон.

Однако этот лист используетсянесколькими пользователями и количество заполняемых строк может варьироваться, поэтому я установил переменную с именем rowcount.В этом примере я работаю над тем, чтобы у меня было 5 записей, и поэтому я пытаюсь выбрать диапазон от активной ячейки до значения rowcount (5), но я просто застрял в следующей строке:

ActiveSheet.Range(ActiveCell, RowCount).Select

Ниже приведен полный код этого раздела, я знаю, что я делаю неправильно, но любой поиск в Google приводит к слишком конкретным результатам, и я не могу настроить код, чтобы он работал на меня.

If ActiveCell.Value = "Account Name" Then
           ActiveCell.Offset(1, 0).Select

           If ActiveCell.Value <> "" Then
                ActiveSheet.Range(ActiveCell, RowCount).Select
                Selection.Copy
                Sheets("Input").Activate
                ActiveSheet.Range("C2").Select
                Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                 :=False, Transpose:=False
                Application.CutCopyMode = False
                Worksheets("Account Details").Select
           End If

        End If

Для тех, кто обладает большим знанием VBA, я уверен, что это легко, но я по сути пытаюсь выделить Activecell и перейти к переменной, поэтому в этом случае A5: A10, скопируйте, а затем вставьте.

Заранее спасибо

Ответы [ 5 ]

0 голосов
/ 01 июня 2018

Не выбирайте диапазон для его копирования;реализация чего-то подобного должна сделать работу за вас:

Sub Test()
Dim RNG As Range
If ActiveCell.Value = "Account Name" Then
    With ActiveSheet
        Set RNG = .Range(.Cells(ActiveCell.Row + 1, ActiveCell.Column), ActiveSheet.Cells(.Cells(ActiveSheet.Rows.Count, ActiveCell.Column).End(xlUp).Row, ActiveCell.Column))
    End With
    RNG.Copy Sheets("Input").Range("C2")
End If
End Sub
0 голосов
/ 01 июня 2018

Сначала ваш,

 If ActiveCell.Value = "Account Name" Then
       ActiveCell.Offset(1, 0).Select

       If ActiveCell.Value <> "" Then
            ActiveCell.RESIZE(RowCount, 1).Select   '<~~ resize to the # of rows
            Selection.Copy
            Sheets("Input").Activate
            ActiveSheet.Range("C2").Select
            Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
             :=False, Transpose:=False
            Application.CutCopyMode = False
            Worksheets("Account Details").Select
       End If

 End If

Теперь без выбора, активации или ActiveCell

dim c as variant
with worksheets("sheet1")  'you should know what worksheet you are starting out on
    c = application.match("Account Name", .rows(4), 0)
    if not iserror(c) then
        if .cells(5, c).Value <> "" then
            workSheets("Input").Range("C2").resize(RowCount, 1) = _
               .cells(5, c).resize(RowCount, 1).value
        end if
    end if
end with

Как избежать использования Select в Excel VBA

0 голосов
/ 01 июня 2018

В данный момент в вашем диапазоне есть только активная ячейка и номер строки.

Попробуйте что-то вроде этого:

ActiveSheet.Range(activecell.address &":" &cells(RowCount,ActiveCell.Column).address).select
0 голосов
/ 01 июня 2018

Или просто используйте:

ActiveCell.Resize(RowCount,1).Select

Где 1 - количество столбцов.

0 голосов
/ 01 июня 2018

Использование Select, Activate и ActiveCell не считается хорошей практикой в ​​VBA.См. Как избежать использования Select в Excel VBA

Однако, чтобы научиться этого избегать, требуется время.Таким образом, в вашем коде измените эту строку:

ActiveSheet.Range(ActiveCell, RowCount).Select

На эту:

ActiveSheet.Range(ActiveCell, Cells(Rows.Count, ActiveCell.Column)).Select

И если у вас rowCount объявлено и установлено правильно, то этоВозможный вариант:

Dim rowCount As Long: rowCount = 5
ActiveSheet.Range(ActiveCell.Column, rowCount).Select
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...