使用UserForm中的数据将值从一个工作表复制到另一个工作表

时间:2015-01-02 09:58:28

标签: excel vba excel-vba

我有一个Userform,其中包含您可以填写的以下值:

TextBoxLopnummer.Value
TextBoxFragestallare.Value
TextBoxMottagare.Value
TextBoxDatum.Value

照片:

enter image description here

当有人填写日期值时:TextBoxDatum.Value我想在整个工作簿中搜索此值,并在Sheet“LägginÄrende”单元格A15中粘贴该单元格所在的整行。请注意,此值可以在工作簿中的不同工作表中,并在同一工作表内多次出现。因此,在单元格A15及以下,可能会有很多行。

我已经开始实现这一点,但老实说,我对如何完成它没有任何想法:

'in the rows below I wanna write so that ".Value=copies the value from the sheets where it finds eg. the date".
emptyRow = WorksheetFunction.CountA(ws.Range("A:A")) + 14
Cells(emptyRow, 1).Value =
Cells(emptyRow, 2).Value =
Cells(emptyRow, 3).Value =
Cells(emptyRow, 4).Value =
Cells(emptyRow, 5).Value =
Cells(emptyRow, 6).Value =
Cells(emptyRow, 7).Value =
Cells(emptyRow, 8).Value =

请注意,您可以同时搜索更多日期,有4种可以搜索的标准,请参见上图。当你填写2个标准时,代码应该将这两个与整个工作簿中具有相同标准的行匹配并复制该行等。

TextBoxLopnummer也将始终位于单元格A2中,并且位于要搜索的工作表中的下方。单元格B2中的TextBoxFragestallare,单元格C2中的TextBoxMottagare,单元格D2中的TextBoxDatum。

如何继续解决我的问题?

1 个答案:

答案 0 :(得分:2)

这将使您完全了解您要做的事情。根据您原始问题中的评论,我相信这就是您所需要的。

流程:

  • 在UserForm代码上有一个搜索按钮的点击事件。在示例中,它是Button1。根据您自己的需要命名。

  • 每次运行前(每次请求)清除目标表

  • 从文本框值设置数组,其中每个值的索引与要搜索的列号匹配

  • 遍历每个工作表,目标工作表除外。

  • 一次一行,将相应列的值与匹配它的数组索引进行比较。

  • 如果找到匹配项,"匹配"变量设置为true

  • 循环播放数组中其余的TextBoxes值,如果其中任何一个不匹配,则匹配"变量设置为false,并将文本框上的循环作为失败分解。

  • 如果"匹配"通过搜索工作表的循环结束循环,第1列到第8列循环,将搜索到的工作表中的值设置为目标工作表。

  • 下一行完成循环

  • 下一个工作表完成循环

需要检查的问题:

  • 您可能需要对日期进行一些转换,但如果表单上的日期与用户表单上的日期格式相同,则应该有效。

  • 如果工作表中的文字具有0.0或不同的小数位,则数字可能会提供类似的问题。

  • 如果出现此类问题,只需使用您的本地窗口并逐步执行代码即可执行。您收到类似内容的可能错误是类型不匹配。通过使用“局部”窗口进行调试,您将知道需要格式化哪些特定值,以便将它们与文本框进行比较。如果单步进行太长时间,请设置一个断点。

未经测试评论问题。

Private Sub button1_click()

Dim ws As Worksheet
Dim lastRow As Long, lRow As Long, tRow As Long
Dim tempValue As String
Dim targetSheet As String
Dim tempList(1 To 4) As String
Dim i As Long
Dim match As Boolean

match = False

'Set TargetSheet and clear the previous contents
targetSheet = "Lägg in Ärende"
tRow = 15
lastRow = Sheets(targetSheet).Range("A" & Rows.count).End(xlUp).row
Sheets(targetSheet).Range("A15:H" & lastRow).ClearContents

'Set an array of strings, based on the index matching the column to search for each
tempList(1) = TextBoxLopnummer.Text       'Column "A" (1)
tempList(2) = TextBoxFragestallare.Text   'Column "B" (2)
tempList(3) = TextBoxMottagare.Text       'Column "C" (3)
tempList(4) = TextBoxDatum.Text           'Column "D" (4)

    'Search through each worksheet
    For Each ws In Worksheets
        If ws.name <> targetSheet Then
            'Get last row of sheet
            lastRow = ws.Range("A" & Rows.count).End(xlUp).row

            'Search through the sheet
            For lRow = 2 To lastRow
                'Using the array of values from the TextBoxes,
                'Each column number matches the index of the array.
                'Only testing the array values that have text in them,
                'If any don't match the loop is broken and returns to main search.
                For i = 1 To 4
                    If tempList(i) <> "" Then
                        If ws.Cells(lRow, i).Text = tempList(i) Then
                            match = True
                        Else
                            match = False
                            Exit For        'If any of the values is false, exit i loop
                        End If
                    End If
                Next i

                'If there was a match, copy the data from Searched ws to targetSheet
                If match = True Then
                    'Get the first Empty row on target sheet
                    For lCol = 1 To 8
                        Sheets(targetSheet).Cells(tRow, lCol).Value = ws.Cells(lRow, lCol).Value
                    Next lCol
                    tRow = tRow + 1
                End If
            Next lRow
        End If
    Next ws

End Sub