返回列表 上一主題 發帖

請教由巨集錄制的公式如何轉換為VBA公式,並且儲存格可以是變數

請教由巨集錄制的公式如何轉換為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比較好

本帖最後由 luffyzoro 於 2011-11-22 02:59 編輯

敬請指點.rar (34.38 KB) 回復 2# Hsieh

版大您好
感謝您熱心回覆
小弟因工作需要,因此嚐試寫VBA
寫了一堆自己看了都很複雜的程式碼,寫到卡住了
懇請版大開釋
該用什麼寫法才能完成小弟想要達成的完成檔
其中有附上小弟寫的
懇請版大指點

TOP

回復 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
但是卻出現語法錯誤?

請問哪裡需要修正?

感謝

TOP

本帖最後由 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這個變數時有問題?

感謝大大

TOP

回復 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")?

感謝

TOP

回復 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的儲存格中,
請教大大,如何才能不要持續重開檔案?

感謝

TOP

回復 9# GBKEE
  1. Sub Test()
  2.     Dim hubopf As String, AR
  3.     hubopf = Application.GetOpenFilename("Excel Files (*.xls), *.xls")
  4.     If hubopf = "False" Then MsgBox "請選取檔案": Exit Sub
  5.     AR = Split(hubopf, "\")
  6.     hubopf = AR(UBound(AR))   'hubopf = "B.xls"隨著開啟檔名不同也可能是"C.xls"
  7.     Workbooks.Open hubopf     'Workbooks( hubopf )
  8.     Worksheets("AC8E").Cells.Select
  9.     Worksheets("AC8E").Range("A:BY").Sort Key1:=Worksheets("AC8E").Range("D2"), _
  10.     Order1:=xlAscending, Key2:=Worksheets("AC8E").Range("I2") _
  11.     , Order2:=xlAscending, Header:=xlYes
  12.     ThisWorkbook.Activate
  13.     Dim calopf As String
  14.     calopf = ThisWorkbook.Name
  15.     ActiveSheet.Cells.Select
  16.     Selection.Sort Key1:=Range("E2"), Order1:=xlAscending, Key2:=Range("C2"), _
  17.     Order2:=xlAscending, Key3:=Range("A2"), _
  18.     Order3:=xlAscending, Header:=xlYes
  19.     Cells(ActiveSheet.Rows.Count, 6).End(xlUp).Select
  20.     Selection.Offset(1, 0).Select
  21.     Workbooks(hubopf).Worksheets("AC8E").Activate
  22.   Dim hubcn As Integer, hubrwcnt As Integer
  23.    hubrwcnt = ActiveSheet.UsedRange.Rows.Count
  24.   For hubcn = 2 To hubrwcnt - 1
  25.     Workbooks(hubopf).Activate
  26.     Worksheets("AC8E").Range("BT" & hubcn).Select
  27.    If Selection.Value > 0 Then
  28.       Workbooks(calopf).Worksheets("sheet2").Activate
  29.       Dim mycarw As Integer
  30.       mycarw = ActiveCell.Row
  31.       Do
  32.         ActiveCell.FormulaR1C1 = _
  33.         "=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)"
  34.       Selection.Value = Selection.Value
  35.         ActiveCell.Offset(1).Select
  36.       Loop Until ActiveCell.Offset(-1).Value = False
複製代碼
就是這樣子然後到公式時就一直要重開檔案

TOP

回復 12# GBKEE


    感謝GBKEE大大迅速回覆

我還沒發問前已有改過版大所教的方式,但還是執行錯誤,實在是沒輒了,只好厚臉皮的一直來這邊請教

:L

TOP

本帖最後由 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所代表的檔案移動
可是到了公式那一段就出錯了
還請您幫忙看一下是否還有哪邊有問題

TOP

回復 16# GBKEE

請檢查每一  Workbooks (hubopf) 中是否 有工作表名稱"AC8E"

請問版大這句話的意思是指在公式中的還是說我指定的資料夾每一檔案都要有工作表"AC8E"?

我拿版大15樓的回覆公式貼回我的程式碼?仍然出現同樣的錯誤訊息

或是該公式有沒有其他的寫法?真不知道是哪裡有問題?頭快爆了>"<

我的EXCEL版本是2003有差嗎?

再次感謝

TOP

        靜思自在 : 是非當教育,讚美作警惕。
返回列表 上一主題