2017-01-26 5 views
1

Excelワークブックから一連のワークシートをコピーして新しいワークブックに貼り付けようとしています。私が抱えている問題は、ワークシートを新しいワークブックにコピーすると、フォーミュラは古いワークブックへの参照であるということです。私はブックの名前を取得し、null文字で置き換えようとしましたが、私のコードは古いブックではなく新しいブックを参照していると思います。私は 'ThisWorkbook'と同様に 'ActiveWorkbook'と同様の機能を試しましたが、うまく機能していないようです。ここでVBAを使用して式内のファイル名への参照を削除する

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 
+0

申し訳ありませんが、コードを入力する時間はありませんが、=(等号)記号をすべて| (パイプ)を使用すると、すべての数式がテキスト文字列に変換されます。次に、ワークシートを新しいワークブックにコピーし、新しいシート上のワークブック名​​を見つけて置き換え、最後に検索して置換します。 =に戻り、あなたはすべて完了です。 – sous2817

+0

あなたの3つのループは何となく冗長ですか?ベルトとサスペンダー? –

+0

これらの式が現在どのようなものかの例をいくつか示しておけば、おそらく役に立ちます。 –

答えて

0

次のコードで目的の結果が得られました。

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 
+0

あなた自身の質問に回答を投稿しないでください。代わりに、「解決策」セクションで質問を更新してください。 –

+0

@ScottMarcusどこに依頼するのですか? http://stackoverflow.com/help/self-answerには言及していません。 –

0

はあなただけBreakLinksメソッドを使用することができませんでした....ここ

Function MyName() As String 
    MyName = ThisWorkbook.Name 
End Function 

は完全なコードです....機能ですか?

'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 
+0

これらのリンクを解除すると、数式が完全に破棄され、値が保持されますか? –

+1

はい。リンクを壊すと、やりたくない数式が壊れます。 – BWMustang13

+0

申し訳ありませんが私はそこに要件を誤解しています。それで、古い本の名前を新しいものの名前に置き換えて、古い本を参照する各セルの数式を変更したいと言っていますか? – CLR

関連する問題