2014-12-16 2 views
0

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

Скажем, у меня есть 4 столбца на листе (WS1), но количество строк динамическое для каждого импорта. Как я могу разместить столбцы (A: D)?

Пожалуйста, помогите.

Привет, мани

ответ

1

Используйте lastRow переменную для определения последней строки. Я привел несколько примеров этого. Также в этом примере используется переменная lastCol. Вы можете использовать это, если число столбцов также динамическое.

Private Sub lastRow() 

Dim lastRow As Long 
Dim lastCol As Long 
Dim sheet As String 

    sheet = "WS1" 

    lastRow = Sheets(sheet).Range("A" & Rows.Count).End(xlUp).row 'Using Range() 
    lastRow = Sheets(sheet).Cells(Rows.Count, "A").End(xlUp).row 'Using Cells() 

    lastCol = Sheets(sheet).Cells(2, Columns.Count).End(xlToLeft).Column 
End Sub 

Вы можете легко прокрутить свой лист, используя переменные. Использование ячеек (row, col) вместо Range (A1). вы можете использовать числа или букву в кавычках для столбца, как показано в примере.

В этом примере рассматривается WS1 и соответствует someValue. Если значение в столбце A WS1 = некоторое значение, запись копируется на лист «Мастер».

Sub LoopExample() 
Dim mRow As Long 'used for a master row 
    For lRow = 2 To lastRow 
     If Sheets(sheet).Cells(lRow, 1) = someValue Then 
      'perform something here like this. Copy columns A:D to the Master Sheet if match 
      For lCol = 1 To 4 'or you could go 1 to lastCol if you needed it dynamic 
       Sheets("MASTER").Cells(mRow, lCol) = Sheets(sheet).Cells(lRow, lCol) 'mRow as Row on Master 
      Next lCol 
      mRow = mRow + 1 'Increment the Master Row 
     End If 
    Next lRow 
End Sub 
+1

Я согласен с PJ, jus t, чтобы добавить еще один метод поиска последнего, если вы не хотите жестко кодировать определенный столбец 'lastrow = Sheet (" sheet1 "). UsedRange.Rows.Count' –

+1

Будьте осторожны, используя' UsedRange', чтобы получить последнюю использованную строку на лист: если в (например) строке 1 нет значений, то эта строка не учитывается в 'UsedRange.Rows.Count' –

0

Спасибо в любом случае. Но то, что я хотел, было просто для того, чтобы называть диапазоны столбцов на листе.

Я уже выполнил копию и вставку (Загрузка данных ч/б листов).

Это то, что я хотел.

vRowCount = DestWorkSheet.Cells(1, 1).SpecialCells(xlCellTypeLastCell).Row 
vColCount = DestWorkSheet.Cells(1, 1).SpecialCells(xlCellTypeLastCell).Column 

DestWorkSheet.usedRange.Columns.AutoFit 
AddNamedRange Dest_RATES, DATA_Dest_RATES 

Где AddNamedRange функция,

Public Sub AddNamedRange(ByVal sheetCodeName As String, ByVal namedRange As String) 
    Dim rngToBeNamed As Range 
    Dim ws As Worksheet 

    On Error GoTo AddNamedRange_Error 

    Set rngToBeNamed = GetUsedRange(sheetCodeName) 
    Set ws = rngToBeNamed.Worksheet 
    ws.Names.Add name:=namedRange, RefersTo:=ws.Range(rngToBeNamed.Address) 

    On Error GoTo 0 
    Exit Sub 


    AddNamedRange_Error: 

    MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure AddNamedRange of Module  UtilitiesRange" 

    End Sub 

С уважением,

Mani

0

Похоже, вы могли бы просто использовать что-то вроде этого в модуле листа:

Private Sub Worksheet_Change(ByVal target As Range) 
     Dim i As Long 
     Dim NamesOfNames(1 To 4) As String 

      NamesOfNames(1) = "NameOfColumn1" 
      NamesOfNames(2) = "NameOfColumn2" 
      NamesOfNames(3) = "NameOfColumn3" 
      NamesOfNames(4) = "NameOfColumn4" 

     For i = 1 To 4 
      ThisWorkbook.Names.Add Name:=NamesOfNames(i), _ 
       RefersTo:=Range(Cells(1, i), Cells(Cells(Rows.Count, i).End(xlUp).Row, i)) 
     Next i 
    End Sub 
Смежные вопросы