Range.Value не работает для назначения содержимого ячейки переменной в VBA
Я пишу свой первый скрипт на VBA, и мне трудно присвоить значение, введенное в ячейку, переменной String, я использовал окна сообщений, чтобы проверить, где проблема, и она показала мне, что я нахожусь в нужной книге и на правом листе, но затем показывает пустое значение в "A1", хотя у меня там есть текстовое значение и я сохранил книгу, что у меня ниже:
Sub copyworksheet()
Dim sourceWorkbook As String
Dim destinationWorkbook As String
Dim folderName As String
destinationWorkbook = ActiveWorkbook.Name
Sheets(1).Activate
MsgBox Range("A1").Value ' Shows blank when debugging
folderName = Range("A1").Value
MsgBox "Here is " & folderName ' Shows "Here is " when debugging
End Sub
** Как дополнительное примечание, ячейка A1 содержит 02Nov, и я попытался изменить формат этой ячейки, и это не решило проблему, в настоящее время формат ячейки - Текст
3 ответа
Я думаю, что это должно сработать:
Sub copyworksheet()
Dim sourceWorkbook As String
Dim destinationWorkbook As String
Dim folderName As String
destinationWorkbook = ActiveWorkbook.Name
MsgBox Sheets(1).Range("A1").Value 'reference the Sheet absolutely when using Range
folderName = Sheets(1).Range("A1").Value
MsgBox "Here is " & folderName
End Sub
Альтернативный способ использует Cells
,
MsgBox Cells(1, 1).Value
folderName = Cells(1, 1).Value
Sheets(1)
ссылается на первую вкладку в активной книге. Эта вкладка может быть рабочим листом, листом кода или листом диаграммы.
Лучше использовать WorkSheets()
ссылаться на рабочие листы. Чтобы убедиться, что вы всегда получаете правильный лист, независимо от порядка, используйте имя:
WorkSheets("Sheet1")
Лучшим методом было бы использовать CodeName
, Это имя листа, которое пользователь не может изменить. Он находится в списке листов в VBA:
Часть перед ()
это Codename
, Так Worksheets("Sheet1")
Кодовое имя Sheet1
, Используя кодовое имя, мы ссылаемся на лист, просто набрав его:
Sheet1
Это не может быть легко изменено пользователем, как имя листа. Это всегда будет относиться к соответствующему листу независимо от положения вкладки и названия листа.
Следующий:
Не использовать .Activate
или же .Select
Они просто замедляют код. Просто добавьте диапазоны с правильными ссылками листа:
Worksheets("Sheet1").Range("A1")
Или лучше с CodeName
:
Sheet1.Range("A1")