2017-06-12 18 views
0

提供されたディレクトリでファイルを1つずつ開き、すべての数式を計算し、特定の数式に値を貼り付けて保存して終了し、繰り返します次のファイルを処理します。ここで私は以下の持っているものです。VBA:ファイルを開く、計算する、値をペーストする、繰り返しする

Sub LoopPaloSnapshot() 

Dim wb As Workbook 
Dim ws As Worksheet 
Dim MyPath As String 
Dim FldrPicker As FileDialog 
Dim FSO As New FileSystemObject 
Dim MyFolder As Folder 
Dim SubFolder As Folder 
Dim MyFile2 As File 

Application.ScreenUpdating = True 
Application.EnableEvents = False 
Application.DisplayAlerts = 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 

Set FSO = CreateObject("scripting.filesystemobject") 


'In Case of Cancel 
NextCode: 

MyPath = MyPath 

Set MyFolder = FSO.GetFolder(MyPath) 

For Each SubFolder In MyFolder.SubFolders 

For Each MyFile2 In SubFolder.Files 


If FSO.GetExtensionName(MyFile2.Path) = "xlsx" Then 

    Set wb = Workbooks.Open(Filename:=MyFile2, UpdateLinks:=0) 

    Set ws = wb.Worksheets("Staffing Model") 

     Application.Run ("PALO.CALCSHEET") 
     Application.Calculate 
     Application.Run ("PALO.CALCSHEET") 
     Application.Calculate 

    Application.Calculation = xlCalculationManual 

     ws.Range("B1").Select 
     Selection.Copy 
     Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, 
SkipBlanks _ 
     :=False, Transpose:=False 
     ws.Range("F10:Q10").Value = ws.Range("F10:Q10").Value 
     Selection.Copy 
     Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, 
SkipBlanks _ 
     :=False, Transpose:=False 
     ws.Range("F20:Q22").Value = ws.Range("F20:Q22").Value 
     Selection.Copy 
     Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, 
SkipBlanks _ 
     :=False, Transpose:=False 
     ws.Range("F42:Q43").Value = ws.Range("F42:Q43").Value 
     Selection.Copy 
     Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, 
SkipBlanks _ 
     :=False, Transpose:=False 
     ws.Range("F56:Q56").Value = ws.Range("F56:Q56").Value 
     Selection.Copy 
     Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, 
SkipBlanks _ 
     :=False, Transpose:=False 
     ws.Range("F61:Q61").Value = ws.Range("F61:Q61").Value 
     Selection.Copy 
     Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, 
SkipBlanks _ 
     :=False, Transpose:=False 
     ws.Range("F66:Q66").Value = ws.Range("F66:Q66").Value 
     Selection.Copy 
     Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, 
SkipBlanks _ 
     :=False, Transpose:=False 

'Break Links 
    If Not IsEmpty(wb.LinkSources(xlExcelLinks)) Then 
    For Each link In wb.LinkSources(xlExcelLinks) 
    wb.BreakLink link, xlLinkTypeExcelLinks 
    Next link 
    End If 

Dim xWs As Worksheet 
For Each xWs In Application.ActiveWorkbook.Worksheets 
    If xWs.Name <> "Staffing Model" Then 
     xWs.Delete 
    End If 
Next 

    'Save and Close Workbook 
    wb.Close SaveChanges:=True 

'Loop 

End If 

Next 
Next 

MsgBox "Task Complete!" 

ResetSettings: 
Application.ScreenUpdating = True 
Application.EnableEvents = True 
Application.DisplayAlerts = True 
Application.Calculation = xlCalculationAutomatic 

End Sub 

これを実行した後、私は新しく保存されたファイルを開くと#VALUEエラーが式の代わりに、ある値を超える計算し、ペーストしようとしてイム。私は行ごとにマクロ行を歩いてみましたが、それは大部分のために適切に動作しているようですが、何らかの理由で数式が計算されません。マクロを実行する前にファイルを手動で開くと、すべてが完全に計算されるので、マクロが実行されている間に何かが計算されないかどうか疑問に思っています。どんな助けもありがとう。

EDIT:値をコピーアンドペーストする式は、ブック内の他のタブからのHLOOKUPのプルと、JEDOXサーバーから直接データを取得するPALO式です。私は手作業でエラーなしで自動化しようとしています。代わりに、コピー&ペースト複雑な数式の

+0

コピーして貼り付ける内容についてさらに詳しく記入してください。それはエラーがある場所です。 – Graham

+0

@Graham素晴らしい名前!私は編集を加えました。私はそれが助けて欲しい –

+0

助けてくれてうれしいです、気をつけてください。 – Graham

答えて

0

、私はこの方法を用いて細胞に直接数式を書くことをお勧めしたい:

Worksheets("Sheet1").Range("A1").Formula = "=$A$4+$A$10" 
時々混乱の原因となる元のワークシートへの参照を運ぶことができます

貼り付け式のに対し、明示的に設定された式はそれをしません。

もしあなたが本当にオフラインにしたいのであれば、この方法を使って値を設定することもできます。

Worksheets("Sheet1").Range("A1").Value = "100" 
+0

私は従いません。数式は既に選択中のセルにあります。このマクロの目的は、データ・サーバーへのアクセス権を持たないフィールドにファイルを送信する準備をすることです。 –

+0

私は実際にそれを修正したと思う。小さなマクロを記録して怠け者になってしまい、コピーして貼り付けるうちに不注意になりました....とにかくあなたの応答に感謝します。それは誤って私がこれを実現するのを助けました。 –

+0

私はEssbaseとExcelでこれを行う必要がありましたが、明示的な方法に移行するまで全く同じ問題がありました。 – Graham

関連する問題