Я пишу процедуру для генерации ряда именованных диапазонов из значений на листе, с ячейкой, которая будет названа в столбце C, и именем, которое будет назначено в соседней ячейке в столбце D. Все варианты, которые я пробовал ссылаться на эти две ячейки как на диапазоны возвращаемых ошибок. Хотя эта процедура будет использоваться только один раз для генерации этих имен, я хотел бы определить правильный синтаксис, чтобы в будущем я мог ссылаться на диапазоны для других целей.
У меня есть временная ActiveX CommandButton, которая вызывает следующий код (сейчас для целей тестирования просто ссылка на две строки):
Private Sub CommandButton1_Click()
Call SetRangeNames(38, 39)
End Sub
Я поместил процедуру SetRangeNames в модуль, основываясь на рекомендациях в постах, которые я видел в других местах. Две строки кода, возвращающие ошибки, обозначаются комментарием внутри кода процедуры, и все варианты, которые я пробовал (с ошибками, которые они возвращают), следуют этому. Я поместил вызов MsgBox в proc, чтобы посмотреть, как он рендерит сгенерированные ссылки на ячейки Отображает:
rangeNameValueCellAddress = "C38"; namedRangeCellAddress = "D38"
или
rangeNameValueCellAddress = "C39"; namedRangeCellAddress = "D39"
Вот одна из вариаций прока:
Public Sub SetRangeNames(startRow As Integer, endRow As Integer)
Dim theRange As Range
Dim currentRow As Integer
Dim currentName As String
Dim rangeNameValueCellAddress As String
Dim namedRangeCellAddress As String
For currentRow = startRow To endRow
rangeNameValueCellAddress = """D" & Trim(Str(currentRow) & """")
namedRangeCellAddress = """C" & Trim(Str(currentRow) & """")
MsgBox ("rangeNameValueCellAddress = " & rangeNameValueCellAddress & _
"; namedRangeCellAddress = " & namedRangeCellAddress)
'MsgBox displays: rangeNameValueCellAddress = "C38"; namedRangeCellAddress = "D38"
' or: rangeNameValueCellAddress = "C39"; namedRangeCellAddress = "D39"
'*** The following two statements return errors:
Set theRange = ThisWorkbook.Worksheets(ActiveSheet).Range(namedRangeCellAddress)
currentName = ThisWorkbook.Worksheets(ActiveSheet).Range(rangeNameValueCellAddress).Value2
ActiveWorkbook.Names.Add Name:=currentName, RefersTo:=theRange
Next currentRow
End Sub
Вот варианты, которые я попробовал («SYSProjectData» - это и имя, и CodeName, и имя рабочей таблицы, с которой я работаю):
Set theRange = SYSProjectData.Range(namedRangeCellAddress)
currentName = SYSProjectData.Range(rangeNameValueCellAddress).Value2
Возвращает: «Ошибка приложения или объекта»
Set theRange = ThisWorkbook.SYSProjectData.Range(namedRangeCellAddress)
currentName = ThisWorkbook.SYSProjectData.Range(rangeNameValueCellAddress).Value2
Возвращает: «Объект не поддерживает это свойство или метод»
Set theRange = ThisWorkbook.ActiveSheet.Range(namedRangeCellAddress)
currentName = ThisWorkbook.ActiveSheet.Range(rangeNameValueCellAddress).Value2
Возвращает: «Ошибка приложения или объекта»
Set theRange = ActiveSheet.Range(namedRangeCellAddress)
currentName = ActiveSheet.Range(rangeNameValueCellAddress).Value2
Возвращает: «Ошибка приложения или объекта»
Set theRange = ThisWorkbook.Worksheets(SYSProjectData).Range(namedRangeCellAddress)
currentName = ThisWorkbook.Worksheets(SYSProjectData).Range(rangeNameValueCellAddress).Value2
Возвращает: "Несоответствие типов"
Set theRange = ThisWorkbook.Worksheets("SYSProjectData").Range(namedRangeCellAddress)
currentName = ThisWorkbook.Worksheets("SYSProjectData").Range(rangeNameValueCellAddress).Value2
Возвращает: «Ошибка приложения или объекта»
Set theRange = ThisWorkbook.Sheets(SYSProjectData).Range(namedRangeCellAddress)
currentName = ThisWorkbook.Sheets(SYSProjectData).Range(rangeNameValueCellAddress).Value2
Возвращает: "Несоответствие типов"
Set theRange = ThisWorkbook.Sheets("SYSProjectData").Range(namedRangeCellAddress)
currentName = ThisWorkbook.Sheets("SYSProjectData").Range(rangeNameValueCellAddress).Value2
Возвращает: «Ошибка приложения или объекта»
Set theRange = ThisWorkbook.Sheets(ActiveSheet).Range(namedRangeCellAddress)
currentName = ThisWorkbook.Sheets(ActiveSheet).Range(rangeNameValueCellAddress).Value2
Возвращает: "Несоответствие типов"
Set theRange = ThisWorkbook.Worksheets(ActiveSheet).Range(namedRangeCellAddress)
currentName = ThisWorkbook.Worksheets(ActiveSheet).Range(rangeNameValueCellAddress).Value2
Возвращает: "Несоответствие типов"
Может кто-нибудь сказать мне, что я делаю не так?
Спасибо!