Присвоить имена диапазонам от одной рабочей книги до другой - PullRequest
0 голосов
/ 21 января 2020
Private Sub XXXX_Click()

Dim rng As Range
Dim rng2 As Range

Dim SummaryWb As Workbook
Dim ws As Worksheet

Dim tba As Variant
Dim wss As Variant
Dim tbrange As Variant
Dim myRangeName As String


wss = ThisWorkbook.Worksheets("ORSA").Range("G2:G10")
tbrange = ThisWorkbook.Worksheets("ORSA").Range("J2:J10")
tba = ThisWorkbook.Worksheets("ORSA").Range("C2:C10")


Set SummaryWb = Workbooks.Open("xxxxxx.xlsx")

For i = 1 To UBound(tba)

Set ws = SummaryWb.Worksheets(wss(i, 1))
Set rng2 = SummaryWb.ws.Range(tbrange(i, 1))

myRangeName = tba(i, 1)

SummaryWb.Names.Add Name:=myRangeName, RefersTo:=rng2

Next i

Здравствуйте, это мой код. Я пытаюсь присвоить имена диапазонам. У меня есть две рабочие тетради. Рабочая книга1 имеет имена диапазонов, диапазоны для назначения имени и имена рабочих листов в SummaryWb (которая является второй рабочей книгой). Это пример:

1) wss - это переменная варианта, в которой хранятся имена рабочих листов, например, Sheet1a

2) tbrange - это переменная варианта, в которой хранятся диапазоны, которые я хочу присвоить names, например "A12: B25" ----> Обратите внимание, что диапазоны указаны в SummaryWb

3) tba - это переменная варианта, в которой хранятся имена диапазонов, которые я хочу назначить, например RangeName1

Мой код не работает. Я не знаю почему. Я получаю ошибки, когда пытаюсь установить rng2, а имя не изменяется во второй книге.

Что я могу сделать?

Ответы [ 2 ]

0 голосов
/ 21 января 2020

Я верю, что этот код сделает то, что вы собираетесь Пожалуйста, попробуйте.

Private Sub XXXX_Click()

    Dim Wb As Workbook
    Dim WsNames As Variant
    Dim RngAddresses As Variant
    Dim Nnames As Variant
    Dim i As Long
    Dim myRangeName As String
    Dim Target As String

'    Set Wb = Workbooks.Open("xxxxxx.xlsx")

    With ThisWorkbook.Worksheets("ORSA")
        Nnames = .Range("C2:C10").Value
        WsNames = .Range("G2:G10").Value
        RngAddresses = .Range("J2:J10").Value
    End With

    For i = 1 To UBound(Nnames)
        myRangeName = Trim(Nnames(i, 1))
        Target = "'" & WsNames(i, 1) & "'!" & Range(RngAddresses(i, 1)).Address

        On Error Resume Next
        Wb.Names.Add Name:=myRangeName, RefersTo:=Target
        If Err Then
            MsgBox "Name: " & myRangeName & vbCr & _
                   "RefersTo: " & Target & vbCr & _
                   "Error: " & Err.Number & _
                   Err.Description
        End If
    Next i
End Sub
0 голосов
/ 21 января 2020

ws уже определена как объект рабочего листа этой строкой в ​​вашем коде.

Set ws = SummaryWb.Worksheets(wss(i, 1))

После того, как у вас есть этот набор, вам больше не нужно включать ссылку на рабочую книгу, так как он уже был установлен. С учетом сказанного обновите следующую строку следующим образом:

Set rng2 = ws.Range(tbrange(i, 1))

Что касается других ссылок на кодирование VBA, существует множество доступных вариантов.

Вот один пример

Просмотрите конкретные c примеры, основанные на том, что вы пытаетесь сделать в Google, и включите StackOverflow в поле поиска для получения наилучших результатов.

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