標題:
[發問]
使用VBA將公式以文字型態於原位置顯示
[打印本頁]
作者:
ML089
時間:
2013-8-29 15:38
標題:
使用VBA將公式以文字型態於原位置顯示
使用VBA將公式以文字型態於原位置顯示
檔案內有範例及說明
[attach]15881[/attach]
作者:
stillfish00
時間:
2013-8-29 17:29
回復
1#
ML089
Sub TEST()
Dim ar()
Dim rngSrc As Range
With Sheets(1)
Set rngSrc = .Range("A1:O6")
ReDim ar(1 To rngSrc.Rows.Count, 1 To rngSrc.Columns.Count)
For i = 1 To UBound(ar)
For j = 1 To UBound(ar, 2)
If rngSrc.Cells(i, j).HasArray Then
ar(i, j) = "{" & rngSrc.Cells(i, j).FormulaArray & "}"
ElseIf rngSrc.Cells(i, j).HasFormula Then
ar(i, j) = "'" & rngSrc.Cells(i, j).Formula
Else
ar(i, j) = rngSrc.Cells(i, j).Value
End If
Next
Next
rngSrc.Copy
With .[A9]
.PasteSpecial Paste:=xlPasteFormats '格式
.Resize(UBound(ar), UBound(ar, 2)).Value = ar
End With
End With
End Sub
複製代碼
作者:
Hsieh
時間:
2013-8-29 17:54
回復
1#
ML089
Sub ex()
Dim A As Range
For Each A In Cells.SpecialCells(xlCellTypeFormulas)
If A.HasArray Then A = "{" & A.FormulaLocal & "}" Else A = "'" & A.FormulaLocal
Next
End Sub
複製代碼
作者:
ML089
時間:
2013-8-29 17:55
回復
2#
stillfish00
謝謝迅速回覆,學習到很多指令與技巧
希望繼續指導一下
延伸詢問 1
1. 公式文字是要寫回原儲存格位置
2. 要能選取某個工作簿(或某一個檔案)
3. 工作簿裡面包含不定數工作表,要將所有工作表裡有關公式全部改為文字型態(陣列公式前後加 {...} )
作者:
ML089
時間:
2013-8-29 18:04
回復
3#
Hsieh
謝謝
Cells.SpecialCells(xlCellTypeFormulas) 這個可以只選到公式區,真強
下面幾個指令你與stillfish00下的方式不同,這有差別(或要注意的情況嗎)嗎?
.FormulaLocal
.FormulaArray
.Formula
麻煩再看3樓新的延伸問題,謝謝
作者:
ML089
時間:
2013-8-29 20:43
回復
3#
Hsieh
我改寫抓全部工作表後,遇到沒有工作表內沒有公式時就會錯誤,要如何避免
Sub ex00()
Dim A As Range
For Each sh In Sheets
For Each A In sh.Cells.SpecialCells(xlCellTypeFormulas)
If A.HasArray Then
A = "{" & A.FormulaLocal & "}"
Else
A = "'" & A.FormulaLocal
End If
Next
Next
End Sub
複製代碼
作者:
ML089
時間:
2013-8-29 23:09
回復
3#
Hsieh
回復
2#
stillfish00
有新的問題
' 1. 當該工作表沒有公式時會產生錯誤
' 2. 遇到多格陣列公式時會跑很久也會錯誤
' 3. 單格陣列公式時前後用 {}包住, 多格陣列公式時前後用 []包住 - 表示
新的範例檔案
[attach]15883[/attach]
作者:
Hsieh
時間:
2013-8-30 00:15
回復
7#
ML089
Sub ex()
Dim A As Range, C As Range, Sh As Worksheet
fs = Application.GetOpenFilename("Excel Files (*.xls;*.xlsx;*.xlsm), *.xls;*.xlsx;*.xlsm") '開啟舊檔對話
If fs <> False Then
With Workbooks.Open(fs) '開啟舊檔
Application.EnableEvents = False
For Each Sh In .Sheets
With Sh
ar = .UsedRange
For i = 1 To UBound(ar, 1)
For j = 1 To UBound(ar, 2)
Set C = .UsedRange.Cells(i, j)
If C.HasArray Then
Mystr = "{" & C.Formula & "}"
ElseIf C.HasFormula Then
Mystr = "'" & C.Formula
Else
Mystr = C.Formula
End If
ar(i, j) = Mystr
Next
Next
.UsedRange = ar
End With
Next
Application.EnableEvents = True
End With
End If
End Sub
複製代碼
作者:
ML089
時間:
2013-8-30 01:22
回復
8#
Hsieh
執行OK
只剩 多格陣列公式 要用 [ ] 括住,用來區別與單格陣列公式用 { } 括住
因為最後還要將這文字公式復原成公式。
最難的就是多格陣列公式的轉換(公式轉文字,文字再轉回公式),這部分我在網路上找很久都沒有查到可用的,
謝謝超版已經解決一半。
作者:
ML089
時間:
2013-8-30 09:48
回復
8#
Hsieh
原來是文字 '=SUM(B2:M2) 會變成公式
我將 Mystr = C.C.Formula
改為 Mystr = C.Value
[attach]15886[/attach]
作者:
stillfish00
時間:
2013-8-30 10:09
回復
10#
ML089
試看看這樣可不可以。
Sub Test()
Dim C As Range, Sh As Worksheet
Dim fs
fs = Application.GetOpenFilename("Excel Files (*.xls;*.xlsx;*.xlsm), *.xls;*.xlsx;*.xlsm") '開啟檔案
If StrComp(TypeName(fs), "String", vbTextCompare) <> 0 Then Exit Sub '使用者取消選擇檔案
With Workbooks.Open(fs)
Application.EnableEvents = False
For Each Sh In .Sheets
For Each C In Sh.UsedRange
If C.HasArray Then
If C.CurrentArray.Count > 1 Then
C.CurrentArray.Value = "[" & C.FormulaArray & "]"
Else
C.CurrentArray.Value = "{" & C.FormulaArray & "}"
End If
ElseIf C.HasFormula Then
C.Value = "'" & C.Formula
End If
Next
Next
Application.EnableEvents = True
End With
End Sub
複製代碼
作者:
ML089
時間:
2013-8-30 10:27
回復
11#
stillfish00
謝謝你辛苦了,
大部分可以但 多格陣列公式 還是沒有區分出來
PS
多格陣列公式 是指公式輸入時一次選取多儲存格用 CTRL+SHIFT+ENTER齊按輸入
例如:工作表[多格陣列公式]中B2:J10是一次選取同時輸入公式 =A2:A10*B1:J1,以 CTRL+SHIFT+ENTER齊按輸入
作者:
stillfish00
時間:
2013-8-30 10:52
回復
12#
ML089
不行嗎?
我跑7#的新範例,H欄是有分出來的
作者:
ML089
時間:
2013-8-30 11:12
回復
13#
stillfish00
CurrentArray.Count 這個指令單獨測試是OK的,不知我就是跑不出來
我在程式裡加 Debug.Print,並沒有被執行到,不知問題在哪裡
If C.CurrentArray.Count > 1 Then
C.CurrentArray.Value = "[" & C.FormulaArray & "]"
Debug.Print "[" & C.FormulaArray & "]"
Else
作者:
ML089
時間:
2013-8-30 11:27
回復
13#
stillfish00
不好意思,多格陣列公式 已經可以了,CurrentArray.Count這指令可以
因為測試檔案已經被改過沒注意到
後續作業完程後
還要另一個程式執行,將這些 "文字公式" 轉為公式儲存格
再麻煩幫忙一下
PS:有些格式可能需要調整,
單格陣列公式 {...} OK
多格陣列公式 [...] OK ,但如何來判斷他的範圍?
一般公式 '=.... 可能會與原有文字公式衝突,或許將改為 '@=....前2字元 "@=" 來判別
歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)