搜索列标题,复制列并粘贴到主工作簿 [英] Search for column header, copy column and paste to master workbook

查看:135
本文介绍了搜索列标题,复制列并粘贴到主工作簿的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何复制列(数据)与这些列标题名称工具 CUTTER和HOLDER,并将它们粘贴到另一个VBA代码(工作表模块)的工作簿中(作为每一列中具有相同列标题名称的附件)。谢谢。
列标题HOLDER发生在F10(最好写为(10,6)),工具切割器在G10(10,11)中,但是最好让它搜索标题名称并打印所有该列直到它完全为空(可能会出现空格)
任何帮助非常感谢!!

How can I copy the columns (data only) with these column header names "TOOL CUTTER" and "HOLDER" and paste them (as an append in just one column each with the same column header name) into another workbook sheet where the VBA code (Sheet Module) is. Thanks. The column header HOLDER occurs in F10 (preferably written as (10, 6), and TOOL CUTTER is in G10 (10, 11) but it would be preferred to have it search for the header name and print whatever is in that column until it is completely empty (blank spaces may occur). Any help is greatly appreciated!!

工作代码:在一个循环中打开文件夹中的文件 - 打开文件,将文件名称打印到主文件表中,将项目J1从文件打印到主文件表,关闭文件,打开文件夹中的下一个文件,直到所有文件都已循环。

Working code: opens files in folder in a loop – opens file, prints name of file to Masterfile sheet, prints item J1 from file to Masterfile sheet, closes file, opens next file in the folder until all have been looped through.

Option Explicit

Sub LoopThroughDirectory()

    Dim objFSO As Object
    Dim objFolder As Object
    Dim objFile As Object
    Dim MyFolder As String
    Dim Sht As Worksheet, ws As Worksheet
    Dim WB As Workbook
    Dim i As Integer
    Dim LastRow As Integer, erow As Integer
    Dim Height As Integer

    Application.ScreenUpdating = False

    MyFolder = "C:\Users\trembos\Documents\TDS\progress\"

    Set Sht = Workbooks("masterfile.xlsm").Sheets("Sheet1")

    'create an instance of the FileSystemObject
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    'get the folder object
    Set objFolder = objFSO.GetFolder(MyFolder)
    i = 1
    'loop through directory file and print names
    For Each objFile In objFolder.Files
        If LCase(Right(objFile.Name, 3)) = "xls" Or LCase(Left(Right(objFile.Name, 4), 3)) = "xls" Then
            'print file name

            Workbooks.Open Filename:=MyFolder & objFile.Name
            Set WB = ActiveWorkbook

            With WB
                For Each ws In .Worksheets
                    Sht.Cells(i + 1, 1) = objFile.Name
                    With ws
                        .Range("J1").Copy Sht.Cells(i + 1, 4)
                    End With
                    i = i + 1
                Next ws
                .Close SaveChanges:=False
            End With
        End If
    Next objFile
    Application.ScreenUpdating = True
End Sub

代码我正在努力尝试在HOLDER和TOOL CUTTER列中打印值(返回错误Tool变量未定义在对于每个工具在TOOLList 的块中开始的评论'粘贴工具列表找回到这张表:

Code I’m working on to try to print the values in the HOLDER and TOOL CUTTER columns (returns error Tool variable is not defined in line For Each Tool In TOOLList in the block that starts with the comment 'paste the TOOL list found back to this sheet :

Option Explicit

Sub LoopThroughDirectory()

    Dim objFSO As Object
    Dim objFolder As Object
    Dim objFile As Object
    Dim MyFolder As String
    Dim StartSht As Worksheet, ws As Worksheet
    Dim WB As Workbook
    Dim i As Integer
    Dim LastRow As Integer, erow As Integer
    Dim Height As Integer

    'Application.ScreenUpdating = False

    MyFolder = "C:\Users\trembos\Documents\TDS\progress\"

    Set StartSht = ActiveSheet

    'create an instance of the FileSystemObject
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    'get the folder object
    Set objFolder = objFSO.GetFolder(MyFolder)
    i = 2

    'loop through directory file and print names
    For Each objFile In objFolder.Files
        If LCase(Right(objFile.Name, 3)) = "xls" Or LCase(Left(Right(objFile.Name, 4), 3)) = "xls" Then
            'print file name
            StartSht.Cells(i, 1) = objFile.Name
            Dim NewWb As Workbook
            Set NewWb = Workbooks.Open(Filename:=MyFolder & objFile.Name)

            'print TDS values
            With WB
                For Each ws In .Worksheets
                    StartSht.Cells(i + 1, 1) = objFile.Name
                    With ws
                        .Range("J1").Copy StartSht.Cells(i + 1, 4)
                    End With
                    i = i + 1
                Next ws
                .Close SaveChanges:=False
            End With
        End If

        'print CUTTING TOOL and HOLDER lists
        Dim k As Long
        Dim width As Long
        Dim TOOLList As Object
        Dim count As Long
        Set TOOLList = CreateObject("Scripting.Dictionary")
        Dim ToolRow As Integer 'set as As Long if more than 32767 rows

        ' search for all on other sheets
        ' Assuming header means Row 1
        If objFile.Name <> "masterfile.xls" Then 'skip any processing on "Masterfile.xls"
            For Each ws In NewWb.Worksheets   'assuming we want to look through the new workbook
                With ws
                    width = .Cells(10, .Columns.count).End(xlToLeft).Column
                    For k = 1 To width
                        If Trim(.Cells(10, k).Value) = "CUTTING TOOL" Then
                            Height = .Cells(.Rows.count, k).End(xlUp).Row
                            If Height > 1 Then
                                For ToolRow = 2 To Height
                                    If Not TOOLList.exists(.Cells(ToolRow, k).Value) Then
                                        TOOLList.Add .Cells(ToolRow, k).Value, ""
                                    End If
                                Next ToolRow
                            End If
                        End If
                    Next
                End With
            Next
        End If

        ' paste the TOOL list found back to this sheet
        With StartSht
            width = .Cells(10, .Columns.count).End(xlToLeft).Column
            For k = 1 To width
                If Trim(.Cells(10, k).Value) = "CUTTING TOOL" Then
                    Height = .Cells(.Rows.count, k).End(xlUp).Row
                    count = 0
                    For Each Tool In TOOLList
                        count = count + 1
                        .Cells(Height + count, k).Value = Tool
                    Next
                End If
            Next
        End With
        'close current file, do not save changes
        NewWb.Close SaveChanges:=False
        i = i + 1
    'move to next file
    Next objFile

    'Application.ScreenUpdating = True

End Sub


推荐答案

p>将一些不同的任务重新构建到单独的函数中,可以使您的代码更清洁,更容易遵循。

Refactoring some distinct tasks into separate functions keeps your code cleaner and easier to follow.

已编译但未经测试:

Option Explicit

Sub LoopThroughDirectory()

    Const SRC_FOLDER As String = "C:\Users\trembos\Documents\TDS\progress\"
    Const ROW_HEADER As Long = 10

    Dim f As String
    Dim StartSht As Worksheet, ws As Worksheet
    Dim WB As Workbook
    Dim i As Integer
    Dim dict As Object
    Dim hc As Range, hc2 As Range, d As Range

    Set StartSht = ActiveSheet

    i = 3
    f = Dir(SRC_FOLDER & "*.xls*", vbNormal) 'get first file name

    'find the header on the master sheet
    Set hc2 = HeaderCell(StartSht.Cells(ROW_HEADER, 1), "CUTTING TOOL")
    If hc2 Is Nothing Then
        MsgBox "No header found on master sheet!"
        Exit Sub
    End If

    'loop through directory file and print names
    Do While Len(f) > 0

        If f <> ThisWorkbook.Name Then

            Set WB = Workbooks.Open(SRC_FOLDER & f)

            For Each ws In WB.Worksheets
                StartSht.Cells(i, 1) = f
                ws.Range("J1").Copy StartSht.Cells(i, 4)
                i = i + 1
                'find the header on the source sheet
                Set hc = HeaderCell(ws.Cells(ROW_HEADER, 1), "CUTTING TOOL")
                If Not hc Is Nothing Then

                    Set dict = GetUniques(hc.Offset(1, 0))
                    If dict.count > 0 Then
                        Set d = StartSht.Cells(Rows.count, hc2.Column).End(xlUp).Offset(1, 0)
                        'add the values to the master list
                        d.Resize(dict.count, 1).Value = Application.Transpose(dict.keys)
                    End If
                Else
                    'header not found on source worksheet
                End If
            Next ws
            WB.Close savechanges:=False

        End If 'not the master file
        f = Dir() 'next file
    Loop
End Sub

'get all unique column values starting at cell c 
Function GetUniques(ch As Range) As Object
    Dim dict As Object, rng As Range, c As Range, v
    Set dict = CreateObject("scripting.dictionary")
    For Each c In ch.Parent.Range(ch, ch.Parent.Cells(Rows.count, ch.Column).End(xlUp)).Cells
        v = Trim(c.Value)
        If Len(v) > 0 And Not dict.exists(v) Then
            dict.Add v, ""
        End If
    Next c
    Set GetUniques = dict
End Function

'find a header on a row: returns Nothing if not found
Function HeaderCell(rng As Range, sHeader As String) As Range
    Dim rv As Range, c As Range
    For Each c In rng.Parent.Range(rng, rng.Parent.Cells(rng.Row, Columns.count).End(xlToLeft)).Cells
        If Trim(c.Value) = sHeader Then
            Set rv = c
            Exit For
        End If
    Next c
    Set HeaderCell = rv
End Function

这篇关于搜索列标题,复制列并粘贴到主工作簿的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆