【问题标题】:Check path folder by vb通过vb检查路径文件夹
【发布时间】:2019-05-03 09:06:06
【问题描述】:

我正在尝试获取文件夹路径,然后在此文件夹中循环查找 Excel 工作表

Imports Excel= Microsoft.Office.Interop.Excel

Public Sub Combine()

    Dim objApp As Excel.Application
    Dim objBook As Excel.Workbook
    Dim objSheet As Excel.Worksheet
    Dim myrange As Excel.Range
    Dim folderPath As String
    Dim fileName As String

    folderPath = @"FolderPath"
    fileName = Dir(folderPath & "*.xls")

    Do While (fileName <> "")

        objBook = objApp.Workbooks.Open(Filename:=Txt_GetPath.Text & fileName = True)
        objBook.Activate()

        For Each objSheet In objBook.Sheets
            objSheet.Copy(After:=objBook.Sheets(1))
        Next objSheet

        objBook.Close()

    Loop

End Sub

但是在objBook =objApp.Workbooks.open(...) 行我得到一个错误

路径必须是完整的

代码有什么问题?

【问题讨论】:

  • 运行此代码时。代码停在while循环和bug
  • 路径必须是完整的
  • 在 objBook =objApp.Workbooks.open(...) 行出现这个错误
  • Dir 函数只会为您提供目录中的第一个 Excel 文件。这是你想要的,还是你想要处理目录中的所有 Excel 文件?
  • 我要处理目录下所有的excel文件

标签: excel vb.net


【解决方案1】:

要处理目录中的所有文件,可以使用Directory.EnumerateFiles 函数。

当代码使用完 Excel 应用程序后,处理它并不完全简单,所以我从The proper way to dispose Excel com object using VB.NET? 为您添加了一些。

我不知道您在打开工作簿的命令中使用 = True 的目的是什么,所以我把它省略了。

Option Strict On

Imports System.IO
Imports Excel = Microsoft.Office.Interop.Excel

Public Sub DoCombine()

    Dim objApp As New Excel.Application
    Dim objBook As Excel.Workbook
    Dim objSheet As Excel.Worksheet

    Dim folderPath As String = Txt_GetPath.Text

    For Each excelFile In Directory.EnumerateFiles(folderPath, "*.xls")

        objBook = objApp.Workbooks.Open(Filename:=excelFile)
        objBook.Activate()

        For Each objSheet In objBook.Sheets
            objSheet.Copy(After:=objBook.Sheets(1))
        Next objSheet

        objBook.Close()

    Next

    objApp.Quit()

End Sub

Public Sub Combine()

    ' Call the method to do the actual work
    DoCombine()

    ' Now Let the GC clean up (twice, to clean up cycles too)
    GC.Collect()
    GC.WaitForPendingFinalizers()
    GC.Collect()
    GC.WaitForPendingFinalizers()

End Sub

使用Combine() 方法 - 它将调用您在DoCombine() 方法中使用的代码,并确保计算机上没有剩余运行的大量 Excel 副本 - 即使您会在任务管理器中看到它们他们不在屏幕上。

使用Option Strict On (几乎)总是一个好主意,因为它可以让 Visual Studio 向您展示代码中的某些错误。

【讨论】:

  • For Each excelFile In Directory.EnumerateFiles(folderPath, "*.xls") objBook = objApp.Workbooks.Open(Filename:=Txt_GetPath.Text) ' 此行中的错误 objBook.Activate()
  • @EkramMohamed Txt_GetPath.Text 是什么?变量 excelSheet 具有 Excel 文档的完整路径。
  • 文件夹路径 = Txt_GetPath.Text
  • 这是合并excel表格的完整程序docs.google.com/document/d/…
  • @EkramMohamed 1) 删除fileName = Dir(folderPath &amp; "*.xls") 行。 2) 将objBook = objApp.Workbooks.Open(Filename:=”FolderPath”) 更改为objBook = objApp.Workbooks.Open(Filename:=excelFile)
【解决方案2】:
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim strFileName As String
    Dim xl As New Excel.Application
    Dim wb As Excel.Workbook
    Dim ws As Excel.Worksheet
    If FolderBrowserDialog1.ShowDialog = System.Windows.Forms.DialogResult.OK Then
        Dim Directory = FolderBrowserDialog1.SelectedPath
        Dim Files() As System.IO.FileInfo
        Dim DirInfo As New System.IO.DirectoryInfo(Directory)
        Files = DirInfo.GetFiles("*", IO.SearchOption.AllDirectories)
        For Each File In Files
            wb = xl.Workbooks.Open(File.FullName)
            For Each ws In wb.Sheets
                strFileName = Microsoft.VisualBasic.Left(File.Name, 
        (InStrRev(File.Name, ".", -1, vbTextCompare) - 1))
                If ws.Name = "SCHEDULE" Then
                    ws.Range("S7", "S50").Value2 = strFileName
                End If
            Next
            wb.Close()
        Next
        xl.Quit()
    End If
    End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-28
    • 1970-01-01
    • 1970-01-01
    • 2017-02-11
    • 2016-09-30
    相关资源
    最近更新 更多