2015-11-18 1 views
1

Возможно, я нашел новую проблему! Я пытаюсь выбрать рабочие листы на основе имени рабочего листа, используя переменную для имени, так как это все часть цикла. Но я столкнулся с трудностями, когда имя рабочего листа - это число, поскольку, если у меня есть, скажем, имя = 5, то Worksheets (name) дает мне листок индекса 5 и рабочие листы («имя»), конечно, ищет листок с именем "имя".Номер индекса/имя рабочего листа с переменными, когда имена рабочих листов являются численными

Я мог бы сделать обходной путь с добавлением буквы к имени каждого рабочего листа, чтобы оно не рассматривалось как число, а затем удаляло эти буквы, но есть ли лучший способ?

Sub RenameFiles() 
Dim source, old_filename, old_tab, new_filename As String 
Dim i As Integer 
source = Range("path").Value 
For i = 1 To Range("total_file_number").Value 
    old_filename = Worksheets("Import and combine").Cells(3 + i, 2).Value 
    old_tab = Worksheets("Import and combine").Cells(3 + i, 3).Value 
    new_filename = Worksheets(old_tab).Cells(1, 1).Value 'If old_tab is a number, VBA treats Worksheets(old_tab) as looking up a worksheet by index number rather than name 
    If Left(Worksheets(old_tab).Cells(1, 1).Value, 1) = "*" Then new_filename = Right(new_filename, Len(new_filename) - 2) 'removes asterisk from name 
    new_filename = Replace(new_filename, ">", "") 'removes > from name, since > can't be used in file names 
    Worksheets(old_tab).Name = new_filename 
    Worksheets("Import and combine").Cells(3 + i, 3).Value = new_filename 
    Name source & "\" & old_filename As source & "\" & new_filename 
Next i 
End Sub 
+1

использовать 'cstr (name)'. с именем, являющимся переменной. Он изменит числа на строки. –

ответ

3

Ваша проблема вызвана этой линией:

Dim source, old_filename, old_tab, new_filename As String 

... хотя он не проявляет себя, пока вы не попытаетесь получить доступ к коллекции листов.

Это очень распространенная ошибка. Единственная переменная в приведенной выше строке, которая имеет тип String, является последней. Каждый из них имеет тип Variant.

При присвоении варианту old_tab любое числовое значение будет храниться как число, а не строка. И проблема заключается в том, что для коллекции Worksheets требуется строковое значение в качестве ключа для возврата правильного рабочего листа.

Если каждая из переменных в строке выше должен быть типа String, то сделать это:

Dim source As String, old_filename As String, old_tab As String, new_filename As String 

... и теперь, когда old-tab является String, это значение будет работать должным образом в качестве ключа в коллекцию Рабочих таблиц.

+0

И вот я подумал, что нашел что-то новое. Спасибо, это была именно проблема! – Clay

+0

Добро пожаловать. –

Смежные вопросы