Разрыв между адресом, назначенным в коде именованному диапазону, и результирующим адресом именованного диапазона - PullRequest
1 голос
/ 15 февраля 2011

Я пытаюсь написать сценарий VBA в Excel 2003 (не мой выбор версии), чтобы разделить предопределенный диапазон на листе на десять именованных диапазонов. Имя рабочего листа - "paste_data", а "блок" ячеек, к которому я хочу ограничить скрипт, - A4: AO111. Иногда, когда я запускаю скрипт, он работает, но иногда кажется, что эффективная начальная ячейка смещается с A4 на другую. Вот пример плохих результатов (извините, я не могу опубликовать изображение, потому что я новичок):

Именованный диапазон table.emergency.count относится к диапазону V6: AO25, когда он должен относиться к диапазону V4: AO23.

Мой код здесь:

Sub tables_assign()
Dim j As Integer
Dim range_ref, range_name, rref As String
Dim tbles(1 To 10) As String
Dim rw1, rw2 As Integer
'##########################################################################################
'CREATION AND NAMING OF TABLES
'##########################################################################################
tbles(1) = "table.emergency.score": tbles(2) = "table.emergency.count": tbles(3) = "table.eol.score": tbles(4) = "table.eol.count": tbles(5) = "table.inpatient.score": tbles(6) = "table.inpatient.count": tbles(7) = "table.outpatient.score": tbles(8) = "table.outpatient.count": tbles(9) = "table.sds.score": tbles(10) = "table.sds.count"
For j = 1 To 10
    If j Mod 2 <> 0 Then
        If j = 1 Then
            rw1 = 4
            rw2 = 23
        Else
            rw1 = 4 + 22 * Application.WorksheetFunction.Ceiling((j / 2 - 1), 1)
            rw2 = 23 + 22 * Application.WorksheetFunction.Ceiling((j / 2 - 1), 1)
        End If
        rref = Trim(Application.WorksheetFunction.Substitute("=paste_data!A" & Str(rw1) & ":T" & Str(rw2), " ", ""))
        ActiveWorkbook.Names.Add tbles(j), rref
    Else
        If j = 2 Then
            rw1 = 4
            rw2 = 23
        Else
            rw1 = 4 + 22 * (j / 2 - 1)
            rw2 = 23 + 22 * (j / 2 - 1)
        End If
        rref = Trim(Application.WorksheetFunction.Substitute("=paste_data!V" & Str(rw1) & ":AO" & Str(rw2), " ", ""))
        ActiveWorkbook.Names.Add tbles(j), rref
    End If
Next j
End Sub

У кого-нибудь есть идея, почему это произойдет? Я догадываюсь, что «используемый диапазон» листа является виновником.

1 Ответ

0 голосов
/ 15 февраля 2011

Когда вы используете относительные ссылки в определенных именах, определение относится к активной ячейке.Чтобы избежать этого, используйте абсолютные ссылки, такие как $ V $ 4: $ AO $ 23.С абсолютными ссылками именованный диапазон всегда будет указывать на одни и те же ячейки.

Пример. Выберите ячейку A1 и определите имя test_relative как "= A1".Теперь выберите ячейку B10 и снова откройте определенное поле имени, выберите test_relative и вы увидите что-то вроде "= Sheet1! B10"

Чтобы исправить свой код, вставьте $ в диапазон значений

rref = Trim(Replace("=paste_data!$A$" & Str(rw1) & ":$T$" & Str(rw2), " ", ""))

Также обратите внимание, что

Dim rw1, rw2 As Integer

имеет размеры rw1 как вариант.Используйте

Dim rw1 As Integer, rw2 As Integer
...