Конкатенация дает ошибку с подчеркиванием - PullRequest
0 голосов
/ 28 мая 2010

Я пытаюсь создать макрос, который вводит имя листа и объединяет его с текстом. Например, для первого листа я хочу сказать «ThisIs_Sheet1_Test» в I5 Sheet1. Есть несколько листов, но они должны работать для всех них.

Что не так с моим кодом? Я думаю, что подчеркивание может разрушить все это. Вот что у меня есть:

Dim SheetName As String

Public Sub CommandButton1_Click()

SheetName = ActiveSheet.Name

Sheets("Sheet1").Range("I5", "I5") = ThisIs_" & SheetName.text & "_Test
Sheets("Sheet2").Range("H5", "H5") = ThisIs_" & SheetName.text & "_Test
Sheets("Sheet3").Range("G5", "G5") = ThisIs_" & SheetName.text & "_Test

End Sub

Этот вопрос был перенаправлен на Извлечь ранее значение с помощью конкатенации

Ответы [ 4 ]

2 голосов
/ 28 мая 2010

выглядит как проблема цитирования. ThisIs_ и _Test являются строками, верно? Таким образом, кавычки должны быть вокруг них, а не около & SheetName.text &

Sheets("Sheet1").Range("I5", "I5") = "ThisIs_" & SheetName.text & "_Test" 
1 голос
/ 28 мая 2010

Помимо пропущенных кавычек, SheetName является строкой, а не объектом, поэтому у него не будет свойства Text. Вы хотели, чтобы имя листа менялось при изменении листа? Вам нужно это:

Private Sub CommandButton1_Click()

    Dim ws As Worksheet

    For Each ws In Me.Parent.Worksheets
        ws.Range("I5").Value = "ThisIs_" & ws.Name & "_Test"
    Next ws

End Sub
0 голосов
/ 28 мая 2010

Можете ли вы потратить несколько минут на компиляцию своего кода (в окне VBA, Debug-> Compile VBA Project), прежде чем искать помощь других? Это кричало бы о ваших пропущенных кавычках, используя .Text для строковой переменной и т. Д.

Public Sub dummy()
Dim SheetName As String

SheetName = ActiveSheet.Name

Sheets("Sheet1").Range("I5", "I5") = "ThisIs_" & SheetName & "_Test"
Sheets("Sheet2").Range("H5", "H5") = "ThisIs_" & SheetName & "_Test"
Sheets("Sheet3").Range("G5", "G5") = "ThisIs_" & SheetName & "_Test"

End Sub

Подчеркивание имеет особое значение в мире VBA / VB. Его конкатенация кода (то есть, если ваш код слишком длинный и вы хотите разбить его на две строки, тогда вы ставите подчеркивание пробела (_) и переходите к следующей строке. А также Дик Куслейка прав насчет объекта / строки. Только для объектов, которые вы будет иметь разные особенности (.Text означает, что вы запрашиваете свойство Text этого объекта), и обычно это свойство Text будет иметь тип String. здесь у вас уже есть String, и вы просто используете его как есть.

0 голосов
/ 28 мая 2010

Я могу заставить его работать ... вроде.

Теперь он отображает ThisIS_Sheet1_Test в Sheet1 и т. Д.

Тем не менее, я настроил его для извлечения данных из списка в функцию, которую я назвал ThisIS_Sheet1_Test. Я подумал, что, как только я получу его для отображения имени, он включит функцию. Вот что у меня есть выше:

Public Sub ListBox2_LostFocus()
ListBox2.Height = 15
    With ListBox2
    ThisIS_Sheet1_Test = "'"
    For i = 0 To .ListCount - 1
        If .Selected(i) Then
            ThisIS_Sheet1_Test = ThisIS_Sheet1_Test & .List(i) & "','"
        End If
    Next i
End With
ThisIS_Sheet1_Test = Left(ThisIS_Sheet1_Test, Len(ThisIS_Sheet1_Test) - 2)
End Sub

Почему, когда я получаю нужный текст, он не переходит в ту функцию, о которой я думал, что будет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...