从找到的文本向右返回单元格的值

时间:2018-05-23 00:04:22

标签: excel vba

我正在尝试遍历一个文件夹,查找其中包含“CUSTOMER ID”字样的所有工作簿,然后从相邻的单元格中复制(客户的名称在同一行的右侧)。客户名称与工作簿文件名一起粘贴到主工作簿中。

我找到了以下代码,它返回我正在搜索的文本。

Sub SearchFolders()
    Dim fso As Object
    Dim fld As Object
    Dim strSearch As String
    Dim strPath As String
    Dim strFile As String
    Dim wOut As Worksheet
    Dim wbk As Workbook
    Dim wks As Worksheet
    Dim lRow As Long
    Dim rFound As Range
    Dim strFirstAddress As String

    On Error GoTo ErrHandler
    Application.ScreenUpdating = False

    'Change as desired
    strPath = "c:\MyFolder"
    strSearch = "Specific text"

    Set wOut = Worksheets.Add
    lRow = 1
    With wOut
        .Cells(lRow, 1) = "Workbook"
        .Cells(lRow, 2) = "Worksheet"
        .Cells(lRow, 3) = "Cell"
        .Cells(lRow, 4) = "Text in Cell"
        Set fso = CreateObject("Scripting.FileSystemObject")
        Set fld = fso.GetFolder(strPath)

        strFile = Dir(strPath & "\*.xls*")
        Do While strFile <> ""
            Set wbk = Workbooks.Open _
              (Filename:=strPath & "\" & strFile, _
              UpdateLinks:=0, _
              ReadOnly:=True, _
              AddToMRU:=False)

            For Each wks In wbk.Worksheets
                Set rFound = wks.UsedRange.Find(strSearch)
                If Not rFound Is Nothing Then
                    strFirstAddress = rFound.Address
                End If
                Do
                    If rFound Is Nothing Then
                        Exit Do
                    Else
                        lRow = lRow + 1
                        .Cells(lRow, 1) = wbk.Name
                        .Cells(lRow, 2) = wks.Name
                        .Cells(lRow, 3) = rFound.Address
                        .Cells(lRow, 4) = rFound.Value
                    End If
                    Set rFound = wks.Cells.FindNext(After:=rFound)
                Loop While strFirstAddress <> rFound.Address
            Next

            wbk.Close (False)
            strFile = Dir
        Loop
        .Columns("A:D").EntireColumn.AutoFit
    End With
    MsgBox "Done"

ExitHandler:
    Set wOut = Nothing
    Set wks = Nothing
    Set wbk = Nothing
    Set fld = Nothing
    Set fso = Nothing
    Application.ScreenUpdating = True
    Exit Sub

ErrHandler:
    MsgBox Err.Description, vbExclamation
    Resume ExitHandler
End Sub

2 个答案:

答案 0 :(得分:1)

要从“特定文本”中将单元格的值返回到右侧:

.Cells(lRow, 4) = rFound.Offset(0, 1).Value

答案 1 :(得分:0)

扩展@Tim Williams的正确建议......

找到看起来像的代码块:

  $("#start_date").datepicker({
      format: 'yyyy-mm-dd',
      // startDate: '-3d'
      autoclose: true,
      endDate: '+0days'

    }).on('changeDate', function(e) {
      var end_date = '';
      end_date = $("#start_date").val();
      //  var end_date2 = moment(end_date).add('1', 'days');

      var date2 = '';
      date2 = $('#start_date').datepicker('getDate', '+1d');
      date2.setDate(date2.getDate() + 30);

      $("#end_date").val(end_date).datepicker({
        format: 'yyyy-mm-dd',
        startDate: end_date,
        autoclose: true,
        endDate: date2
      });

    });

然后更改第四行,使其与代码匹配:

.Cells(lRow, 1) = wbk.Name
.Cells(lRow, 2) = wks.Name
.Cells(lRow, 3) = rFound.Address
.Cells(lRow, 4) = rFound.Value

这是一个方便的代码片段,可以在工具包中使用,但有时它太过沉重。一个示例是创建文件名和/或路径字符串的列表。如果不需要打开一个文件,那么打开所有文件就变得非常荒谬了。当然,应该修改此工具以更好地满足各种要求,但对于许多场景来说,这是一个更好的选择。如果在那里有任何人在搜索千个文件的内容时遇到了严峻的挑战,请记录所有产生正面点击的文件,并且您不需要打开您已识别的任何文件或者关心文件是否有一个或多个正面点击...如果那样你那么我建议使用的工具将胜过这里建议的那个被称为...... Windows。

必须将Windows配置为搜索文件内容才能使其正常工作,并且设置位于两个不同的位置。一个是“搜索”窗口的“搜索”选项卡的“高级搜索”下拉菜单中的复选框。另一个是在“文件夹选项”窗口的“搜索”选项卡中。

使用OP的示例,生成包含字符串&#34; CUSTOMER ID&#34;的所有文件名和位置的列表。只需打开资源管理器,激活搜索框,然后输入:

内容:CUSTOMER ID

搜索完成后,突出显示要包含在列表中的结果,右键单击突出显示的区域,选择复制为路径。将新生成的列表粘贴到您选择的应用程序中。是的,真的很容易。