天道酬勤,学无止境

vba 搜索文件夹并按名称选择文件(vba search through a folder and select files by name)

问题

我在一个文件夹中有很多文件,它们的名称如下:

“prof102122013@10.18.41.csv”

其中“02122013”​​位是日期 - 02/12/2013。 其中一些是在同一天制作的。 我想创建一个文件,将同一天制作的所有工作簿都放在一个大文件中。 到目前为止,我正在努力获得打开特定日期文件的选择性。 有谁知道什么样的代码可以帮助我解决这个问题?

编辑:解决了,谢谢大家的帮助! 这是对我有用的代码:

 folder_location = Application.ActiveWorkbook.Path

i2 = 0

strFile = Dir(folder_location & "\")

'looping through to find the right file names and putting them all in an array
While strFile <> ""
    If Right(strFile, 3) = "csv" Then
                file_to_analyse = Split(strFile, "@")
                If Right(file_to_analyse(0), 8) = date_we_want_to_analyse_on Then
                    found_files_to_analyse(i2) = strFile
                    i2 = i2 + 1
                End If
            End If
    strFile = Dir
Wend
回答1

您是要根据文件保存日期还是根据文件名合并文件。 以昨天的日期命名的文件可以在今天保存并带有今天的日期。 我猜您必须解析文件名并在 do while 循环中围绕日期(在文件名中)应用逻辑,直到搜索目录中的所有文件以查找条件。 如果满足条件,则将打开的文件复制到文件中的工作表中。 如果不满足条件,则跳过该文件。 以下可能会有所帮助

For each date which needs to be consolidated, do the following in a loop or an in a user prompted message box where the user inputs the date. You also need to chose whether you want the consolidation to happen in the workbook from where you are launching the macro or a separately opened workbook. The code below assumes you are consolidating in the same workbook.

Path = Path of the directory in which the files are stored

Flname = Dir(Path & "*.csv")

Do While Flname <> "" 

If ' file check Condition' Then
    Filecheckname = True  ' Checks if file follows the naming conventions desired
Else
    Filecheckname = False
End If

If Filecheckname Then
    FlDate = getDate(Flname)     ' extracts the date from the file name
Else
    GoTo Errorhandler ' If there is an error, then the macro stops with a message to the user
End If

If FlDate<> Date Then

    flsskpd = flsskpd + 1       ' If the date criteria is not met, the file is skipped with an increment to the fileskipped counter
    Flname = Dir()
Else

     Workbooks.Open Filename:=Path & Flname, ReadOnly:=True

'Code to Copy into consolidated workbook (ThisWorkbook)
filesmoved = filesmoved + 1
     Flname = Dir()
End if

Loop

Message to user about how many files skipped and consolidated. 

Prompt user whether to continue to the next date consolidation, if yes, continue or take the new date as an input and repeat the loop
回答2

如果您希望 VBA 在目录中“搜索”文件/文件夹,我认为您需要使用以下内容:

Option Explicit
Option Compare Text
Public Enum xlSearchMode
    xlFilesOnly = 0
    xlFoldersOnly = 1
    xlFilesAndFolders = 2
End Enum
Function SearchInDirectory(FName As String, Optional FoName As String, Optional SearchMode As xlSearchMode = xlFilesOnly, Optional ExactMatch As Boolean = True) As Variant
    'By Abdallah Khaled Ali El-Yaddak
    'Returns an array of strings with files/folders matching what you are searching for.
    'If nothing is found, it returns an array of one empty string element.
    '-------------'
    'FName (String): The file/folder to look for
    '[FoName] (String): The directory to search in, if omitted, CurDir will be used.
    '[SreachMode] (xlSearchMode): xlFilesOnly (default) = Look for files only | xlFoldersOnly = Look for folders only | xlFilesAndFolders = Look for both
    '[Exactmatch] (Boolean): True (default) = Look only for this string (case insenstive) | False = Sreach for any files/folders that includes this string in their name
    Dim FSO As Object, File As Object, Folder As Object, Fnames() As String, i As Long, SubNames As Variant, SubFolder As Object
    If FoName = "" Then FoName = CurDir
    If Right(FoName, 1) <> "\" Then FoName = FoName & "\"
    ReDim Fnames(1 To 1) As String
    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set Folder = FSO.GetFolder(FoName)
    If SearchMode = xlFilesOnly Or SearchMode = xlFilesAndFolders Then
        For Each File In FSO.GetFolder(Folder).Files
            If (ExactMatch And SubFolder.Name = FName) Or _
                    (Not ExactMatch And SubFolder.Name Like "*" & FName & "*") Then
                Fnames(UBound(Fnames)) = File.Path
                ReDim Preserve Fnames(1 To UBound(Fnames) + 1)
            End If
        Next
    End If
    If SearchMode = xlFoldersOnly Or SearchMode = xlFilesAndFolders Then
        For Each SubFolder In FSO.GetFolder(Folder).subFolders
            If (ExactMatch And SubFolder.Name = FName) Or _
                    (Not ExactMatch And SubFolder.Name Like "*" & FName & "*") Then
                Fnames(UBound(Fnames)) = SubFolder.Path
                ReDim Preserve Fnames(1 To UBound(Fnames) + 1)
            End If
        Next
    End If
    For Each SubFolder In FSO.GetFolder(Folder).subFolders
        SubNames = SearchInDirectory(FName, SubFolder.Path, SearchMode, ExactMatch)
        If SubNames(LBound(SubNames)) <> "" Then
            For i = LBound(SubNames) To UBound(SubNames)
                Fnames(UBound(Fnames)) = SubNames(i)
                ReDim Preserve Fnames(1 To UBound(Fnames) + 1)
            Next
        End If
    Next
    If UBound(Fnames) > 1 Then ReDim Preserve Fnames(1 To UBound(Fnames) - 1)
    SearchInDirectory = Fnames
End Function

要进行测试,您需要这样的东西:

Sub Test()
    Dim a As Variant, i As Long
    a = SearchInDirectory(date_we_want_to_analyse_on, folder_location, xlFilesOnly, Flase)
    For i = LBound(a) To UBound(a)
        Debug.Print a(i)
    Next
End Sub

笔记:

  1. 此解决方案不适用于 MAC(仅在 Windows 上测试)
  2. 搜索更大的目录需要更长的时间(里面的文件/文件夹的数量)
标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 使用 VBA 在文件系统中搜索文件路径(Search filesystem for filepath using VBA)
    问题 我正在寻找一种方法来搜索包含特定字符串的子文件夹的特定文件夹。 下面我列出了一个我在头顶输入的函数,看看它是否有效。 嗯,它确实有效,但是当我谈论在网络驱动器上搜索 6,000 个文件夹时,它的速度还不够快。 我确信有更好的方法来做到这一点,但我似乎无法在谷歌上挖掘任何东西。 是否有一个对象可以让我利用 Windows 内置的文件系统搜索和索引功能? 作为替代方案,有人有办法优化我的代码吗? 主要瓶颈是instr的使用。 这是代码: Function findPath(strId As String) As String checkObj Dim strBase As String strBase = opt.photoBasePath Dim fs As Object Set fs = CreateObject("Scripting.FileSystemObject") Dim baseFolder As Object Set baseFolder = fs.getfolder(strBase) Dim folder As Object For Each folder In baseFolder.subfolders If InStr(1, folder.name, strId) > 0 Then findPath = strBase & "\" & folder.name
  • VBA 循环浏览电子邮件附件并根据给定条件保存(VBA to loop through email attachments and save based on given criteria)
    问题 这是对上一个问题的跟进(VBA 从具有多个帐户的电子邮件中保存附件(基于定义的标准)) 场景:我有一个代码,它遍历某个 Outlook 帐户中的所有电子邮件,并将附件保存到选定的文件夹中。 以前,我的问题是选择从哪里提取附件的文件夹(和帐户)(通过上一个问题的建议解决了这个问题)。 问题 1:代码在该行显示“类型不匹配”错误: Set olMailItem = olFolder.Items(i) 问题 2:如问题标题所述,我的主要目标是遍历所有附件并仅保存那些具有给定条件的附件(excel 文件,工作表名称为“ASK”,工作表名称为“BID”)。 不仅仅是一个简单的如果要考虑到这些标准,我必须将所有文件下载到“临时文件夹”,进行选择并将最终生成的文件放在输出文件夹中,或者将所有文件下载到最终文件夹并删除不符合标准。 问题:我似乎无法找到执行其中任何一个操作的方法。 问题:如何做到这一点? 这两者中的哪一个更有效? 代码: Sub email() Application.ScreenUpdating = False Dim olApp As New Outlook.Application Dim olNameSpace As Object Dim olMailItem As Outlook.MailItem Dim olFolder As Object Dim
  • Excel VBA - 将多个文件中的特定列合并到一张工作表(Excel VBA - Merge specific columns from multiple files to one sheet)
    问题 我有数百个要合并到一个文件中的 Excel 文件。 问题是这些文件包含数百列我不需要的额外数据。 更复杂的是,工作簿之间的列位置不同,工作簿的列数也不同。 我想创建一个宏,它将遍历并打开每个文件,搜索我需要的列,然后复制这些数据列并将它们合并到一个主文件中。 以下代码的工作方式如下: 将所有要合并的文件放在一个文件夹中 键入要搜索的标题并在新工作簿上的这些文件中进行合并。 如果您的文件中有 4 列名为:名称日期产品和时间 然后在新工作表中的 A1 和 B1 中键入日期和时间将搜索所有文件,并将找到的任何具有匹配标题的列合并到一个编辑表中。 感谢 Ron DeBruin 为大多数文件系统选择。 'Option Explicit 'takes worksheet and returns last row Private Function LastRowUsed(sh As Worksheet) As Long On Error Resume Next LastRowUsed = sh.Cells.Find(What:="*", _ After:=sh.Range("A1"), _ LookAt:=xlPart, _ LookIn:=xlFormulas, _ SearchOrder:=xlByRows, _ SearchDirection:=xlPrevious, _
  • 使用 Excel VBA 搜索 Outlook 电子邮件(并回复)(Searching Outlook email (and replying to it) using Excel VBA)
    问题 我想在我的所有 Outlook 中搜索对话中的最新消息(我使用主题名称作为搜索键)。 这条最新消息可以在收件箱、已发邮件、收件箱的子文件夹、收件箱的子文件夹(任何地方)。 我可以通过一些非常繁琐的代码来实现这一点,遍历每个主要文件夹的每个级别,但不仅这种方法非常混乱,我无法确定这个找到的消息是否是本次对话中的最新消息。 我有以下代码,其中 --> 在收件箱中搜索“searchKey” --> 如果在收件箱文件夹中找到,则回复 --> 如果不是,它移动到收件箱的子文件夹中,并继续相同的过程 Dim olApp As Outlook.Application Dim olNs As Namespace Dim Fldr As MAPIFolder Dim olFldr As MAPIFolder Dim olMail ' As Outlook.MailItem Dim i As Integer Set olApp = New Outlook.Application Set olNs = olApp.GetNamespace("MAPI") Set Fldr = olNs.GetDefaultFolder(olFolderInbox) Set olFldr = Fldr tryAgain: For Each olMail In olFldr.Items If InStr(olMail
  • 如何搜索VBA代码文件(How to search through VBA code files)
    问题 我刚开始在一家新公司工作,以前的开发人员在该公司创建了许多自动化任务。 当然,实际上没有任何文档,并且我没有机会与以前的开发人员合作,所以现在我试图筛选所有这些过程,以寻找可修改某些特定文件的过程。 我已经用SQL编写了所有存储的proc脚本,并使用了搜索工具,但是没有找到我想要的东西,所以现在我想知道我所需的进程是否位于使用的许多Access数据库之一中。 使用SQL Server,编写C#应用程序以编写proc脚本很容易,因此我可以对其进行搜索,但是使用Access似乎仅限于单独打开每个数据库以搜索代码文件。 有什么方法可以以编程方式搜索VBA代码文件吗? 回答1 如果您希望在Access数据库文件中搜索代码模块,则可以使用VBE对象模型。 本示例在当前数据库的ActiveVBProject的所有模块中搜索单词。 如果数据库包含多个VBProject,则可以枚举VBProjects集合并一次按名称搜索一个项目: For Each objComponent In Application.VBE.VBProjects(ProjName).VBComponents 或者,如果您更喜欢通过编号而不是名称来引用项目,请注意编号以 1 而不是 0 开头。 Public Sub findWordInModules(ByVal pSearchWord As String) 'Dim
  • 在多个子文件夹中搜索文件的VBA宏(VBA macro that search for file in multiple subfolders)
    问题 我有宏,如果我在文件E1的单元格名称中输入了宏搜索槽C:\ Users \ Marek \ Desktop \ Makro \目录,请找到它并将所需的值放在带有宏的原始文件的特定单元格中。 是否可以在没有特定文件夹位置的情况下进行此工作? 我需要可以搜索带有许多子文件夹的C:\ Users \ Marek \ Desktop \ Makro \槽。 我的代码: Sub Zila1() Dim SaveDriveDir As String, MyPath As String Dim FName As Variant Dim YrMth As String SaveDriveDir = CurDir MyPath = Application.DefaultFilePath 'or use "C:\Data" ChDrive MyPath ChDir MyPath FName = Sheets("Sheet1").Range("E1").Text If FName = False Then 'do nothing Else GetData "C:\Users\Marek\Desktop\Makro\" & FName & ".xls", "Vystupna_kontrola", _ "A16:A17", Sheets("Sheet1").Range("B2:B3"), True
  • VBA在许多文件夹中搜索特定子文件夹并移动其中的所有文件(VBA search for a specific subfolder in many folders and move all the files in it)
    问题 你能帮助我吗? 我想要一个宏 vba,它在所有存在的文件夹和子文件夹之间搜索特定的子文件夹,例如(Xfolder)并移动它们的文件。 P:\Desktop\Folder1\subfolder\SUBFOLDER1\Xfolder 我正在使用 VBA 脚本运行时对象 Set oSourceFolder = fso.GetFolder(source) If Dir(destinationFolder, 16) = "" Then MkDir (destinationFolder) For Each oFile In oFolder.Files If Dir(destinationFolder,16) = "" Then fso.MoveFile oFile.Path, destinationFolder End If Next oFile fso.DeleteFolder oFolder.Path Next oFolder 回答1 这是一个解决方案: Dim fsoFileSystem As New FileSystemObject Dim foFolder As Folder, foSubFolder As Folder Dim fFile As File Dim strStartFolder As String, strMoveFolder As String
  • 按主题搜索所有文件夹中的最新电子邮件并全部回复(Search by subject for latest email in all folders and reply all)
    问题 下面的代码不执行回复所有属性,因此,我无法编辑电子邮件的正文并保持电子邮件链的对话。 我认为最好的选择是使用 Application.advancesearch,因为它通过搜索所有文件夹为您提供最新的电子邮件。 但我不知道如何通过 Excel 运行它。 客观的: 1) 在收件箱和子文件夹(多个)和已发送邮件文件夹中搜索所选“主题”的最新电子邮件 2) 选择最新的邮件并回复所有 Sub ReplyMail() ' Variables Dim OutlookApp As Object Dim IsOutlookCreated As Boolean Dim sFilter As String, sSubject As String Dim SentTime As Long Dim IndoxTime As Long Dim olEmailIndox As Outlook.MailItem Dim olEmailSent As Outlook.MailItem ' Get/create outlook object On Error Resume Next Set OutlookApp = GetObject(, "Outlook.Application") If Err Then Set OutlookApp = CreateObject("Outlook.Application"
  • 在VBA中搜索文件(File searching in VBA)
    问题 我编写了一个vba代码,该代码可浏览所有路径文件夹并搜索“ strings.xml”文件。 Dim oFS As Office.FileSearch Dim i As Integer Set oFS = Application.FileSearch With oFS .NewSearch .FileType = msoFileTypeAllFiles .Filename = "strings.xml" .LookIn = "D:\Workspace" .SearchSubFolders = True .Execute MsgBox "Finish ! " & .FoundFiles.Count & " item found !" End With 但是,在我的工作区中,有许多此当前代码可找到的“ strings.xml”文件,但是我只想在特定的子文件夹中找到“ strings.xml”。 例如./values/strings.xml文件。 回答1 下面将在根工作文件夹下递归查找Values\Strings.xml匹配项,并将其列出在Scripting.Dictionary对象中。 主文件/文件夹搜索由简单的目录功能执行。 Sub dir_ValuesStringsXML_list() Dim f As Long, ff As String, fp As String, fn
  • Outlook 无法送达退回报告 - 项目搜索问题,VBA(Outlook Undeliverable Bounce Report-Item Search Issues, VBA)
    问题 我的文件夹中有一些无法投递的电子邮件。 我正在尝试浏览文件夹中的每封电子邮件,并通过搜索邮件来提取预期收件人的电子邮件地址。 我有一些适用于常规电子邮件的 VBA 代码,但由于无法送达的不是 Outlook“邮件项目”,它们是 Outlook“报告项目”,我在搜索邮件时遇到问题。 搜索功能返回空了,经过大量研究,似乎“报告项目”实际上没有可以搜索的“正文”。 所有错误报告中的电子邮件在报告中采用以下格式。 (xxxxxx@xxxxxx.com) 这是我正在使用的代码,它适用于普通邮件项目。 Sub Undeliver() On Error Resume Next Set myOlApp = Outlook.Application Set mynamespace = myOlApp.GetNamespace("MAPI") 'Selects the current active folder to use Set myfolder = myOlApp.ActiveExplorer.CurrentFolder 'creates excel spreadsheet where data will go Set xlobj = CreateObject("excel.application") xlobj.Visible = True xlobj.Workbooks.Add
  • Excel VBA - PDF 文件属性(Excel VBA - PDF file properties)
    问题 第一次发帖,但长期支持在此站点上查找 VBA 和 SQL 解决方案。 我有一个 VBA 子程序,用于在用户指定的目录中查找所有 PDF 文件。 该程序通过所有子文件夹进行递归并生成如下电子表格: A 列:完整的文件路径(“C:\Users\Records\NumberOne.pdf”) B 列:包含文件的文件夹路径(“C:\Users\Records\”) C列:文件名本身(“NumberOne.pdf”) 到目前为止,该程序(下面的代码)可以完美运行。 我用它来搜索一个包含超过 50,000 个 PDF 文件的目录,并且每次都能成功生成电子表格(程序在大目录中的总运行时间通常为 5-10 分钟)。 问题是我想添加 D 列来捕获 PDF 文件的创建日期。 我在谷歌上搜索了这个并花费了几个小时,尝试了 FSO.DateCreated 等技术,但没有任何效果。 如果 FSO.DateCreated 是我所需要的,我不确定将它插入到我的子例程中以使其正常工作。 通常我会收到一个错误,指出对象不支持该属性或方法。 有没有人知道我可以在哪里为我的程序插入正确的代码来查找每个 PDF 的创建日期并将其放入我的输出电子表格的 D 列中? Sub GetFiles() '-- RUNS AN UNLIMITED RECURSION SEARCH THROUGH A TARGETED
  • 使用 VBA 循环遍历数组,将 Outlook 电子邮件从一个文件夹移动到另一个文件夹?(Looping through Arrays with VBA, to Move outlook emails from one folder to another?)
    问题 我想将发票电子邮件从主文件夹移动到其他文件夹。 我在第一个模块中从 Outlook 中提取了带有 VBA 的电子邮件主题,它们在第 3 列中。然后我在第 8 列中手动写出我希望电子邮件移动到的文件夹。(文件夹的名称是子文件夹) 第3列是我提取的电子邮件的主题,我使用outlook的restrict方法返回带有特定标题的电子邮件 第 8 列是我希望电子邮件也移动的文件夹。 示例如下代码必须将电子邮件放在主文件夹中,主题为“A”到文件夹“1” Column 3 columnn 8 A 1 B 2 C 2 D 1 E 1 我使用数组的原因是,每次进行提取时,列表都会发生变化,因此它是动态的。 因此,我使用 LBound 和 UBound 来包含整个发票列表。 我已将第一个模块中的所有变量声明为“public”。 只把相关的留在这里给代码 Sub MovingEmails_Invoices() 'Declare your Variables Dim i As Object Dim myitems As Object Dim subfolder As Outlook.Folder 'Set Outlook Inbox Reference Set OP = New Outlook.Application Set NS = OP.GetNamespace("MAPI") 'To loop
  • Excel:VBA 中的文件打开对话框设置为详细信息视图并按修改日期排序(Excel : File Open Dialog in VBA that is set to Detail View and sorted by Date Modified)
    问题 我已经尝试在谷歌上进行了相当广泛的搜索,但我希望这里有人能胜出。 正如很多人(我想)想要的那样,我想从 Excel 生成一个文件打开对话框(使用 GetOpenFilename 没问题)。 我想我正在尝试实现大多数人在打开对话框时想要的东西,他们想要选择一个文件,通常这是该类型的最新版本? 所以说我有一个充满 .piv 文件的 C:\Temp 目录,我想获取最后创建的文件。 我必须打开对话框,更改为详细信息,然后单击修改日期列,然后这将是我想要的视图和设置。 我每次都必须这样做,用户也是如此。 有没有办法从 Excel VBA 设置排序和视图类型。 第 9 章来自 Professional Excel Development 的东西给了我一些希望,但并没有让我一路走好。 看到如此奇怪的东西,人们想要做的事情一定是一件很平常的事情吗? 回答1 没有官方的方法可以做到这一点。 有一些黑客,但它们很难在各种 Windows 机器上工作。 让这样的黑客在 VBA 中工作听起来非常具有挑战性。 Vista 中引入的新文件对话框会记住列表视图模式、已排序的列等设置。 我认为微软在设计新版本时注意到了人们对旧版本的不满。 回答2 伙计,你必须使用FileDialog ! 该对象提供了比GetOpenFilename (及其同级GetSaveAsFilename )更大的灵活性。
  • Excel VBA - 在文本文件中搜索一个单词并在excel中返回true或false(Excel VBA - search for a word in a text file and return true or false in excel)
    问题 我有大约 200 个不同名称的文本文件存储在一个文件夹中。 我想要的是找到特定单词时(例如错误、故障)。 我希望 excel 在 A 列中的文本文件名旁边提及true或false 。 Name Error Found Textfile1 TRUE Textfile2 FALSE Textfile3 TRUE Textfile4 TRUE Textfile5 TRUE Textfile6 TRUE Textfile7 TRUE Textfile8 TRUE Textfile9 TRUE Textfile10 FALSE Textfile11 FALSE Textfile12 FALSE Textfile13 FALSE Textfile14 FALSE 回答1 我很无聊,这段代码未经测试,远非完美。 将其粘贴到新的代码模块中并调整常量以满足您的需要。 这可能根本不起作用,但可能会给您一些指示。 Public Const SearchPath = "C:\example\" Public Const SearchTerm = "helloworld" Sub Main() Dim oFSO As Object: Set oFSO = CreateObject("Scripting.FileSystemObject") Dim oFolder As Object Dim oFile
  • VBScript-如何使程序等待过程完成?(VBScript - How to make program wait until process has finished?)
    问题 我在与VBA / Excel宏和HTA一起使用的VBScript中遇到问题。 问题仅在于VBScript,我还有其他两个组件,即VBA宏和HTA前端可以完美地工作。 但是在我解释问题之前,我想为您提供帮助,我必须帮助您了解VBScript的上下文。 因此,基本上所有组件(VBScript,VBA宏和HTA)都是我正在构建的用于自动执行一些手动杂项的工具的一部分。 几乎是这样的: A-HTA ~~~~~~~~~~~~~ 用户从HTA / GUI中选择一些文件。 在HTA的HTML中,“ SCRIPT”标记中有一些VBScript,它将用户4个输入文件作为参数传递给VBScript(由WScript.exe执行-为了清楚起见,您可以参考注释#1) 此脚本从现在开始将其命名为myScript.vbs ,然后处理4个参数,其中3个是特定文件,第4个是其中包含多个文件的路径/文件夹位置-(另请参见注释2)。 B-myScript.vbs ~~~~~~~~~~~~~ myScript.vbs打开前三个自变量,即Excel文件。 其中一个是带有我的VBA宏的* .xlsm文件。 然后,myScript.vbs使用第4个参数,它是指向包含多个文件的文件夹的PATH,并将其分配给变量,以便在调用GetFolder时传递给FileSystemObject对象,即... 'Other code
  • 如何从Excel单元格(2010)调用VBA函数?(How to call VBA function from Excel cells (2010)?)
    问题 我在使用VBA的工作簿中定义了一些函数,然后期望能够在单元格公式中使用它们-但Excel无法识别该函数。 我刚得到#NAME? 尝试过: 意识到我已经创建了XSLX文件,所以将其转换为XSLM文件。 没用从函数声明中删除了所有类型。 没用将该功能移到工作表VBA模块中。 没用在声明中添加了“公共”。 没用 我想念什么? 这也不是聪明的代码,或者: Function Square2(AnyNumber) 'return the square of any integer Square2 = AnyNumber * AnyNumber End Function 回答1 回答 将功能放在“ ThisWorkbook”区域中会导致#NAME? 问题。 创建一个新模块(右键单击VBAProject文件夹,插入,新建模块),然后将函数放在那里。 脚步 打开VBA编辑器(在Windows上为Alt + F11 ,在Mac上为Fn + Option + F11 ) 右键单击VBAProject 选择插入>>模块在Module1内创建一个Public函数,例如: Public Function findArea(ByVal width as Double, _ ByVal height as Double) As Double ' Return the area findArea =
  • 在文件夹及其子文件夹内的所有文件中搜索字符串的 vba(vba that searches for a string in all the files inside a folder and its subfolders)
    问题 我有一个巨大的脚本要制作,我已经部分完成了(将 xml 文件解析为 vba 并删除某些不需要的孩子),但我在某一点感到震惊。 我的工作表中的单元格 A1:A1500 中有字符串(从我之前的输出中获得),并且在放置工作簿的同一路径中有一个名为“model”的文件夹(该文件夹有许多子文件夹,子文件夹中有许多 .c 、 .h 、 .xml 文件类型存在)。 我需要一个脚本来获取 A1 中的字符串并在文件夹“model”及其子文件夹中的所有文件中进行搜索,如果该字符串存在于任何文件中,我必须在单元格 B1 中打印/放置“找到的字符串”如果该字符串不存在于任何文件中,我必须在单元格 B1 中打印/放置“未找到”。 以同样的方式,我需要在文件夹“model”中的所有文件中搜索 A2:A1500 中的所有字符串,并在单元格 B2:B1500 中打印/放置“找到的字符串”/未找到。 下面是我在 A1:A4 列的工作表中的一些字符串: vel_gradient D_speed_20 AGB_router_1 F10_35_XS 我对 vba 有点熟悉,但我不确定如何实现这一点。 接受有关脚本的任何帮助。 有人可以帮我弄这个吗。 回答1 正如问题评论中所指出的,这个问题的答案涉及递归,这意味着一个或多个子例程或函数一次又一次地调用自己,等等。幸运的是,Excel 会为您跟踪所有这些。
  • 使用 vba 进行 Azure 分类(Azure classification using vba)
    问题 我有一个宏可以创建和保存多个 word 和 excel 文档。 最近,我的组织开始使用 Microsoft Azure 保护。 它总是要求用户在保存文档时选择分类标签。 有没有办法可以从 VBA 传递标签? (即通过代码控制分类) 我试图搜索现有的问题,但没有运气。 回答1 Azure 信息保护 (AIP) 答案目前不是。 请参阅下面的报价。 鉴于它是一项付费安全功能,我个人不会认为这很可能。 临时解决方案: 作为临时解决方案,根据您的需要,您是否考虑过让管理员设置默认分类? 除了手动选择标签外,还可以通过以下方式应用标签: 您的管理员配置了一个默认标签,您可以保留或更改该标签...... 确保范围政策包括您的帐户。 如果您有分类和保护,而不仅仅是保护,更多信息在这里。 微软的反馈表明这一点...... 可以通过支持标签程序化应用的新 SDK 来解决。 但是,此 SDK 尚未提供公共预览版。 如果您在 Yammer 站点上询问它,您也许可以尝试它的私人预览:https://www.yammer.com/AskIPTeam 那里... 是此 SDK 的用户语音条目,......[可能] 在它公开可用时更新......如果你投票支持它,你也会收到通知:https://msip.uservoice.com/forums/600097-天蓝色信息保护/建议/19602292
  • 只知道扩展名的带有通配符的 VBA 打开文件(VBA Open file with wildcard knowing only extension)
    问题 我试图让 Excel 打开给定文件夹(ThisWorkbook.Path\Peach\Apple)中具有 .xlsm 扩展名的任何文件(总是只有 1 个文件)。 是否可以用通配符打开它? 我不知道文件名,只知道扩展名。 如果没有,有没有办法做到这一点? 回答1 只需向文件系统询问第一个匹配的文件: Dim path As String: path = ThisWorkbook.path & "\Peach\Apple\" FindFirstFile = Dir$(path & "*.xlsm") If (FindFirstFile <> "") Then Workbooks.Open path & FindFirstFile Else '// not found End If (这不会搜索子目录) 回答2 您提到打开最后修改的文件或名称最短的文件会很好,所以让我们开始 - 有一个代码示例,您可以如何获取所有三个文件(首先找到,最后修改,名称最短)。 您可以根据需要修改它(添加一些参数、添加错误处理、仅返回指定等)。 Sub Test() 'declarations Dim fso As Object Dim folder As Object Dim file As Object Dim path As String Dim first_finded As Object Dim
  • 查找和列出文件名扩充以包括子文件夹(Find and List File Names Augment to Include Subfolders)
    问题 我有两个代码。 人们将搜索并命名目录中的每个文件夹。 另一个将列出单个文件夹中的文件和文件名。 我对 VBA 不够精通,无法解决这个问题,所以我需要 StackOverflow! 这是文件名列表程序: Sub Example1() Dim objFSO As Object Dim objFolder As Object Dim objFile As Object Dim i As Integer 'Create an instance of the FileSystemObject Set objFSO = CreateObject("Scripting.FileSystemObject") 'Get the folder object Set objFolder = objFSO.GetFolder("\\fc8fsp01\litho_recipe_amat_data") i = 1 'loops through each file in the directory and prints their names and path For Each objFile In objFolder.Files 'print file name Cells(i + 1, 1) = objFile.Name 'print file path Cells(i + 1, 2) =