Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA删除公式并另存为v2_Excel_Vba_Save - Fatal编程技术网

Excel VBA删除公式并另存为v2

Excel VBA删除公式并另存为v2,excel,vba,save,Excel,Vba,Save,在下面的代码中,我尝试进行调整,以便在选项卡上的所有文件中循环,并且如果范围中有公式将其转换为值。但仅适用于特定选项卡。在关闭和保存文件之前,我想将其保存为当前名称,并在末尾添加“\u v2”。有人能帮忙吗 Sub LoopAllExcelFilesInFold2() 'PURPOSE: To loop through all Excel files in a user specified folder and perform a set task on them Di

在下面的代码中,我尝试进行调整,以便在选项卡上的所有文件中循环,并且如果范围中有公式将其转换为值。但仅适用于特定选项卡。在关闭和保存文件之前,我想将其保存为当前名称,并在末尾添加“\u v2”。有人能帮忙吗

    Sub LoopAllExcelFilesInFold2()
    'PURPOSE: To loop through all Excel files in a user specified folder and perform a set task on them

    Dim wb As Workbook
    Dim myPath As String
    Dim myFile As String
    Dim myExtension As String
    Dim FldrPicker As FileDialog
    Dim rng As Range
    'Optimize Macro Speed
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    Application.Calculation = xlCalculationManual

'Retrieve Target Folder Path From User
    Set FldrPicker = Application.FileDialog(msoFileDialogFolderPicker)

    With FldrPicker
   .Title = "Select A Target Folder"
   .AllowMultiSelect = False
   If .Show <> -1 Then GoTo NextCode
myPath = .SelectedItems(1) & "\"
End With

'In Case of Cancel
NextCode:
myPath = myPath
If myPath = "" Then GoTo ResetSettings

'Target File Extension (must include wildcard "*")
myExtension = "*.xls*"

'Target Path with Ending Extention
myFile = Dir(myPath & myExtension)

'Loop through each Excel file in folder
Do While myFile <> ""
'Set variable equal to opened workbook
Set wb = Workbooks.Open(Filename:=myPath & myFile)

'Ensure Workbook has opened before moving on to next line of code
DoEvents
On Error Resume Next

Sheets("Cubes Act'20").Select
For Each rng In ActiveSheet.UsedRange
If rng.HasFormula Then
rng.Formula = rng.Value
End If
Next rng








'Save and Close Workbook
'wb.Close SaveChanges:=True
wb.Close ActiveWorkbook.SaveCopyAs("filename" & "_v2")

'Ensure Workbook has closed before moving on to next line of code
DoEvents

'Get next file name
myFile = Dir
Loop

'Message Box when tasks are completed
MsgBox "Task Complete!"

ResetSettings:
'Reset Macro Optimization Settings
Application.EnableEvents = True
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True

End Sub
Sub-loopalExcelFileSinfold2()
'用途:循环浏览用户指定文件夹中的所有Excel文件并对其执行设置任务
将wb设置为工作簿
将myPath设置为字符串
将myFile设置为字符串
Dim myExtension作为字符串
Dim FldrPicker As FILE对话框
变暗rng As范围
'优化宏速度
Application.ScreenUpdating=False
Application.EnableEvents=False
Application.Calculation=xlCalculationManual
'从用户检索目标文件夹路径
Set FldrPicker=Application.FileDialog(msoFileDialogFolderPicker)
用FldrPicker
.Title=“选择目标文件夹”
.AllowMultiSelect=False
如果.Show-1,则转到下一个代码
myPath=.SelectedItems(1)和“\”
以
"如果取消,
下一个代码:
myPath=myPath
如果myPath=”“,则转到重置设置
'目标文件扩展名(必须包含通配符“*”)
myExtension=“*.xls*”
'具有结束扩展名的目标路径
myFile=Dir(myPath&myExtension)
'循环浏览文件夹中的每个Excel文件
当我的文件“”时执行此操作
'将变量设置为等于打开的工作簿
设置wb=Workbooks.Open(文件名:=myPath&myFile)
'在继续下一行代码之前,确保工作簿已打开
多芬特
出错时继续下一步
工作表(“20号立方体法案”)。选择
对于ActiveSheet.UsedRange中的每个rng
如果rng.has公式,则
rng.公式=rng.值
如果结束
下一个rng
'保存并关闭工作簿
'wb.Close SaveChanges:=True
wb.Close ActiveWorkbook.SaveCopyAs(“文件名”和“\u v2”)
'在继续下一行代码之前,确保工作簿已关闭
多芬特
'获取下一个文件名
myFile=Dir
环
'任务完成时的消息框
MsgBox“任务完成!”
重置设置:
'重置宏优化设置
Application.EnableEvents=True
Application.Calculation=xlCalculationAutomatic
Application.ScreenUpdating=True
端接头

我相信函数
NextFileName()
可以满足您的需要

我的文件上几乎总是有版本号,所以我经常需要在更新完文件“AAA V27.xxx”后找到新名称“AAA V28.xxx”。我将函数
NextFileName()
保存在PERSONAL.XLSB中,以便可以从我的任何工作簿中调用它

这里的
NextFileName()
版本不是我的最新版本。一年前,我遇到了基于日期处理文件版本的需求,并创建了一个新版本的
NextFileName()
来处理此类文件名。我找到了我的旧版本,并对其进行了增强,以便在没有找到版本号的情况下添加“V2”

您可以运行
TestNextFileName()
检查我的例程是否按您的意愿执行

Option Explicit
Sub TestNextFileName()

    Debug.Print ("AAA 5.abc     -> " & NextFileName("AAA 5.abc"))
    Debug.Print ("BBB V9.abc    -> " & NextFileName("BBB V9.abc"))
    Debug.Print ("CCC V05.abc   -> " & NextFileName("CCC V05.abc"))
    Debug.Print ("DDD V1.99.abc -> " & NextFileName("DDD V1.99.abc"))
    Debug.Print ("EEE.abc       -> " & NextFileName("EEE.abc"))

End Sub
Public Function NextFileName(ByVal CrntFileName As String) As String

  ' * CrntFileName should be of the format "zzzzyy.xxx" where
  '     yy represents a string of one or more decimal digits
  '     the final z is anything but a decimal digit.
  '     xxx represents the extension
  ' * If CrntFileName is of this format, the routine returns "zzzzww.xxx" where
  '     ww is one more than yy.
  ' * If CrntFileName is not of this format. the routine returns "zzzz V2.xxx".
  ' * Examples:
  '     AAA 5.abc      -> AAA 6.abc
  '     BBB V9.abc     -> BBB V10.abc
  '     CCC V05.abc    -> CCC V06.abc
  '     DDD V1.99.abc  -> DDD V1.100.abc
  '     EEE.abc        -> EEE V2.abc
  ' 26Jul11  Coded and tested under VB 2010.
  ' 22Nov11  Amended for VBA
  ' 14Jan19  Became obsolete when version that allowed for other options coded.
  ' 16Apr20  Resurrected in response to SO question.  Amended to add V2 if no
  '          version number found

  Dim Extn As String
  Dim Name As String
  Dim Pos As Integer
  Dim Version As String

  ' Split CrntFileName into name and extension
  Pos = InStrRev(CrntFileName, ".")
  If Pos = 0 Then
    Name = CrntFileName
    Extn = ""
  Else
    Name = Mid(CrntFileName, 1, Pos - 1)
    Extn = Mid(CrntFileName, Pos)       ' Includes dot
  End If

  Pos = Len(Name)
  Do While True
    If IsNumeric(Mid(Name, Pos, 1)) Then
      Pos = Pos - 1
    Else
      Pos = Pos + 1
      Exit Do
    End If
    Loop
  ' If Pos > Len(Name), there are no trailing digits
  ' if Pos <=Len(Name), Pos identifies the first or only trailing digit.

  If Pos > Len(Name) Then
    NextFileName = Name & " V2" & Extn
  Else
    Version = Mid(Name, Pos) + 1      ' Next version number
    ' Add leading zeros if necessary to pad to original length
    Do While Len(Version) < Len(Mid(Name, Pos))
      Version = "0" & Version
    Loop
    NextFileName = Mid(Name, 1, Pos - 1) & Version & Extn
  End If

End Function
选项显式
子TestNextFileName()
Debug.Print(“AAA 5.abc->”和NextFileName(“AAA 5.abc”))
Debug.Print(“bbbv9.abc->”和NextFileName(“bbbv9.abc”))
调试.打印(“CCC V05.abc->”和下一个文件名(“CCC V05.abc”))
Debug.Print(“DDD V1.99.abc->”和NextFileName(“DDD V1.99.abc”))
Debug.Print(“EEE.abc->”和NextFileName(“EEE.abc”))
端接头
公共函数NextFileName(ByVal CrntFileName作为字符串)作为字符串
'*CrntFileName的格式应为“zzzzyy.xxx”,其中
'yy表示由一个或多个十进制数字组成的字符串
'最后的z不是十进制数字。
'xxx表示扩展名
'*如果CrntFileName是这种格式,例程将返回“zzzzww.xxx”,其中
“ww比yy多一个。
'*如果CrntFileName不是此格式。例程返回“zzzzv2.xxx”。
“*例如:
'AAA 5.abc->AAA 6.abc
'bbbv9.abc->bbbv10.abc
'CCC V05.abc->CCC V06.abc
'DDD V1.99.abc->DDD V1.100.abc
'EEE.abc->EEE V2.abc
'2011年7月26日在VB 2010下进行编码和测试。
'2011年11月22日为VBA修订
当允许其他选项的版本编码时,1919年1月14日变得过时。
’20年4月16日,在回答这一问题时复活。如果没有,则修改为添加V2
'找到版本号
Dim Extn作为字符串
将名称设置为字符串
作为整数的Dim Pos
将版本设置为字符串
'将CrntFileName拆分为名称和扩展名
Pos=InStrRev(CrntFileName,“.”)
如果Pos=0,则
Name=CrntFileName
Extn=“”
其他的
Name=Mid(CrntFileName,1,位置-1)
Extn=Mid(CrntFileName,Pos)'包括点
如果结束
Pos=Len(名称)
做正确的事
如果是数字(Mid(名称,位置,1)),则
位置=位置-1
其他的
位置=位置+1
退出Do
如果结束
环
'如果Pos>Len(Name),则没有尾随数字
'如果位置Len(名称),则
NextFileName=Name&“V2”和Extn
其他的
版本=Mid(名称、位置)+1'下一版本号
'必要时添加前导零以填充到原始长度
边做边读(版本)
您最好确定相关范围,然后将整个内容作为值复制/粘贴回来,而不是逐个单元格。那么您的意思是,如果该工作表存在,您只想在工作表上运行此操作吗?如果是这样的话,有一些自定义项来检查是否存在一个工作表,您可以利用它来清理代码,谢谢您的回答。这确实应该考虑文件的命名。