Board logo

標題: IF...判斷加總問題 [打印本頁]

作者: 074063    時間: 2015-7-31 21:53     標題: IF...判斷加總問題

本帖最後由 074063 於 2015-7-31 21:57 編輯

請問下列函數如何寫成VBA

    G3=IF(C3="","",C3+F3)     下拉複製公式     
    G4=IF(C3-G3=0,"結","")    下拉複製公式  (格式化儲存格, 若G4="結"   (粗體藍字)
作者: koo    時間: 2015-8-1 11:09

請用錄製巨集方式再來修改範圍
  1. Sub 巨集3()
  2.     Range("G1").Select
  3.     ActiveCell.FormulaR1C1 = "=IF(RC[-4]="""","""",RC[-4]+RC[-1])"
  4.     Range("G1").Select
  5.     Selection.AutoFill Destination:=Range("G1:G4"), Type:=xlFillDefault
  6.     Range("G1:G4").Select
  7. End Sub
複製代碼
把範圍G4改變數
x=[C65536].end(xlup).Row
Range("G1:G" & x)
  1. Sub 巨集3()
  2. Dim x As Integer
  3.     x = [C65536].End(xlUp).Row
  4.     Range("G1").FormulaR1C1 = "=IF(RC[-4]="""","""",RC[-4]+RC[-1])"
  5.     Range("G1").AutoFill Destination:=Range("G1:G" & x), Type:=xlFillDefault
  6. End Sub
複製代碼

作者: koo    時間: 2015-8-1 11:23

用錄製了解程序再來修改或是直接使用
  1. Sub test()
  2. For i = 1 To [C65536].End(xlUp).Row
  3.     If Cells(i, 3) = "" Then
  4.         Cells(i, 7) = ""
  5.     Else
  6.         Cells(i, 7) = Cells(i, 3) + Cells(i, 6)
  7.         Cells(i, 7).Font.Color = vbBlue
  8.         Cells(i, 7).Font.Bold = True
  9.     End If
  10. Next
  11. End Sub
複製代碼

作者: 074063    時間: 2015-8-1 21:47

回復 3# koo


    請問VBA能像函數一樣即時自動運算嗎
作者: lpk187    時間: 2015-8-2 00:00

回復 4# 074063

VBA皆是利用事件來啟動程式的,所以當然可以做即時運算,只是看你用什麼樣的事件來啟動罷了,
我以 G3=IF(C3="","",C3+F3)     下拉複製公式  這個公式來做例子,可以利用工作表事件"儲存格變更事件"來實現如下列中的程式
程式說明:當你在C欄或則F欄的第3列起,輸入數字(變更儲存格內容)就會啟動這個事件來實現我們要的目的。
但它必須放在工作表事件簿中(如下圖例放置的位置)
  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2. If Target.Row > 2 And Target.Column = 6 Or Target.Column = 3 Then'
  3.     If Cells(Target.Row, 3) = "" And Cells(Target.Row, 6) = "" Then'當C欄或F欄皆空白時
  4.         Cells(Target.Row, "G") = "" '則G欄為空白
  5.     Else
  6.         Cells(Target.Row, "G") = Cells(Target.Row, "C") + Cells(Target.Row, "F")'否則C欄+F欄
  7.     End If
  8. End If
  9. End Sub
複製代碼
[attach]21617[/attach]
作者: 074063    時間: 2015-8-2 20:58

本帖最後由 074063 於 2015-8-2 21:10 編輯

回復 5# lpk187

If Cells(Target.Row, 3) = "" And Cells(Target.Row, 6) = "" Then'當C欄或F欄皆空白時

請問target.row 不是列的意思嗎 @@

如果F欄也是公式帶出值的話, G欄好像就沒有作用
作者: lpk187    時間: 2015-8-2 22:04

本帖最後由 lpk187 於 2015-8-2 22:09 編輯

回復 6# 074063


    target.row 是列沒錯,但你忽略了"3"是C欄!6是F欄。=>Cells( target.Row, target.Column)target.Column是3或6
target是作用儲存格,假設你在C3鍵入數值時,target就是那就作用的儲存格,VBA若用程式計算的話並不會有公式顯示在儲存格中(G3),而是會直接顯示計算過後的值

如果F欄也是公式帶出值的話, G欄好像就沒有作用
Ex:1.F欄是沒有公式的,那只是用程式判斷是否為空白,
      2.G欄若沒作用可能是你沒按照我圖所示放在該放的地方!

下面是回答1樓的問題
另外VBA是用來幫你自動化或者是幫你執行複雜工作,若 用來寫函數,除非在儲存格中的函數會因某種因素變化時,否則是沒有意義的!
如下圖的選項 >公式中的紅框中為什麼會會有活頁簿計算的選項,這是為了當在工作表中函數很多很多的情況下讓你選擇是不是要自動或者手動,但VBA卻沒有這個問題它只幫你做程式的流程而已,而不會全部走一次!
[attach]21629[/attach]
作者: lpk187    時間: 2015-8-2 22:19

本帖最後由 lpk187 於 2015-8-2 22:31 編輯

回復 6# 074063


    我上一樓的回答好像有些誤會你的意思!
If Cells(Target.Row, 3) = "" And Cells(Target.Row, 6) = "" Then'當C欄或F欄皆空白時
...
如果F欄也是公式帶出值的話, G欄好像就沒有作用
來說
若是F欄有公式的話,And Cells(Target.Row, 6) = "" 是可以刪除的!

當程式設計師在寫程式時,大部份都會依照整個工作表或者擴大到整個活頁簿來做考量,而不會只用單一函數就當成基礎,考慮的方式不同,執行後也會因考慮的不同而有不同的結果。
就像這個誤解一樣,我在寫這程式時想到G3=IF(C3="","",C3+F3),C3是空白或非空白,而不知道F3有沒有公式,但我為了補足考慮的不周而寫下And Cells(Target.Row, 6) = ""
所以最後建議你若有問題時可以上傳你的部份檔案來,好讓要解答的人有所因應!也會更周全的!
作者: 074063    時間: 2015-8-2 23:45

回復 8# lpk187


    感謝大大解答, 這個部份我再練習一下 :D
作者: 074063    時間: 2015-8-3 00:06

本帖最後由 074063 於 2015-8-3 00:09 編輯

[attach]21631[/attach]回復 8# lpk187


    附檔給大大參考, 另詢問若資料多時, 使用函數也多速度會變慢...用VBA處理會不會比較好
作者: lpk187    時間: 2015-8-3 20:30

回復 10# 074063

試試看吧!
    [attach]21633[/attach]
作者: 074063    時間: 2015-8-3 22:33

回復 11# lpk187


    讚!測試沒問題,vba寫法大致上都了解 :D
 
 感謝大大不勝其煩的指導 ^__^
作者: 074063    時間: 2015-8-3 22:53

回復 11# lpk187


    不好意思, 請問一下大大為什麼誤KEY IN資料在12列以上也會運算呢
作者: lpk187    時間: 2015-8-3 23:01

回復 13# 074063


    誤KEY IN資料在12列以上也會運算呢
不懂?你原公式不是大於12列以上都要運算嗎?
作者: 074063    時間: 2015-8-3 23:38

回復 14# lpk187


    應該是說12列以下...><[attach]21634[/attach]
作者: lpk187    時間: 2015-8-3 23:48

回復 15# 074063

這樣再試試
    [attach]21635[/attach]
作者: 074063    時間: 2015-8-4 00:37

回復 16# lpk187


    請問..這些是代表什麼
    Target.Row > 11 And Target.Column = 18 Or _
    Target.Row > 11 And Target.Column = 20 Or _
    Target.Row > 11 And Target.Column = 21 Then
    aa = Target.Row
    aa1 = Target.Column
作者: lpk187    時間: 2015-8-4 07:23

回復 17# 074063

請參考VBA說明:Worksheet.Change 事件
及善用區域變數視窗觀看,就知道那是什麼意思了!
作者: 准提部林    時間: 2015-8-23 10:24

Private Sub Worksheet_Change(ByVal Target As Range)
Dim r&, t$, c
With Target
  If .Count > 1 Or .Row < 12 Then Exit Sub Else r = .Row
  If Application.Mode(Array(.Column, 7, 18, 20, 21, 0, 0)) = 0 Then Exit Sub
End With

On Error GoTo 1
Application.EnableEvents = False
If Cells(r, "G") = "" Then Cells(r, "V").Resize(1, 3) = "": GoTo 1

Cells(r, "V") = Cells(r, "R") + Cells(r, "T") + Cells(r, "U")
Cells(r, "W") = Cells(r, "G") - Cells(r, "V")
If Cells(r, "W") = 0 Then t = "結": c = 41
If Cells(r, "V") > Cells(r, "G") Then t = "資料錯誤": c = 0

Cells(r, "X") = t
Cells(r, "X").Font.ColorIndex = c
1: Application.EnableEvents = True
End Sub




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)