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")
Другие вопросы по тегам