从文件夹中的文件列表中提取数据到母版,而不仅仅是复制和粘贴

扎克

好的,所以我现在已经在这段代码上工作了几天,并且工作得很好,但是我一直在尝试添加一些行来提取不如复制和粘贴那么容易的数据,并且此后一直困扰不已。我正在寻找一些帮助完成/修复代码的帮助,也欢迎其他使代码更有效的方法。我之所以这样说是因为我在这里和那里做一些编码,但是我要注意一个编码器。大多数情况是使用Google搜索其他人,然后将它们拼凑在一起,然后进行调试,直到我将其投入使用为止,因此,如果出现问题,或者其中有些东西没有理由,我不知道。因此,请再次随意清理工作。

我创建了一个模块,用于从文件夹中的每个文件中提取多个数据,并将其带入新文档的表中。我已经能够提取简单的复制和粘贴内容,但是为了使事情更加自动化,我尝试添加一些行以提取文档的其他部分以放入表格中。源文件是数据收集运行,并且格式相同。更容易复制和粘贴的部分只是数字数据值(F6:H6和F7:H7)。非数字值是所有其他行。这些其他项目可以复制和粘贴,但问题是我只想要其中的一部分。因此,我从源文件的A1中提取的数据示例是运行标题,其格式为:“运行##-'运行描述'”,但我只需要运行编号。因此,如果我复制并粘贴,它会像“ 另一个要注意的是,我从所有包含公式的单元格中提取数据的值。这就是为什么我在方便复制和粘贴行中使用pastespecial的原因,但是我不确定这是否会成为其他行的解决方案中的一个因素。

到目前为止,我的代码:

Sub Summary()

    Dim xFd As FileDialog
    Dim xSPath As String
    Dim xXLSXFile As String       'file to process
    Dim wsTarget As Worksheet
    Dim wbSource As Workbook
    Dim wsSource As Worksheet
    Dim rowTarget As Long         'output row
        
    Application.ScreenUpdating = False  
    Application.DisplayAlerts = False 
    
    rowTarget = 8
    
    'reset application settings in event of error
    On Error GoTo errHandler
    Application.ScreenUpdating = False
    
    'xWsheet = ActiveWorkbook.Name
    Set xFd = Application.FileDialog(msoFileDialogFolderPicker)
    xFd.Title = "Select a folder:"
    If xFd.Show = -1 Then
        xSPath = xFd.SelectedItems(1)
    Else
        Exit Sub
    End If
    If Right(xSPath, 1) <> "\" Then xSPath = xSPath + "\"
    
    'set up the target worksheet
    Set wsTarget = Sheets(1)
    
    'loop through the Excel files in the folder
    xXLSXFile = Dir(xSPath & "*.xlsx")
    Do While xXLSXFile <> ""
        If xXLSXFile <> ThisWorkbook.Name Then
            Set wbSource = Workbooks.Open(xSPath & xXLSXFile)
            Set wsSource = wbSource.Worksheets(1)
        
            ''With wsTarget
                ''.Range("A" & rowTarget).Value = wsSource.Range("Runnum").Value
            ''End With
                    
            With wsSource
                ''.Range("Runnum").Value = wsTarget.Range("A" & rowTarget).Value
                ''.Names("Runnum").RefersToRange.Value
                ''wsTarget.Range("B" & rowTarget).Value
                ''.Range("A1").Value = Mid(str, 5, InStr(str, " ") - 5).Copy
                ''wsTarget.Range("A" & rowTarget).PasteSpecial xlPasteValues 
                ''.Range("Runnum").Copy
                ''wsTarget.Range("A" & rowTarget).PasteSpecial xlPasteValues
                .Range("A1").Copy
                wsTarget.Range("A" & rowTarget).PasteSpecial xlPasteValues  'Run# 'remove first 4 characters and all characters after number/from the "-" -1
                .Range("B4").Copy
                wsTarget.Range("B" & rowTarget).PasteSpecial xlPasteValues
                .Range("F6:H6").Copy
                wsTarget.Range("C" & rowTarget).PasteSpecial xlPasteValues
                .Range("F7:H7").Copy
                wsTarget.Range("F" & rowTarget).PasteSpecial xlPasteValues
                .Range("D1").Copy
                wsTarget.Range("I" & rowTarget).PasteSpecial xlPasteValues  'remove first 7 characters
                .Range("B9").Copy
                wsTarget.Range("J" & rowTarget).PasteSpecial xlPasteValues
                .Range("B13").Copy
                wsTarget.Range("K" & rowTarget).PasteSpecial xlPasteValues  'remove every thing after the fist space -1
            End With
        End If
        
        'close the source workbook, increment the output row and get the next file
        wbSource.Close SaveChanges:=False
        rowTarget = rowTarget + 1
        xXLSXFile = Dir()
    Loop
    
errHandler:
    On Error Resume Next
    Application.ScreenUpdating = True
    
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
       
    Set wsSource = Nothing
    Set wbSource = Nothing
    Set wsTarget = Nothing
End Sub

我已将循环中的几行代码转换为带有''的注释,以显示我尝试过的一些内容。确实,我保留了它们以帮助调试,但我还是把它们留了下来。

编辑:非常感谢大家的帮助!我对在此站点上获得的支持始终感到非常满意。还要感谢您对我和我的编码技巧的精打细算,或者缺乏这些技巧:-)

蒂姆·威廉姆斯

以下是有关更改和所需提取的一些建议:

Option Explicit

Sub Summary()

    Dim xFd As FileDialog
    Dim xSPath As String
    Dim xXLSXFile As String       'file to process
    Dim wbTarget as workbook, wsTarget As Worksheet, rwTarget As Range, v
    Dim wbSource As Workbook
    Dim wsSource As Worksheet
    Dim rowTarget As Long         'output row
        
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    
    'reset application settings in event of error
    On Error GoTo errHandler
    Application.ScreenUpdating = False
    
    xSPath = GetAFolder("Select a folder:") 'extract code to re-usable function
    If Len(xSPath) = 0 Then Exit Sub
    
    Set wbTarget = ActiveWorkbook  '## Target workbook
    Set wsTarget = wbTarget.Worksheets(1) 'set up the target worksheet
    Set rwTarget = wsTarget.Rows(8)
    
    xXLSXFile = Dir(xSPath & "*.xlsx") 'loop through the Excel files in the folder
    Do While xXLSXFile <> ""
    
        If xXLSXFile <> wbTarget.Name Then
            Set wbSource = Workbooks.Open(xSPath & xXLSXFile)
            With wbSource.Worksheets(1)
                rwTarget.Columns("A").Value = RunNumber(.Range("A1").Value) 'call function
                rwTarget.Columns("B").Value = .Range("B4").Value
                rwTarget.Columns("C").Resize(1, 3).Value = .Range("F6:H6").Value
                rwTarget.Columns("F").Resize(1, 3).Value = .Range("F7:H7").Value
                v = .Range("D1").Value
                rwTarget.Columns("I").Value = Right(v, Len(v) - 7) 'remove first 7 chars from D1
                rwTarget.Columns("J").Value = .Range("B9").Value
                rwTarget.Columns("K").Value = Split(.Range("B13").Value, " ")(0) 'up to first space
            End With
        End If
        
        'close the source workbook, increment the output row and get the next file
        wbSource.Close SaveChanges:=False
        Set rwTarget = rwTarget.Offset(1, 0)
        xXLSXFile = Dir()
    Loop
    
errHandler:
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
    'typically there's no need to set objects to Nothing when you're done...
End Sub

'extract the run number
Function RunNumber(ByVal v)
    v = UCase(Trim(Split(v, "-")(0))) 'the part before the dash
    RunNumber = Trim(Replace(v, "RUN", ""))
End Function

'push this out into a re-usable function
Function GetAFolder(dlgTitle As String) As String
    Dim rv As String
    With Application.FileDialog(msoFileDialogFolderPicker)
        .Title = dlgTitle
        If .Show = -1 Then
            rv = .SelectedItems(1)
            If Right(rv, 1) <> "\" Then rv = rv & "\"
        End If
    End With
    GetAFolder = rv
End Function

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如果您单击文件夹图标而不仅仅是三角形图标,如何使jstree关闭/打开

来自分类Dev

等待下载的文件完成,而不仅仅是File.exists()

来自分类Dev

为什么我要快速创建单例,而不仅仅是将函数转储到文件中?

来自分类Dev

Perl:编辑文件,而不仅仅是输出到shell

来自分类Dev

如何从列表中删除多个项目,而不仅仅是访问它们

来自分类Dev

Alfresco分享Aikau PathTree来显示文档而不仅仅是文件夹

来自分类Dev

发布请求采用完整的文件路径,而不仅仅是文件名

来自分类Dev

不仅仅是变量中的Like语句

来自分类Dev

Ubuntu One Sync适用于Windows中的多个文件夹,而不仅仅是Ubuntu One文件夹

来自分类Dev

R闪亮的限制文件输入到文件名模式而不仅仅是文件类型

来自分类Dev

将所有命令的输出重定向到文件,而不仅仅是最后一个

来自分类Dev

Ubuntu One Sync适用于Windows中的多个文件夹,而不仅仅是Ubuntu One文件夹

来自分类Dev

如何将文件上传到数据库,而不仅仅是使用php的服务器

来自分类Dev

如何使用Checkstyle Gradle插件测试不仅仅是Java文件的内容

来自分类Dev

为什么还要使用SetX将其他文件夹路径也添加到系统PATH中,而不仅仅是指定的文件夹路径?

来自分类Dev

以编程方式获取TFS变更集的所有文件(而不仅仅是增量)

来自分类Dev

cp -u复制所有文件,而不仅仅是新文件

来自分类Dev

.NET持续集成-不仅仅是文件系统监视程序?

来自分类Dev

Grunt,CSSComb和手表针对所有文件运行,而不仅仅是新文件

来自分类Dev

Python中的列表列表(不仅仅是列表)

来自分类Dev

文件提取器可带来所有文件,而不仅仅是zip文件

来自分类Dev

命令中间列表中每个元素的xargs,而不仅仅是-L这样的结尾

来自分类Dev

在页面加载时显示DIV,而不仅仅是下拉列表的“更改中”

来自分类Dev

覆盖范围和鼻子显示了来自Django的文件,而不仅仅是我的测试

来自分类Dev

egrep 输出所有内容,而不仅仅是与列表中的模式匹配的行

来自分类Dev

使 innosetup 复制完整文件夹,而不仅仅是其内容

来自分类Dev

purrr 映射到列表中的每个项目而不仅仅是列表

来自分类Dev

Django 文件上传(获取文件数据,而不仅仅是文件路径)

来自分类Dev

使用 base.html 文件但修改的不仅仅是正文

Related 相关文章

  1. 1

    如果您单击文件夹图标而不仅仅是三角形图标,如何使jstree关闭/打开

  2. 2

    等待下载的文件完成,而不仅仅是File.exists()

  3. 3

    为什么我要快速创建单例,而不仅仅是将函数转储到文件中?

  4. 4

    Perl:编辑文件,而不仅仅是输出到shell

  5. 5

    如何从列表中删除多个项目,而不仅仅是访问它们

  6. 6

    Alfresco分享Aikau PathTree来显示文档而不仅仅是文件夹

  7. 7

    发布请求采用完整的文件路径,而不仅仅是文件名

  8. 8

    不仅仅是变量中的Like语句

  9. 9

    Ubuntu One Sync适用于Windows中的多个文件夹,而不仅仅是Ubuntu One文件夹

  10. 10

    R闪亮的限制文件输入到文件名模式而不仅仅是文件类型

  11. 11

    将所有命令的输出重定向到文件,而不仅仅是最后一个

  12. 12

    Ubuntu One Sync适用于Windows中的多个文件夹,而不仅仅是Ubuntu One文件夹

  13. 13

    如何将文件上传到数据库,而不仅仅是使用php的服务器

  14. 14

    如何使用Checkstyle Gradle插件测试不仅仅是Java文件的内容

  15. 15

    为什么还要使用SetX将其他文件夹路径也添加到系统PATH中,而不仅仅是指定的文件夹路径?

  16. 16

    以编程方式获取TFS变更集的所有文件(而不仅仅是增量)

  17. 17

    cp -u复制所有文件,而不仅仅是新文件

  18. 18

    .NET持续集成-不仅仅是文件系统监视程序?

  19. 19

    Grunt,CSSComb和手表针对所有文件运行,而不仅仅是新文件

  20. 20

    Python中的列表列表(不仅仅是列表)

  21. 21

    文件提取器可带来所有文件,而不仅仅是zip文件

  22. 22

    命令中间列表中每个元素的xargs,而不仅仅是-L这样的结尾

  23. 23

    在页面加载时显示DIV,而不仅仅是下拉列表的“更改中”

  24. 24

    覆盖范围和鼻子显示了来自Django的文件,而不仅仅是我的测试

  25. 25

    egrep 输出所有内容,而不仅仅是与列表中的模式匹配的行

  26. 26

    使 innosetup 复制完整文件夹,而不仅仅是其内容

  27. 27

    purrr 映射到列表中的每个项目而不仅仅是列表

  28. 28

    Django 文件上传(获取文件数据,而不仅仅是文件路径)

  29. 29

    使用 base.html 文件但修改的不仅仅是正文

热门标签

归档