Получите ранее значение с помощью конкатенации - PullRequest
0 голосов
/ 01 июня 2010

У меня есть код, который работает в некоторых ситуациях, но не работает в других.

У меня есть этот код:

 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 

, который производит "ThisIs_Sheet1_Test". Поэтому, когда я запускаю приведенный ниже код, он дает мне выбранные значения в списке.

Public Sub dummy() 
Dim SheetName As String 

SheetName = ActiveSheet.Name 

Sheets("Sheet1").Range("I5", "I5") = ThisIs_Sheet1_Test

End Sub

Однако, когда я использую

Sheets("Sheet1").Range("I5", "I5") = "ThisIs_" & SheetName & "_Test"

Я получаю значение «ThisIs_SheetName_Test», которое явно не то, что я ищу.

Как мне ввести значение, а затем VBA распознать, что оно должно указывать на более раннее значение?

Ответы [ 2 ]

1 голос
/ 01 июня 2010

Вы используете ThisIs_Sheet1_Test в качестве переменной для хранения значения (даже если вы явно не объявляете переменную). Вы не можете просто собрать строку с тем же именем и ожидать, что она каким-то образом узнает, что вы хотите (чтобы получить значение, содержащееся в переменной).

Я предполагаю, что вы пытаетесь это сделать, потому что каждый лист может иметь разные значения для отслеживания. В этом случае, вот несколько вариантов:

  • Явно объявляет массив открытых строк с достаточным количеством значений для каждого из ваших листов. Затем вы можете отслеживать каждое из ваших значений, используя порядковый номер рабочего листа, на котором вы находитесь.
  • Вместо использования переменной выберите скрытую ячейку электронной таблицы для хранения значения, затем вы можете просто использовать Sheets("Sheet1").Range("Z100").Value или что-то подобное. Это немного «хакерский», а также хрупкий (потому что пользователь может перезаписать ячейку, если она не заблокирована или скрыта), но может работать лучше без связки другого кода.
  • Используйте «пользовательские свойства» рабочего листа. Это будет выглядеть примерно так:

    Dim mySheet As Worksheet
    Set mySheet = ActiveSheet
    
    'mySheet.CustomProperties.Item(1).Delete
    mySheet.CustomProperties.Add "ListboxValues", "one,two,three"
    
    MsgBox mySheet.CustomProperties.Item(1).Name & " = " & _
           mySheet.CustomProperties.Item(1).Value
    

Если вы используете только одно собственное свойство, как в моем примере, они довольно просты в использовании. Если у вас есть более одного, вам придется пройти через цикл, чтобы найти пользовательское свойство с правильным именем и использовать его.

0 голосов
/ 01 июня 2010

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

Итак, переместите Dim SheetName As String к значению модуля, вплоть до первой строки.

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