Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.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
使用VBA删除对公式中文件名的引用_Vba_Excel - Fatal编程技术网

使用VBA删除对公式中文件名的引用

使用VBA删除对公式中文件名的引用,vba,excel,Vba,Excel,我正在尝试从Excel工作簿复制一系列工作表,并将它们粘贴到新工作簿中。我遇到的问题是,当我将工作表复制到新工作簿中时,公式仍然是对公式中旧工作簿的引用。我试图获取工作簿的名称并用空字符替换它,但我相信我的代码引用的是新工作簿,而不是旧工作簿。我尝试了一个函数,也尝试了“ThisWorkbook”和“ActiveWorkbook”,但似乎都不起作用 这是函数 Function MyName() As String MyName = ThisWorkbook.Name End Functi

我正在尝试从Excel工作簿复制一系列工作表,并将它们粘贴到新工作簿中。我遇到的问题是,当我将工作表复制到新工作簿中时,公式仍然是对公式中旧工作簿的引用。我试图获取工作簿的名称并用空字符替换它,但我相信我的代码引用的是新工作簿,而不是旧工作簿。我尝试了一个函数,也尝试了“ThisWorkbook”和“ActiveWorkbook”,但似乎都不起作用

这是函数

Function MyName() As String
    MyName = ThisWorkbook.Name
End Function
这是完整的代码

Sub CopyToNewWorkbook()

  Dim ws As Worksheet
  Dim i As Integer
  Dim wbCurrent As Workbook
  Dim wbName As Variant
  Dim wbNew As Workbook

  'wbName = ActiveWorkbook.Name
  'wbName = ThisWorkbook.Name
  Set wbCurrent = ActiveWorkbook
  Set wbNew = Workbooks.Add

  For Each ws In wbCurrent.Sheets   
    Do While wbNew.Sheets.Count <= (wbCurrent.Sheets.Count - 3)
      For i = 3 To wbCurrent.Sheets.Count
        wbCurrent.Sheets(i).Copy after:=wbNew.Sheets(wbNew.Sheets.Count)            
      Next i
    Loop            
  Next ws

  wbNew.Activate
  Sheets("Sheet1").Select
  ActiveWindow.SelectedSheets.Delete

  Cells.Replace What:=MyName, Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows, _
        MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

End Sub
Sub CopyToNewWorkbook()
将ws设置为工作表
作为整数的Dim i
将当前工作区设置为工作簿
作为变量的名称
以工作簿的形式新建
'wbName=ActiveWorkbook.Name
'wbName=ThisWorkbook.Name
设置wbCurrent=ActiveWorkbook
设置wbNew=工作簿。添加
对于wbCurrent.Sheets中的每个ws

当wbNew.Sheets.Count时,您是否可以不使用断开链接方法

'Get all links
  ExternalLinks = wbNew.LinkSources(Type:=xlLinkTypeExcelLinks)

'Break each link
 For x = 1 To UBound(ExternalLinks)
   wbNew.BreakLink Name:=ExternalLinks(x), Type:=xlLinkTypeExcelLinks
 Next x

我能够通过以下代码获得预期的结果

  Sub CopyToNewWorkbook()      

  Dim ws As Worksheet
  Dim i As Integer
  Dim wbCurrent As Workbook
  Dim wbName As Variant
  Dim wbNew As Workbook

  Call MyName
    wbName = MyName

  Set wbCurrent = ActiveWorkbook
  Set wbNew = Workbooks.Add

  For Each ws In wbCurrent.Sheets   
    ws.Visible = xlSheetVisible
    Do While wbNew.Sheets.Count <= (wbCurrent.Sheets.Count - 3)
      For i = 3 To wbCurrent.Sheets.Count
        wbCurrent.Sheets(i).Copy after:=wbNew.Sheets(wbNew.Sheets.Count)            
      Next i
    Loop            
  Next ws

  wbNew.Activate
    Sheets("Sheet1").Select
      ActiveWindow.SelectedSheets.Delete

  Cells.Replace What:=MyName, Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows, _
        MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

  Cells.Replace What:="'[" & wbName & "]", Replacement:="'", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:= _
        False, SearchFormat:=False, ReplaceFormat:=False
End Sub
Sub CopyToNewWorkbook()
将ws设置为工作表
作为整数的Dim i
将当前工作区设置为工作簿
作为变量的名称
以工作簿的形式新建
叫我的名字
wbName=MyName
设置wbCurrent=ActiveWorkbook
设置wbNew=工作簿。添加
对于wbCurrent.Sheets中的每个ws
ws.Visible=xlSheetVisible

Do While wbNew.Sheets.Count抱歉,我没有时间键入代码,但是…如果在复制之前将所有=(等号)替换为|(管道),所有公式都将转换为文本字符串。然后,您可以将工作表复制到新工作簿,在新工作表上查找并替换工作簿名称,最后查找并替换| back to=,所有操作都完成了。您的3个循环都是冗余的,不是吗?皮带和吊带?如果您现在展示一些这些公式的示例,可能会有所帮助。@Vincent G,是的,您是对的,我有几个循环,我相信我遇到的问题是回到原始文件或区分这两个文件。@bwmastang13只有内部For循环是必要的,另外两个没有用。断开这些链接将完全断开公式并保留值?是的。断开链接会断开公式,这是我不想做的。如果我误解了那里的要求,很抱歉。那么,您是说希望更改引用旧书的每个单元格中的公式,将旧书的名称替换为新书的名称?请不要发布您自己问题的答案。相反,请使用“解决方案”部分更新问题。@ScottMarcus要求在哪里更新?没提那件事。