2

私は一連の大きなワークブックで作業しており、ツールを使用して財務データベース (SAP Financial Consolidation) から値をインポートしています。=GetCtData({parameters})これが機能する方法は、またはなどの UDF を使用すること=GetCtLabel({parameters})です。パラメータの 1 つは、セルの出力値であり、任意の時点でセルの値が数値になります。

Financial Consolidation アドインを持っていない他のユーザーとこれらのワークブックを共有するには、これらの各セルを値に変換する必要があります。すべてのセルを値に変換するのではなく、=GetCt...数式を含むセルのみを変換します。以下は、これまでに書いたコードで、3 つの (類似した) アプローチがあります (2 つはコメントアウトされています)。小さなワークブックでは完全に機能しますが、ファイルが大きくなり、更新が必要なセルが合計でおそらく 250,000 以上になりました。(およそ 70 列 x 350 行 x 10+ ワークシート。) 実行してみましたが、数時間後も実行されています。

誰でもより効率的な方法を提案できますか?

Sub removeAllMagnitudeLinks()

    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    Application.EnableEvents = False

    For Each sSheet In Worksheets
        If sSheet.Name <> "blankMagnitude" Then 'Don't remove links from the blankMagnitude sheet -- unnecessary
            If sSheet.FilterMode Then sSheet.ShowAllData

            Application.StatusBar = "Working on sheet #" & sSheet.Index & " of " & Worksheets.Count & ". Name: " & sSheet.Name

            On Error Resume Next
            While Err.Number = 0
                With sSheet.Cells.Find(What:="GetCt", After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False)
'                    .Copy 'Copying and pasting is one approach, but may not be fastest
'                    .PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
'                    .Formula = .Value 'This is another approach, which is certainly not very fast
                    .Value = .Value
                End With
            Wend
        End If
    Next sSheet
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = True
End Sub
4

4 に答える 4

0

私はこのようなバリアント配列アプローチを試してみます

Sub removeAllMagnitudeLinks()
    Dim sSheet As Worksheet
    Dim vFormulas As Variant
    Dim vValues As Variant
    Dim j As Long
    Dim k As Long
    Dim strFormula As String
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    Application.EnableEvents = False

    For Each sSheet In Worksheets
        If sSheet.Name <> "blankMagnitude" Then    'Don't remove links from the blankMagnitude sheet -- unnecessary
            If sSheet.FilterMode Then sSheet.ShowAllData

            Application.StatusBar = "Working on sheet #" & sSheet.Index & " of " & Worksheets.Count & ". Name: " & sSheet.Name

            vFormulas = sSheet.UsedRange.Formula
            vValues = sSheet.UsedRange.Value2
            For j = LBound(vFormulas) To UBound(vFormulas)
                For k = LBound(vFormulas, 2) To UBound(vFormulas, 2)
                    strFormula = CStr(vFormulas(j, k))
                    If Len(strFormula) > 0 Then
                        If Left$(strFormula, 1) = "=" Then
                            If InStr(1, strFormula, "GetCt", vbTextCompare) Then
                                vFormulas(j, k) = vValues(j, k)
                            End If
                        End If
                    End If
                Next k
            Next j
            sSheet.UsedRange.Formula = vFormulas

        End If
    Next sSheet
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = True
End Sub
于 2012-06-01T10:48:28.850 に答える
0

XML形式で保存されたExcelブックは次のようになります

...
<Row>
 <Cell ss:Index="2" ss:Formula="=4+2"><Data ss:Type="Number">6</Data><NamedCell
   ss:Name="MyRange"/></Cell>
</Row>
<Row>
 <Cell ss:Index="2" ss:Formula="=5+2"><Data ss:Type="Number">7</Data><NamedCell
   ss:Name="MyRange"/></Cell>
</Row>
...

VBプロジェクトを本と一緒に保存しなくてもそれほど問題が発生しない場合は、これは簡単に解析でき、正規表現などで一括置換できます(必要に応じてコードを提供できます) 。

于 2012-06-01T11:02:42.253 に答える