標題:
請教由巨集錄制的公式如何轉換為VBA公式,並且儲存格可以是變數
[打印本頁]
作者:
luffyzoro
時間:
2011-11-21 17:13
標題:
請教由巨集錄制的公式如何轉換為VBA公式,並且儲存格可以是變數
ActiveCell.FormulaR1C1 = _
"=IF(AND(RC[-1]=[hub.xls]AA!R2C2,[hub.xls]AA!R2C24>0,[hub.xls]AA!R2C24-SUM(R2C11:RC[5])>0), [hub.xls]AA!R2C9)"
ActiveCell.Offset(1).Select
請教各位版大,如上公式為從巨集COPY到VBA中,但是現在我有問題無法解決,
如果[hub.xls]AA!R2C2及[hub.xls]AA!R2C24及[hub.xls]AA!R2C24及[hub.xls]AA!R2C9這四個是另外一個
檔案中的儲存格都在同一列,現在我需要將"行"是可以變動的,該如何修改?
另外[hub.xls]AA!R2C24-SUM(R2C11:RC[5])>0這個裡面的SUM(R2C11:RC[5])的累加應該是要只累加與[hub.xls]AA!R2C9的值一樣該儲存格對應到同一列的數量儲存格作累加
可否請高手幫忙看一下該怎麼寫VBA比較好
作者:
Hsieh
時間:
2011-11-21 20:05
回復
1#
luffyzoro
錄製巨集的公式是以R1C1參照形式
R後面的數值是表示列位,當R後面沒有數值表示與公式所在儲存格同列,數值以中括號標示表示相對參照於公式所在儲存格的列數。
C後面的數值是表示欄位,當C後面沒有數值表示與公式所在儲存格同欄,數值以中括號標示表示相對參照於公式所在儲存格的欄數。
而公式在VBA中是一個字串型態的資料
例如:R2C24這是指到X2儲存格
若是欄位要變動,先以變數指定欄位然後帶入字串
k=26
"R2C" & k
這樣得到字串就是R2C26
作者:
luffyzoro
時間:
2011-11-22 02:10
本帖最後由 luffyzoro 於 2011-11-22 02:59 編輯
[attach]8596[/attach]
回復
2#
Hsieh
版大您好
感謝您熱心回覆
小弟因工作需要,因此嚐試寫VBA
寫了一堆自己看了都很複雜的程式碼,寫到卡住了
懇請版大開釋
該用什麼寫法才能完成小弟想要達成的完成檔
其中有附上小弟寫的
懇請版大指點
作者:
luffyzoro
時間:
2011-11-22 18:06
回復
2#
Hsieh
hubcn = 2
ActiveCell.FormulaR1C1 = _
"=IF(AND(RC[-1]=[hub.xls]AA!"R"&hubcn&"C2",[hub.xls]AA!"R"&hubcn&"C24">0,[hub.xls]AA!"R"&hubcn&"C24"-SUM(R2C11:RC[5])>0),[hub.xls]AA!"R"&hubcn&"C9")"
請問版大若照您舉例是否是寫成如上?這次我要變動的是rows
但是卻出現語法錯誤?
請問哪裡需要修正?
感謝
作者:
Hsieh
時間:
2011-11-22 20:16
回復
4#
luffyzoro
hubcn = 2
ActiveCell.FormulaR1C1 = _
"=IF(AND(RC[-1]=[hub.xls]AA!R" & hubcn & "C2,[hub.xls]AA!R" & hubcn & "C24>0,[hub.xls]AA!R" & hubcn & "C24-SUM(R2C11:RC[5])>0),[hub.xls]AA!R" & hubcn & "C9)"
作者:
luffyzoro
時間:
2011-11-23 17:39
本帖最後由 luffyzoro 於 2011-11-23 17:50 編輯
回復
5#
Hsieh
再次感謝大大迅速的回覆,我又有新問題了
Application.Dialogs(xlDialogOpen).Show
Dim hubopf As String
hubopf = ActiveWorkbook.Name←我的用意是要取得以對話框凱啟檔案的名稱,是否這裡有問題?
Worksheets("AC-8E").Cells.Select
Worksheets("AC-8E").Range("A:BY").Sort Key1:=Worksheets("AC-8E").Range("D2"), _
Order1:=xlAscending, Key2:=Worksheets("AC-8E").Range("I2") _
, Order2:=xlAscending, Header:=xlYes
ThisWorkbook.Activate
Dim calopf As String
calopf = ThisWorkbook.Name
ActiveSheet.Cells.Select
Selection.Sort Key1:=Range("A2"), Order1:=xlAscending, Key2:=Range("C2"), _
Order2:=xlAscending, Key3:=Range("E2"), _
Order3:=xlAscending, Header:=xlYes
Cells(ActiveSheet.Rows.Count, 6).End(xlUp).Select
Selection.Offset(1, 0).Select
Workbooks(hubopf).Worksheets("AC-8E").Activate←逐行執行到這裡出現錯誤"型態不符合"
請問是不是我在宣告hubopf這個變數時有問題?
感謝大大
作者:
Hsieh
時間:
2011-11-23 19:53
回復
6#
luffyzoro
Dim hubopf As String
hubopf = Application.GetOpenFilename("Excel Files (*.xls), *.xls")
If hubopf = "False" Then MsgBox "請選取檔案": Exit Sub
Workbooks.Open hubopf
作者:
luffyzoro
時間:
2011-11-24 10:02
回復
7#
Hsieh
版大再次感謝您的熱心
抱歉,我沒有把問題說清楚
假設我的巨集是寫在A.xls , 用A.xls開啟B.xls , 照版大的方式我的hubopf會得到
"D:\C資料夾\F資料夾\B.xls"
實際上我想得到的字串只有 "B.xls" ,因為每次開的檔名可能不一樣
所以我想將hubopf = "B.xls"
如此後續的Workbooks("hubopf")應該就會照著開啟不同的檔案做變動
請問
1.我該如何取得hubopf = "B.xls"隨著開啟檔名不同也可能是"C.xls"
2.後續要套用Workbooks是要寫Workbooks(hubopf)還是要寫Workbooks("hubopf")?
感謝
作者:
GBKEE
時間:
2011-11-24 11:53
回復
8#
luffyzoro
Option Explicit
Sub Ex()
Dim hubopf As String, AR
hubopf = Application.GetOpenFilename("Excel Files (*.xls), *.xls")
If hubopf = "False" Then MsgBox "請選取檔案": Exit Sub
AR = Split(hubopf, "\")
hubopf = AR(UBound(AR)) 'hubopf = "B.xls"隨著開啟檔名不同也可能是"C.xls"
Workbooks.Open hubopf 'Workbooks( hubopf )
End Sub
複製代碼
作者:
luffyzoro
時間:
2011-11-24 15:26
回復
9#
GBKEE
感謝GBKEE版大
Dim hubopf As String, AR
hubopf = Application.GetOpenFilename("Excel Files (*.xls), *.xls")
If hubopf = "False" Then MsgBox "請選取檔案": Exit Sub
AR = Split(hubopf, "\")
hubopf = AR(UBound(AR)) 'hubopf = "B.xls"隨著開啟檔名不同也可能是"C.xls"
Workbooks.Open hubopf 'Workbooks( hubopf )
如您的協助將上面的程式碼使用之後,逐行執行到
ActiveCell.FormulaR1C1 = _
"=IF(AND(RC[-1]=[hubopf]AC8E!R" & hubcn & "C2,[hubopf]AC8E!R" & hubcn & "C72>0,[hubopf]AC8E!R" & hubcn & "C72-SUM(R" & mycarw & "C11:RC[5])>0),[hubopf]AC8E!R" & hubcn & "C9)"
這裡會跳出對話框要求我選擇開啟檔案,如果不選檔案,在儲存格就會判別FALSE,選了檔案才會出現我要的結果
我發現是hubopf沒有值,所以又要求重開檔案,可是這個hubopf是一開始就宣告的,到了公式時卻又需重開檔案才有值,
我的巨集是寫在A.xls的sheet2 , 在上述公式執行前有多次切換A.xls 和 B.xls , 這個公式是在A.xls的儲存格中,
請教大大,如何才能不要持續重開檔案?
感謝
作者:
luffyzoro
時間:
2011-11-24 15:54
回復
9#
GBKEE
Sub Test()
Dim hubopf As String, AR
hubopf = Application.GetOpenFilename("Excel Files (*.xls), *.xls")
If hubopf = "False" Then MsgBox "請選取檔案": Exit Sub
AR = Split(hubopf, "\")
hubopf = AR(UBound(AR)) 'hubopf = "B.xls"隨著開啟檔名不同也可能是"C.xls"
Workbooks.Open hubopf 'Workbooks( hubopf )
Worksheets("AC8E").Cells.Select
Worksheets("AC8E").Range("A:BY").Sort Key1:=Worksheets("AC8E").Range("D2"), _
Order1:=xlAscending, Key2:=Worksheets("AC8E").Range("I2") _
, Order2:=xlAscending, Header:=xlYes
ThisWorkbook.Activate
Dim calopf As String
calopf = ThisWorkbook.Name
ActiveSheet.Cells.Select
Selection.Sort Key1:=Range("E2"), Order1:=xlAscending, Key2:=Range("C2"), _
Order2:=xlAscending, Key3:=Range("A2"), _
Order3:=xlAscending, Header:=xlYes
Cells(ActiveSheet.Rows.Count, 6).End(xlUp).Select
Selection.Offset(1, 0).Select
Workbooks(hubopf).Worksheets("AC8E").Activate
Dim hubcn As Integer, hubrwcnt As Integer
hubrwcnt = ActiveSheet.UsedRange.Rows.Count
For hubcn = 2 To hubrwcnt - 1
Workbooks(hubopf).Activate
Worksheets("AC8E").Range("BT" & hubcn).Select
If Selection.Value > 0 Then
Workbooks(calopf).Worksheets("sheet2").Activate
Dim mycarw As Integer
mycarw = ActiveCell.Row
Do
ActiveCell.FormulaR1C1 = _
"=IF(AND(RC[-1]=[hubopf]AC8E!R" & hubcn & "C2,[hubopf]AC8E!R" & hubcn & "C72>0,[hubopf]AC8E!R" & hubcn & "C72-SUM(R" & mycarw & "C11:RC[5])>0),[hubopf]AC8E!R" & hubcn & "C9)"
Selection.Value = Selection.Value
ActiveCell.Offset(1).Select
Loop Until ActiveCell.Offset(-1).Value = False
複製代碼
就是這樣子然後到公式時就一直要重開檔案
作者:
GBKEE
時間:
2011-11-24 15:56
本帖最後由 GBKEE 於 2011-11-24 16:00 編輯
回復
10#
luffyzoro
改成ActiveCell.FormulaR1C1 = _
"=IF(AND(RC[-1]=[" & hubopf & "]AC8E!R" & hubcn & "C2,[" & hubopf & "]AC8E!R" & hubcn & "C72>0,[" & hubopf & "]
AC8E!R" & hubcn & "C72-SUM(R" & mycarw & "C11:RC[5])>0),[" & hubopf& "]AC8E!R" & hubcn & "C9)"
ActiveCell.FormulaR1C1 = _
"=IF(AND(RC[-1]=[hubopf]AC8E!R" & hubcn & "C2,[hubopf]AC8E!R" &
hubcn
& "C72>0,[hubopf]AC8E!R" &
hubcn
& "C72-SUM(R" & mycarw & "C11:RC[5])>0),[hubopf]AC8E!R" &
hubcn
& "C9)"
你知道
hubcn
是變數要如此的加入變數
&
hubcn
&
同理
hubopf
是變數 也要如此做的
作者:
luffyzoro
時間:
2011-11-24 16:10
回復
12#
GBKEE
感謝GBKEE大大迅速回覆
我還沒發問前已有改過版大所教的方式,但還是執行錯誤,實在是沒輒了,只好厚臉皮的一直來這邊請教
:L
作者:
GBKEE
時間:
2011-11-24 16:55
本帖最後由 GBKEE 於 2011-11-25 16:30 編輯
回復
13#
luffyzoro
8樓: 假設我的巨集是寫在A.xls , 用A.xls開啟B.xls , 照版大的方式我的hubopf會得到
"D:\C資料夾\F資料夾\B.xls"
hubopf ="
B.xls"
[" &
hubopf
& "]
如目前磁碟機的路徑不是
D:\C資料夾\F資料夾
Excel會找不到檔案的
請你在適當的地方加入 ChDir "
D:\C資料夾\F資料夾"
移動目前磁碟機的路徑
作者:
luffyzoro
時間:
2011-11-24 17:53
本帖最後由 luffyzoro 於 2011-11-24 17:58 編輯
回復
14#
GBKEE
For hubcn = 2 To hubrwcnt - 1
Workbooks(
hubopf
).Activate
Worksheets("AC8E").Range("BT" & hubcn).Select
If Selection.Value > 0 Then
Workbooks(calopf).Worksheets("sheet2").Activate
Dim mycarw As Integer
mycarw = ActiveCell.Row
Do
ChDir "H:\My documents\專案\工作量專案"
ActiveCell.FormulaR1C1 = _
"=IF(AND(RC[-1]=[" & hubopf & "]AC8E!R" & hubcn & "C2,[" & hubopf & "]AC8E!R" & hubcn & "C72>0,[" & hubopf & "]AC8E!R" & hubcn & "C72-SUM(R" & mycarw & "C11:RC[5])>0),[" & hubopf & "]AC8E!R" & hubcn & "C9)"
Selection.Value = Selection.Value
ActiveCell.Offset(1).Select
Loop Until ActiveCell.Offset(-1).Value = False
感謝版大
但是還是一樣出問題
錯誤訊息 執行階段錯誤'1004':應用程式或物件定義上的錯誤
不好意思啊,版大
藍色那一段我看儲存格都有在hubopf所代表的檔案移動
可是到了公式那一段就出錯了
還請您幫忙看一下是否還有哪邊有問題
作者:
GBKEE
時間:
2011-11-24 20:24
回復
15#
luffyzoro
9樓的錯誤 這裡會跳出對話框要求我選擇開啟檔案, ChDir "H:\My documents\專案\工作量專案" 後9樓的錯誤消失了
15樓錯誤訊息 執行階段錯誤'1004':應用程式或物件定義上的錯誤
這程式碼 我代入變數 hubopf , hubcn, 沒有錯誤, 請檢查每一 Workbooks (hubopf) 中是否 有工作表名稱"AC8E"
ActiveCell.FormulaR1C1 = _
"=IF(AND(RC[-1]=[" & hubopf & "]AC8E!R" & hubcn & "C2,[" & hubopf & "]AC8E!R" & hubcn & "C72>0,[" & hubopf & "]AC8E!R" & hubcn & "C72-SUM(R" & mycarw & "C11:RC[5])>0),[" & hubopf & "]AC8E!R" & hubcn & "C9)"
作者:
luffyzoro
時間:
2011-11-25 04:40
回復
16#
GBKEE
請檢查每一 Workbooks (hubopf) 中是否 有工作表名稱"AC8E"
請問版大這句話的意思是指在公式中的還是說我指定的資料夾每一檔案都要有工作表"AC8E"?
我拿版大15樓的回覆公式貼回我的程式碼?仍然出現同樣的錯誤訊息
或是該公式有沒有其他的寫法?真不知道是哪裡有問題?頭快爆了>"<
我的EXCEL版本是2003有差嗎?
再次感謝
作者:
GBKEE
時間:
2011-11-25 07:35
回復
17#
luffyzoro
請檢查每一 Workbooks (hubopf) 中是否 有工作表名稱"AC8E"
=[" & hubopf & "]
AC8E
!R" & hubcn & "C2
這公式 hubopf 會是 "b.xls" ."c.xls" "d.xls" 不一定的檔案 ,
AC8E
需是這些檔案中一定有的工作表名稱
作者:
luffyzoro
時間:
2011-11-25 10:22
回復
18#
GBKEE
版大您好
再次謝謝
如此多次麻煩您,真是不好意思
我現在就只有一個"b.xls"
Workbooks(hubopf).Worksheets("AC8E").Activate
Dim hubcn As Integer, hubrwcnt As Integer
hubrwcnt = ActiveSheet.UsedRange.Rows.Count
For hubcn = 2 To hubrwcnt - 1
Workbooks(hubopf).Activate
Worksheets("AC8E").Range("BT" & hubcn).Select
If Selection.Value > 0 Then
Do
Workbooks(calopf).Worksheets("sheet2").Activate
Cells(ActiveSheet.Rows.Count, 6).End(xlUp).Select
Selection.Offset(1, 0).Select
Dim mycarw As Integer
mycarw = ActiveCell.Row
ActiveCell.FormulaR1C1 = _
"=IF(AND(RC[-1]=[" & hubopf & "]AC8E!R" & hubcn & "C2,[" & hubopf & "]AC8E!R" & hubcn & "C72>0,[" & hubopf & "]AC8E!R" & hubcn & "C72-SUM(R" & mycarw & "C11:RC[5])>0),[" & hubopf & "]AC8E!R" & hubcn & "C9)"
Selection.Value = Selection.Value
ActiveCell.Offset(1).Select
Loop Until ActiveCell.Offset(-1).Value = False
複製代碼
以上是片段的程式碼,
我想請教版大,我所想要的ActiveCell.FormulaR1C1 應該是在Workbooks(calopf).worksheets("sheet2")的儲存格之中,是不是我哪邊寫錯了,導致公式並沒在我要的儲存格內?
或是版大願意的話,我可以將檔案寄給版大幫忙看一下>"<
感謝
作者:
GBKEE
時間:
2011-11-25 12:23
回復
19#
luffyzoro
導致公式並沒在我要的儲存格內?
你這意思是
ActiveCell
的位置不對!
我註解你看看
Cells(ActiveSheet.Rows.Count, 6).End(xlUp).Select 'F欄裡最後一個資料的Cells
Selection.Offset(1, 0).Select
F欄裡最後一個資料的Cells的下一列的Cells 這就是 ActiveCell 對不對!
作者:
luffyzoro
時間:
2011-11-25 12:41
回復
20#
GBKEE
版大,是的,那個就是我要的公式所在Activecell
作者:
GBKEE
時間:
2011-11-25 13:50
回復
19#
luffyzoro
9# 是不是我哪邊寫錯了,
導致公式並沒在我要的儲存格內
?
你要的是有公式, 不要只是值 對嗎?
Selection.Value = Selection.Value
'這裡 公式被值取代 了
ActiveCell.Offset(1).Select
作者:
luffyzoro
時間:
2011-11-25 14:12
回復
22#
GBKEE
Do
Workbooks(calopf).Worksheets("sheet2").Activate
Cells(ActiveSheet.Rows.Count, 6).End(xlUp).Select
Selection.Offset(1, 0).Select
Dim mycarw As Integer
mycarw = ActiveCell.Row
ActiveCell.FormulaR1C1 = _
"=IF(AND(RC[-1]=[" & hubopf & "]AC8E!R" & hubcn & "C2,[" & hubopf & "]AC8E!R" & hubcn & "C72>0,[" & hubopf & "]AC8E!R" & hubcn & "C72-SUM(R" & mycarw & "C11:RC[5])>0),[" & hubopf & "]AC8E!R" & hubcn & "C9)"
Selection.Value = Selection.Value←
照迴圈來看還是應該先有公式取得計算後,公式才會被值取代
ActiveCell.Offset(1).Select
Loop Until ActiveCell.Offset(-1).Value = False
版大,感謝您
請問如紅字所寫的,是不是正確?
而且逐行執行是到公式那一列就錯誤了,還沒換成值就錯誤
頭痛中>"<
作者:
GBKEE
時間:
2011-11-25 15:13
回復
23#
luffyzoro
而且逐行執行是到公式那一列就錯誤了
請問Workbooks(
hubopf
)中有
AC8E
這工作表嗎?
ActiveCell.FormulaR1C1 = _
"=IF(AND(RC[-1]=[" & hubopf & "]
AC8E
!R" & hubcn & "C2,[" & hubopf & "]
AC8E
!R" & hubcn & "C72>0,[" & hubopf & "]
AC8E
!R" & hubcn & "C72-SUM(R" & mycarw & "C11:RC[5])>0),[" & hubopf & "]
AC8E
!R" & hubcn & "C9)"
作者:
luffyzoro
時間:
2011-11-25 17:21
本帖最後由 luffyzoro 於 2011-11-25 17:24 編輯
回復
24#
GBKEE
版大,有AC8E這個工作表,請看第19樓我的程式碼第1列有啟動,而且也沒出現錯誤
謝謝版大熱情回覆
作者:
GBKEE
時間:
2011-11-25 20:14
回復
19#
luffyzoro
版大願意的話,我可以將檔案寄給版大幫忙看一下
請在你個人資料 留下 Mail
作者:
luffyzoro
時間:
2011-11-28 08:59
回復
26#
GBKEE
版大您好
我已收到您的短消息
請再給我一些時間,我想把我寫的程式做一下註解,再給您幫忙
另外,我進個人資料不知要把我的mail填在哪裡耶>"<
感謝版大
作者:
luffyzoro
時間:
2011-11-30 10:55
回復
26#
GBKEE
ActiveCell.FormulaR1C1 = _
"=IF(AND(RC[-1]=
'
[" & hubopf & "]" & shan & "
'
!R" & hubcn & "C2,
'
[" & hubopf & "]" & shan & "
'
!R" & hubcn & "C72>0,
'
[" & hubopf & "]" & shan & "
'
!R" & hubcn & "C72-SUM(R" & mycarw & "C11:RC[5])>0),
'
[" & hubopf & "]" & shan & "
'
!R" & hubcn & "C9)"
版大我找到問題了
問題可能在於hubopf這個檔名是長檔名或是內有空格或其他字元
所以需要再前面再加單引號
謝謝版大多次回覆
另外, 我還是會將我的檔案寄給版大看看
歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)