2016-09-16 3 views
0

Я пытаюсь запустить макрос на трех разных диапазонах, один за другим. Как только диапазон выбран, код работает просто отлично (где определены переменные F и L). Я хотел бы установить r1-r3 как необходимые мне диапазоны, а затем использовать строковую переменную для объединения чисел диапазона вместе. Этот код работает, но не дает номера начальной и конечной строки в выбранном диапазоне. Это важно, потому что он сообщает макросу «TableCalc», когда нужно начинать и останавливать код. Затем я хотел бы перейти к следующему диапазону. Спасибо за вашу помощь.excel vba конвертировать строку в диапазон

Sub TestRangeBC() 

WS.Select 

Dim r1 As Range 
Dim r2 As Range 
Dim r3 As Range 
Dim rngx As String 
Dim num As Integer 
Dim rng As Range 

Set r1 = WS.Range("ONE") 
Set r2 = WS.Range("TWO") 
Set r3 = WS.Range("THREE") 

For num = 1 To 3 
    rngx = "r" & num 
    Set rng = Range(rngx) 

    Dim F As Integer 
    Dim L As Integer 

    F = rng.Row + 1 
    L = rng.Row + rng.Rows.Count - 2 
    Cells(F, 8).Select 

    Do While Cells(F, 8) <> "" And ActiveCell.Row <= L 

     'INSERT SITUATIONAL MACRO 
     Call TableCalc 
     WS.Select 
     ActiveCell.Offset(1, 0).Select 
    Loop 
Next num 

End Sub 
+0

Что вы имеете в виду под «он говорит макрос TableCalc, когда для запуска и остановки код»? Я не вижу никаких параметров или глобальных переменных. – Comintern

+0

[Не используйте '.Select'] (https://stackoverflow.com/questions/10714251/how-to-avoid-using-select-in-excel-vba-macros) в вашей« ситуационной макросъемке ». Это может помочь. Кроме того, ваши именованные диапазоны имеют одну строку? Или несколько строк? Что означает 'F', если вы просматриваете макрос с помощью' F8'? Кроме того, вам нужно указать, на каком листе вы ожидаете получить «Ячейки (F, 8)». – BruceWayne

+0

@Tony Abadie - это код 'TableCalc' в том же модуле с этим' Sub'? Почему '' Cells (F, 8) <> "" "продвигается в цикле' Do While'? –

ответ

0

Это не ответ (как часть вашего кода, и что вы пытаетесь достичь пока неясно), но это «чист» и более эффективный способ кодировать то, что вы имеете в исходном сообщении ,

Option Explicit 

Dim WS    As Worksheet 

Ваш оригинальный Sub укоротить:

Sub TestRangeBC() 

' chanhe WS to your Sheet name 
Set WS = Sheets("Sheet1") 

Call ActiveRange("ONE") 
Call ActiveRange("TWO") 
Call ActiveRange("THREE") 

End Sub 

Это Sub получает имя именованного диапазона (вы установили в своей книге) в виде строки, и устанавливает диапазон соответственно.

Sub ActiveRange(RangeName As String) 

Dim Rng     As Range 
Dim F     As Integer 
Dim L     As Integer 
Dim lRow    As Long 

With WS 
    Set Rng = .Range(RangeName) 

    ' just for debug purpose >> to ensure the right Range was passed and set 
    Debug.Print Rng.Address 

    F = Rng.Row + 1 
    L = Rng.Row + Rng.Rows.Count - 2 

    lRow = F 

    ' what you are trying to achieve in this loop is beyond me 
    Do While .Cells(F, 8) <> "" And .Cells(lRow, 8).Row <= L 
     Debug.Print .Cells(lRow, 8).Address 
     'INSERT SITUATIONAL MACRO 
     ' Call TableCalc 
     ' not sure you need to select WS sheet again 
     WS.Select 
     lRow = lRow + 1 
    Loop 
End With 

End Sub 

Что вы пытаетесь проверить в цикле ниже, каковы критерии пребывания в цикле?

Do While Cells(F, 8) <> "" And ActiveCell.Row <= L 
0

это действительно трудно сказать, что вы можете сделать

, но может быть, что следующим может помочь вам осветления и (надеюсь) это делать!

прежде всего, вы не можете «комбинировать» имена переменных

Так что я бы с массивом именованных диапазонов имен (т.е. String массив), которые необходимо заполнить с помощью определенного подразделам:

Function GetRanges() As String() 
    Dim ranges(1 To 3) As String 

    ranges(1) = "ONE" 
    ranges(2) = "TWO" 
    ranges(3) = "THREE" 
    GetRanges = ranges 
End Function 

, так что вы можете очистить ваш «основной» суб-код и сохранить только более соответствующий код там:

Sub TestRangeBC() 
    Dim r As Variant 
    Dim ws As Worksheet 

    Set ws = Worksheets("Ranges") '<--| change "Ranges" to your actual worksheet name 

    For Each r In GetRanges() '<--| loop through all ranges names 
     DoIt ws, CStr(r) '<--| call the range name processing routine passing worksheet and its named range name 
    Next r 
End Sub 

«главный» суб петли через именованные диапазоны массива непосредственно пособ Ted от GetRanges() и вызывает DoIt() на самом деле обрабатывать текущий один:

Sub DoIt(ws As Worksheet, rangeName As String) 
    Dim cell As Range 
    Dim iRow As Long 

    With ws.Range(rangeName) '<--| reference the passed name passed worksheet named range 
     For iRow = .Rows(2).Row To .Rows(.Rows.Count - 2).Row '<--| loop through its "inner" rows (i.e. off 1st and last rows) 
      Set cell = ws.Cells(iRow, 8) '<--| get current row corresponding cell in column "F" 
      If cell.value = "" Then Exit For '<--| exit at first blank column "F" corresponding cell 
      TableCalc cell '<-- call TableCalc passing the 'valid' cell as its parameter 
     Next iRow 
    End With 
End Sub 
+0

@ TonyAbadie, вы прошли через это? – user3598756

Смежные вопросы