Excel/VBA:根据内容重命名文件

Excel/VBA:根据内容重命名文件

我需要根据文件内容移动一系列文件。理想情况下,这可以从 Excel 内部触发,因为用户正在导入文件。我可以使用一个简单的 Unix shell 脚本来执行此操作,如下所示:

#!/bin/bash
for F in $(ls *.csv)
  do  
   while read N W
   do
     if grep -q "$W" "$F"
     then
      NEW=${N:0:50}.csv
        echo $F $NEW
        cp "$F" WORKING/$NEW
        break
      fi
  done <  ../Documents/ASSET\ Sale/bin/fixfilenames_namemap.txt
done

cp Name*.csv WORKING/name_name2.csv

fixfilesnames_namemap.txt 的格式为:

newfilename text search string
newfilename2 text search string number two

请注意,最后一行是一个临时解决方案,因为该文件的名称中有很多空格,因此无法在循环中正确调用,所以我只移动一个文件。

我想要一个可以运行的 VBA 例程或者一个可以从 Excel 2016 内部触发的简单 .bat 文件。

目前,我正在使用 RenameFile() 函数,该函数允许我指定目录、源和新名称。如果我能让搜索函数在另一个字段中查找文本字符串,那么一切就都准备好了。

Public Function RenameFile()
Dim src As String, dst As String, fl As String
Dim rfl As String

'Folder
src = Range("F4")
'File name
fl = Range("G4")
'Rename file
rfl = Range("Assets_Eligible_Destination")

On Error Resume Next
Name src & "\" & fl As src & "\" & rfl
If Err.Number <> 0 Then
    MsgBox "Error: " & src & "\" & rfl
End If
On Error GoTo 0
End Function

谢谢

答案1

以下代码可用于在一组文件中的某个工作表中查找字符串。但是,如果文件有 100K 行,并且匹配行在最后 10 行,则速度会非常慢。

这是基于另一个 StackOverflow 答案: 如何使用 VBA 在众多文本 .log 文件之一中查找特定字符串?

Sub StringExistsInFile()
  Dim theString As String
  Dim path As String
  Dim StrFile As String
  Dim fso As New FileSystemObject
  Dim file As TextStream
  Dim line As String

  theString = Range("E4")
  path = Range("F4")
  StrFile = Dir(path & "*.csv")

  Do While StrFile <> ""

    'Find TheString in the file
    'If found, debug.print and exit loop

    'Set file = fso.OpenTextFile(path & StrFile)


    Do While Not file.AtEndOfStream
        line = file.ReadLine

'Debug.Print line

        If InStr(1, line, theString, vbTextCompare) > 0 Then
            Range("G4").Value = StrFile
            Exit Do
        End If
    Loop

    file.Close
    Set file = Nothing
    Set fso = Nothing

    StrFile = Dir()
  Loop
End Sub

相关内容