Использование текстовых полей в пользовательской форме для определения переменных? - PullRequest
2 голосов
/ 22 марта 2012

В настоящее время я запускаю макрос, чтобы сравнить самый последний лист данных с отчетом непосредственно перед отчетом и выделить изменения.Он прекрасно работает сам по себе.Однако теперь мы хотели бы иметь возможность сравнивать выбранные листы за любой период времени.Моя идея состояла в том, чтобы открыть простую пользовательскую форму с двумя текстовыми полями, которые пользователь может использовать, чтобы указать, какие два отчета он хочет сравнить.Я совершенно заблудился, пытаясь объявить публичные переменные;у меня есть банкомат:

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 ]

3 голосов
/ 22 марта 2012

Мое предложение будет использовать Comboboxes вместо TextBoxes.Создайте пользовательскую форму с двумя командными кнопками и двумя комбинированными списками и заполните поля комбинированных списков в событии 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 для сравнения.1006 *

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

Sid

1 голос
/ 22 марта 2012

Для простого исправления, не могли бы вы просто раскрасить (извините, я англичанин!) Листы, на которые вы хотите сослаться, а затем сделать что-то вроде:

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

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

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