#vba #excel
#vba #excel
Вопрос:
Пожалуйста, помогите мне со списками. Что я пытаюсь сделать, так это:
я выбрал два элемента из списка и переместил их вправо.
Я сохранил файл Excel. Я снова открыл файл, и справа ничего не было.
Пожалуйста, помогите. Я использовал следующий код в VBA:
Private Sub CommandButton6_Click()
Dim iCtr As Long
For iCtr = 0 To Me.ListBox2.ListCount - 1
Me.ListBox1.AddItem Me.ListBox2.List(iCtr)
Next iCtr
Me.ListBox2.Clear
End Sub
Private Sub BTN_moveAllRight_Click()
Dim iCtr As Long
For iCtr = 0 To Me.ListBox1.ListCount - 1
Me.ListBox2.AddItem Me.ListBox1.List(iCtr)
Next iCtr
Me.ListBox1.Clear
End Sub
Private Sub BTN_MoveSelectedLeft_Click()
Dim iCtr As Long
For iCtr = 0 To Me.ListBox2.ListCount - 1
If Me.ListBox2.Selected(iCtr) = True Then
Me.ListBox1.AddItem Me.ListBox2.List(iCtr)
End If
Next iCtr
For iCtr = Me.ListBox2.ListCount - 1 To 0 Step -1
If Me.ListBox2.Selected(iCtr) = True Then
Me.ListBox2.RemoveItem iCtr
End If
Next iCtr
End Sub
Private Sub BTN_MoveSelectedRight_Click()
Dim iCtr As Long
For iCtr = 0 To Me.ListBox1.ListCount - 1
If Me.ListBox1.Selected(iCtr) = True Then
Me.ListBox2.AddItem Me.ListBox1.List(iCtr)
End If
Next iCtr
For iCtr = Me.ListBox1.ListCount - 1 To 0 Step -1
If Me.ListBox1.Selected(iCtr) = True Then
Me.ListBox1.RemoveItem iCtr
End If
Next iCtr
End Sub
Private Sub cmdOK_Click()
Unload Me
End Sub
Private Sub Worksheet_Activate()
Dim myCell As Range
Dim rngItems As Range
Set rngItems = Sheets("Subject Disposition").Range("Route")
Me.ListBox1.Clear
Me.ListBox2.Clear
With Me.ListBox1
.LinkedCell = ""
.ListFillRange = ""
For Each myCell In rngItems.Cells
If Trim(myCell) <> "" Then
.AddItem myCell.Value
End If
Next myCell
End With
Me.ListBox1.MultiSelect = fmMultiSelectMulti
Me.ListBox2.MultiSelect = fmMultiSelectMulti
End Sub
Комментарии:
1. Неясно, о чем вы спрашиваете. Пожалуйста, подумайте о пересмотре вашего вопроса, чтобы включить более подробную информацию, включая скриншоты (если у вас недостаточно репутации, чтобы загрузить их здесь, отправьте их на imgur.com и добавьте ссылки). Включите более подробное описание, а не просто сбрасывайте свой код. Текущий код, похоже, не имеет ничего похожего на «перемещение влево или вправо», поэтому неясно, что вы ожидаете, должно произойти…
2. Также обратите внимание, что изменения в элементах управления формы обычно не сохраняются после
_Terminate
события формы. Если вам нужно изменить значение по умолчанию, вам нужно будет что-то сделать вInitialize
илиActivate
обработчике событий формы…3. @DavidZemens Большое спасибо за ваши комментарии. Что я пытаюсь сделать, так это то, что я переместил два значения из левого поля вправо, как показано на скриншоте_1 ( i.imgur.com/YwhuXyw.jpg ). После сохранения файла Excel, если я снова открою файл Excel, он снова вернется к настройкам по умолчанию, как показано на скриншоте_2 ( imgur.com/9vCJfEb ). Изменения не были сохранены.
4. То, что вы хотите, не может быть сделано с помощью используемого вами кода. Как сказал Дэвид, изменения не будут сохраняться после завершения кода. Что вы можете сделать, это передать выбранные вами элементы куда-нибудь на листе, а затем использовать свойство RowSource для извлечения его позже. Или, что еще лучше, обновите свой код, чтобы полностью использовать это свойство.
5. @L42 Большое спасибо за ваши комментарии и помощь. Не могли бы вы указать мне, что и куда добавить свойство. Я не эксперт в VBA. Читая разные блоги и справку, я написал код, упомянутый выше. Заранее большое спасибо за вашу помощь.
Ответ №1:
Я сделал образец для вас.
Сначала настройте исходный лист (в этом примере мы используем Лист1) и пользовательскую форму, как показано ниже:
Как вы можете видеть, у нас есть исходные данные или список в ячейке A1: A10 на листе 1.
Чтобы отобразить его в созданной вами пользовательской форме, вы используете свойство RowSource, как показано в событии UserForm_Initialize, как указал Дэвид. (Смотрите ниже)
И затем вы видите коды для остальных кнопок, которые перемещают выбранные элементы слева направо и наоборот. Также кнопка переместить все влево или вправо.
По сути, мы манипулируем объектами диапазона в листе 1, а затем обновляем свойство RowSource в конце каждого блока кода, чтобы все выглядело так, как будто мы манипулируем списками.
Теперь, когда вы сохраняете рабочий лист, он сохранит любые диапазоны значений A1: A10 и B1: B10. HTH
Option Explicit
Private Sub CommandButton1_Click() 'move item right to left
Dim rng As Range
Dim i As Long, j As Long
With Me.ListBox2 'right listbox
For i = 0 To .ListCount - 1
If .Selected(i) = True Then
Set rng = Sheet1.Range("B1:B10").Find(.List(i), [B10])
If Not rng Is Nothing Then
With Sheet1
If Len(.Range("A1").Value) = 0 Then
j = 1
Else
j = .Range("A" amp; .Rows.Count).End(xlUp).Offset(1, 0).Row
End If
rng.Copy .Range("A" amp; j)
rng.Delete xlUp
End With
End If
End If
Next
End With
DoEvents
Me.ListBox1.RowSource = _
"'[" amp; ThisWorkbook.Name amp; "]" amp; Sheet1.Name amp; "'!" amp; "A1:A10"
Me.ListBox2.RowSource = _
"'[" amp; ThisWorkbook.Name amp; "]" amp; Sheet1.Name amp; "'!" amp; "B1:B10"
End Sub
Private Sub CommandButton2_Click() 'move item left to right
Dim rng As Range
Dim i As Long, j As Long
With Me.ListBox1 'left listbox
For i = 0 To .ListCount - 1
If .Selected(i) = True Then
Set rng = Sheet1.Range("A1:A10").Find(.List(i), [A10])
If Not rng Is Nothing Then
With Sheet1
If Len(.Range("B1").Value) = 0 Then
j = 1
Else
j = .Range("B" amp; .Rows.Count).End(xlUp).Offset(1, 0).Row
End If
rng.Copy .Range("B" amp; j)
rng.Delete xlUp
End With
End If
End If
Next
End With
DoEvents
Me.ListBox1.RowSource = _
"'[" amp; ThisWorkbook.Name amp; "]" amp; Sheet1.Name amp; "'!" amp; "A1:A10"
Me.ListBox2.RowSource = _
"'[" amp; ThisWorkbook.Name amp; "]" amp; Sheet1.Name amp; "'!" amp; "B1:B10"
End Sub
Private Sub CommandButton3_Click() 'move all to left
Dim rng As Range
With Sheet1
If Me.ListBox2.ListCount = 0 Then Exit Sub
Set rng = .Range("B1", .Range("B" amp; .Rows.Count).End(xlUp))
If Len(.Range("A1").Value) = 0 Then
rng.Copy .Range("A1")
Else
rng.Copy .Range("A" amp; .Rows.Count).End(xlUp).Offset(1, 0)
End If
rng.ClearContents
End With
DoEvents
Me.ListBox1.RowSource = _
"'[" amp; ThisWorkbook.Name amp; "]" amp; Sheet1.Name amp; "'!" amp; "A1:A10"
Me.ListBox2.RowSource = _
"'[" amp; ThisWorkbook.Name amp; "]" amp; Sheet1.Name amp; "'!" amp; "B1:B10"
End Sub
Private Sub CommandButton4_Click() 'move all to right
Dim rng As Range
With Sheet1
If Me.ListBox1.ListCount = 0 Then Exit Sub
Set rng = .Range("A1", .Range("A" amp; .Rows.Count).End(xlUp))
If Len(.Range("B1").Value) = 0 Then
rng.Copy .Range("B1")
Else
rng.Copy .Range("B" amp; .Rows.Count).End(xlUp).Offset(1, 0)
End If
rng.ClearContents
End With
DoEvents
Me.ListBox1.RowSource = _
"'[" amp; ThisWorkbook.Name amp; "]" amp; Sheet1.Name amp; "'!" amp; "A1:A10"
Me.ListBox2.RowSource = _
"'[" amp; ThisWorkbook.Name amp; "]" amp; Sheet1.Name amp; "'!" amp; "B1:B10"
End Sub
Private Sub UserForm_Initialize()
'Initialize the left and right listbox value
Me.ListBox1.RowSource = _
"'[" amp; ThisWorkbook.Name amp; "]" amp; Sheet1.Name amp; "'!" amp; "A1:A10"
Me.ListBox2.RowSource = _
"'[" amp; ThisWorkbook.Name amp; "]" amp; Sheet1.Name amp; "'!" amp; "B1:B10"
End Sub