Использование текстовых полей в форме пользователя для определения переменных?
В настоящее время я запускаю макрос, чтобы сравнить самый последний лист данных с отчетом непосредственно перед ним и выделить изменения. Он прекрасно работает сам по себе. Теперь, однако, мы хотели бы иметь возможность сравнить выбранные листы из любого периода времени. Моя идея состояла в том, чтобы открыть простую форму пользователя с двумя текстовыми полями, которые пользователь может использовать, чтобы указать, какие два отчета он хочет сравнить. Я совершенно потерялся, хотя с идеей попытаться объявить общедоступные переменные; то, что у меня есть atm, это:
Option Explicit
Public shtNew As String, shtOld As String, _
TextBox1 As TextBox, TextBox2 As TextBox
Sub SComparison()
Const ID_COL As Integer = 31 'ID is in this column
Const NUM_COLS As Integer = 31 'how many columns are being compared?
Dim rwNew As Range, rwOld As Range, f As Range
Dim X As Integer, Id
shtNew = CSManager.TextBox1
shtOld = CSManager.TextBox2
'Row location of the first employee on "CurrentMaster" sheet
Set rwNew = shtNew.Rows(5)
Do While rwNew.Cells(ID_COL).Value <> ""
Id = rwNew.Cells(ID_COL).Value
Set f = shtOld.UsedRange.Columns(ID_COL).Find(Id, , xlValues, xlWhole)
If Not f Is Nothing Then
Set rwOld = f.EntireRow
For X = 1 To NUM_COLS
If rwNew.Cells(X).Value <> rwOld.Cells(X).Value Then
rwNew.Cells(X).Interior.Color = vbYellow
rwNew.Cells(33) = "UPDATE"
Else
rwNew.Cells(X).Interior.ColorIndex = xlNone
End If
Next X
End If
Set rwNew = rwNew.Offset(1, 0) 'next row to compare
Loop
Call SUpdates
End Sub
2 ответа:
Мое предложение было бы использовать Comboboxes вместо текстовых полей. Создайте форму пользователя с двумя командными кнопками и двумя комбо-боксами и заполните комбо-боксы в событии
UserForm_Initialize()
с помощью этого кода.Private Sub UserForm_Initialize() Dim ws As Worksheet For Each ws In ActiveWorkbook.Sheets ComboBox1.AddItem ws.Name: ComboBox2.AddItem ws.Name Next End Sub
И затем используйте этот код в кнопке
OK
Для сравнения.Private Sub CommandButton1_Click() Dim shtNew As Worksheet, shtOld As Worksheet If ComboBox1.ListIndex = -1 Then MsgBox "Please select the first sheet" Exit Sub End If If ComboBox2.ListIndex = -1 Then MsgBox "Please select the Second sheet" Exit Sub End If Set shtNew = Sheets(ComboBox1.Value) Set shtOld = Sheets(ComboBox2.Value) '~~> REST OF THE CODE HERE NOW TO WORK WITH THE ABOVE SHEETS End Sub Private Sub CommandButton2_Click() Unload Me End Sub
HTH
Сид
Для легкого исправления, не могли бы вы просто покрасить (извините, я англичанин!) листы, на которые вы хотите сослаться, затем сделайте что-то вроде:
Sub ListSheets() 'lists only non-coloured sheets in immediate window '(could amend to add to combo boxes) Dim w As Worksheet 'loop over worksheets in active workbook For Each w In Worksheets If w.Tab.Color Then 'if tab color is set, print Debug.Print w.Name End If Next w
Дайте мне знать, если это решает вашу проблему.