VBA автоматически конвертирует мой диапазон в абсолютные значения, когда я использую относительный диапазон - PullRequest
0 голосов
/ 25 января 2019

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

Я стараюсь избегать использования функции смещения, и все, что я нахожу в сети, говорит мне только о том, как преобразовать ее с помощьюфункция, но для формул (не диапазон, как мне нужно.) Код ниже берет мой диапазон и делает их все абсолютными.Как мне заставить их оставаться родственниками?Я пробовал R1C1, который, я думаю, действителен только для формулы.В качестве исходного кода я использовал сайт: https://powerspreadsheets.com/vba-create-named-range/

Option Explicit

Sub createNamedRange()  'https://powerspreadsheets.com/vba-create-named-range/
Dim myWorksheet As Worksheet
Dim i As Byte
Dim myNamedRange As Range
Dim myRangeName As String

Set myWorksheet = ThisWorkbook.Worksheets("Sheet1")     'identify worksheet containing cell range, and cell range itself (below)...

For i = 1 To 12         'i represents each month. we'll set range dependent upon month

Select Case i

Case Is = 1
    Set myNamedRange = myWorksheet.Range("B8")

Case Is = 2
    Set myNamedRange = myWorksheet.Range("B14,B8")

Case Is = 3
    Set myNamedRange = myWorksheet.Range("B20,B14,B8")

Case Is = 4
    Set myNamedRange = myWorksheet.Range("B30,B20,B14,B8")

Case Is = 5
    Set myNamedRange = myWorksheet.Range("B36,B30,B20,B14,B8")

Case Is = 6
    Set myNamedRange = myWorksheet.Range("B42,B36,B30,B20,B14,B8")

Case Is = 7
    Set myNamedRange = myWorksheet.Range("B52,B42,B36,B30,B20,B14,B8")

Case Is = 8
    Set myNamedRange = myWorksheet.Range("B58,B52,B42,B36,B30,B20,B14,B8")

Case Is = 9
    Set myNamedRange = myWorksheet.Range("B64,B58,B52,B42,B36,B30,B20,B14,B8")

Case Is = 10
    Set myNamedRange = myWorksheet.Range("B74,B64,B58,B52,B42,B36,B30,B20,B14,B8")

Case Is = 11
    Set myNamedRange = myWorksheet.Range("B80,B74,B64,B58,B52,B42,B36,B30,B20,B14,B8")

Case Is = 12
    Set myNamedRange = myWorksheet.Range("B86,B80,B74,B64,B58,B52,B42,B36,B30,B20,B14,B8")
End Select

myRangeName = MonthName(i) & "Denominator2019"      'specify defined name
ThisWorkbook.Names.Add Name:=myRangeName, RefersTo:=myNamedRange    'create named range with workbook scope. Defined name and cell range are as specified

Next i      'run back through loop and complete other months

End Sub

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Вот именно то, что я пытался сделать:

Sub createNamedRange()

Dim myWorksheet As Worksheet
Dim i As Byte
Dim myRangeName As String

Set myWorksheet = ThisWorkbook.Worksheets("Sheet1")     'identify worksheet containing cell range, and cell range itself (below)...

myWorksheet.Range("B1").Select

For i = 1 To 12         'i represents each month. we'll set range dependent upon month

myRangeName = MonthName(i) & "Denominator2019"      'specify defined name

Select Case i

Case Is = 1
    myWorksheet.Names.Add Name:=myRangeName, RefersToR1C1:="=Sheet1!R[7]C"    'create named range with workbook scope. Must use r1c1 for relative references.

Case Is = 2
    myWorksheet.Names.Add Name:=myRangeName, RefersToR1C1:="=Sheet1!R[13]C,Sheet1!R[7]C"

Case Is = 3
    myWorksheet.Names.Add Name:=myRangeName, RefersToR1C1:="=Sheet1!R[19]C,Sheet1!R[13]C,Sheet1!R[7]C"

Case Is = 4
    myWorksheet.Names.Add Name:=myRangeName, RefersToR1C1:="=Sheet1!R[29]C,Sheet1!R[19]C,Sheet1!R[13]C,Sheet1!R[7]C"

Case Is = 5
    myWorksheet.Names.Add Name:=myRangeName, RefersToR1C1:="=Sheet1!R[35]C,Sheet1!R[29]C,Sheet1!R[19]C,Sheet1!R[13]C,Sheet1!R[7]C"

Case Is = 6
    myWorksheet.Names.Add Name:=myRangeName, RefersToR1C1:="=Sheet1!R[41]C,Sheet1!R[35]C,Sheet1!R[29]C,Sheet1!R[19]C,Sheet1!R[13]C,Sheet1!R[7]C"

Case Is = 7
    myWorksheet.Names.Add Name:=myRangeName, RefersToR1C1:="=Sheet1!R[51]C,Sheet1!R[41]C,Sheet1!R[35]C,Sheet1!R[29]C,Sheet1!R[19]C,Sheet1!R[13]C,Sheet1!R[7]C"

Case Is = 8
    myWorksheet.Names.Add Name:=myRangeName, RefersToR1C1:="=Sheet1!R[57]C,Sheet1!R[51]C,Sheet1!R[41]C,Sheet1!R[35]C,Sheet1!R[29]C,Sheet1!R[19]C,Sheet1!R[13]C,Sheet1!R[7]C"

Case Is = 9
    myWorksheet.Names.Add Name:=myRangeName, RefersToR1C1:="=Sheet1!R[63]C,Sheet1!R[57]C,Sheet1!R[51]C,Sheet1!R[41]C,Sheet1!R[35]C,Sheet1!R[29]C,Sheet1!R[19]C,Sheet1!R[13]C,Sheet1!R[7]C"

Case Is = 10
    myWorksheet.Names.Add Name:=myRangeName, RefersToR1C1:="=Sheet1!R[73]C,Sheet1!R[63]C,Sheet1!R[57]C,Sheet1!R[51]C,Sheet1!R[41]C,Sheet1!R[35]C,Sheet1!R[29]C,Sheet1!R[19]C,Sheet1!R[13]C,Sheet1!R[7]C"

Case Is = 11
    myWorksheet.Names.Add Name:=myRangeName, RefersToR1C1:="=Sheet1!R[79]C,Sheet1!R[73]C,Sheet1!R[63]C,Sheet1!R[57]C,Sheet1!R[51]C,Sheet1!R[41]C,Sheet1!R[35]C,Sheet1!R[29]C,Sheet1!R[19]C,Sheet1!R[13]C,Sheet1!R[7]C"

Case Is = 12
    myWorksheet.Names.Add Name:=myRangeName, RefersToR1C1:="=Sheet1!R[85]C,Sheet1!R[79]C,Sheet1!R[73]C,Sheet1!R[63]C,Sheet1!R[57]C,Sheet1!R[51]C,Sheet1!R[41]C,Sheet1!R[35]C,Sheet1!R[29]C,Sheet1!R[19]C,Sheet1!R[13]C,Sheet1!R[7]C"
End Select

Next i      'run back through loop and complete other months

End Sub
0 голосов
/ 25 января 2019

Запись макроса при добавлении относительного именованного диапазона Я получаю это:

ActiveWorkbook.Names.Add Name:="test4", _
                         RefersToR1C1:= "=Sheet1!R[1]C,Sheet1!R[1]C[2],Sheet1!R[1]C[4]"

При создании имени я выбрал B10, а для адреса диапазона я добавил «B11, D11, F11»

Может быть, вы могли бы немного объяснить, как именно вы хотите использовать свой относительный диапазон?

РЕДАКТИРОВАТЬ: что-то вроде этого -

Sub createNamedRanges()  'https://powerspreadsheets.com/vba-create-named-range/
    Dim myWorksheet As Worksheet, i As Long
    Dim myNamedRange As Range, sRng As String, arr
    Dim myRangeName As String, sep As String

    Set myWorksheet = ThisWorkbook.Worksheets("Sheet1")
    arr = Split("B86,B80,B74,B64,B58,B52,B42,B36,B30,B20,B14,B8", ",") 'array(0 to 11)

    sRng = ""
    sep = ""
    For i = 1 To 12

        sRng = arr(11 - (i - 1)) & sep & sRng
        sep = "," 'add separator after first loop pass
        Set myNamedRange = myWorksheet.Range(sRng)
        myRangeName = MonthName(i) & "Denominator2019"

        ThisWorkbook.Names.Add Name:=myRangeName, _
                RefersToR1C1:=myNamedRange.Address(False, False, xlR1C1, True)
    Next i

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...