Использование текстовых полей в форме пользователя для определения переменных?


В настоящее время я запускаю макрос, чтобы сравнить самый последний лист данных с отчетом непосредственно перед ним и выделить изменения. Он прекрасно работает сам по себе. Теперь, однако, мы хотели бы иметь возможность сравнить выбранные листы из любого периода времени. Моя идея состояла в том, чтобы открыть простую форму пользователя с двумя текстовыми полями, которые пользователь может использовать, чтобы указать, какие два отчета он хочет сравнить. Я совершенно потерялся, хотя с идеей попытаться объявить общедоступные переменные; то, что у меня есть 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 2

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

Дайте мне знать, если это решает вашу проблему.