Board logo

標題: [發問] VBA 問題求教 [打印本頁]

作者: ahsiek    時間: 2013-4-9 15:10     標題: VBA 問題求教

[attach]14600[/attach]

請教VBA達人們

在附加檔案裡,excel檔,裡面是所寫程式的某部份
我在【Sheet台選】中增加了一個CommandButton1,名為【計算】,也寫好程式碼,按下就會計算【Sheet1台選】裡的程式。
程式碼如下:
Private Sub CommandButton1_Click()
   ' MsgBox Range("n5").Value
   Dim i As Integer
   For i = 5 To 14
        Call Macro1(i)
   Next
End Sub

但,我想在工作表1中也增加一個CommandButton1,也名為【計算】
如何寫程式碼,當我按下工作表1的CommandButton1時,也可以趨動【Sheet台選】裡的程式呢?

另外還有個問題

若是excel檔裡的履約價因連結而變動時,能不能寫程式碼,讓我不用【手動】的方式就能執行【計算】的功能呢?
目前有看到這個程式碼,如下:
Private Sub Worksheet_Change(ByVal Target As Range)
在其內編碼驅動程序(原按鍵指定程序)即可。
End Sub

請問這個要寫在哪裡?可行嗎?

我是自修的,所以想問問各位,麻煩幫個忙,謝謝。
作者: GBKEE    時間: 2013-4-10 16:11

回復 1# ahsiek
圖解

[attach]14617[/attach]

[attach]14618[/attach]
作者: ahsiek    時間: 2013-4-11 10:07

回復 2# GBKEE


非常謝謝你,這個方法可行。

但又出現了新的問題
當我的工作表裡的值不是透過DDE的更新而變動時,這個方法就無法自動計算了

我的意思是說原本我在工作表1是用DDE連結現貨或履約價的數值,當這些數值更新時,就透過這個程式碼可以自動計算
後來我用工作表2來計算這些值,然後直接連結到工作表1的現貨或履約價的值裡,卻發現工作表1的自動計算不會動了
除非我直接用手動的方式按下計算的button才會計算
我想請問哪裡出錯了,不能用這個程式碼來改嗎?

麻煩了,謝謝。
作者: GBKEE    時間: 2013-4-11 18:32

回復 3# ahsiek
你的意思是說原本工作表1是用DDE連結現貨或履約價的數值,DDE連結現貨或履約價的數值,現改放在工作表2計算後,在工作表1的儲存格用公式傳回工作表2這些值.
  1. Option Explicit
  2. ' ** 工作表內有公式的儲存格:公式的數值有變動,使用此工作表的預設事件
  3. Private Sub Worksheet_Calculate()
  4.   Dim i As Integer
  5.   Application.EnableEvents = False
  6.   'EnableEvents 屬性  如果指定物件能觸發事件,則本屬性為 True。讀/寫 Boolean。
  7.    For i = 5 To 14
  8.         Call Macro1(i)  
  9.    Next
  10.     ''' 程式碼
  11.     ''' 程式碼
  12.     ''' 程式碼
  13.    Application.EnableEvents = True
  14. End Sub
複製代碼

作者: ahsiek    時間: 2013-4-30 14:39

不好意思,太久沒有上線查看,真的很謝謝GBKEE大大的回應
我有試過你po的方式,但還是沒有反應。

現在我重新想了方式   附件如旁: [attach]14828[/attach]
若我在【台選】,寫好了以下的程式碼:
Private Sub CommandButton1_Click()
   ' MsgBox Range("n5").Value
   Dim i As Integer
   For i = 5 To 14
        Call Macro1(i)
  
   Next

   
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
   ' MsgBox Range("n5").Value
   Dim i As Integer
   For i = 5 To 14
        Call Macro1(i)
  
   Next

End Sub

然後,把在【台選】的儲存格L5和【工作表1】的儲存格B2做連結
即【台選】儲存格L5  = 【工作表1】儲存格B2
當我把【工作表1】的儲存格B2 換個數字時
能不能就讓【台選】的儲存格L5因為數字變動,而會自動運算以上所寫的程式碼呢?

麻煩大大幫個忙,想想看。是不是要多什麼程式碼才能做到?還是說不能這樣做呢?
不論如何,都非常感謝大大的幫忙。:loveliness:
作者: GBKEE    時間: 2013-5-1 10:57

本帖最後由 GBKEE 於 2013-5-2 15:17 編輯

回復 5# ahsiek
【台選】儲存格L5  =工作表1!B2
當【工作表1】儲存格B2 有變更 會引發 【台選】的重算事件
  1. Private Sub Worksheet_Calculate()   '【台選】的重算事件程式碼
  2.   Dim i As Integer
  3.   Application.EnableEvents = False  '停止 觸發事件
  4.   For i = 5 To 14
  5.         Call Macro1(i)
  6.    Next
  7.    Application.EnableEvents = True  '恢復 觸發事件
  8. End Sub
複製代碼
  1. Sub Macro1(r As Integer) 'r為參數代表列號.integer為整數型態
  2.     With Sheets("台選")
  3.         .Range("M" & r).GoalSeek Goal:=.Range("N" & r).Value, ChangingCell:=.Range("D" & r)
  4.     End With
  5. End Sub
複製代碼

作者: ahsiek    時間: 2013-5-1 14:20

真的非常謝謝GBKEE大大的幫忙
是可行的,終於能解決,真的好開心呢!!
原來模組那裡也要寫,難怪總是卡在那裡。
再次感謝GBKEE大大的幫忙。
作者: ahsiek    時間: 2013-5-2 13:03

不好意思,再麻煩GBKEE大大

若我不只有【台選】,我還有【台選2】,其內容和【台選】是一樣的,裡面的公式有些許不一樣而已,但大致相同。

所以我可以直接複製【台選】的程式碼貼在【台選2】裡嗎?如下:
Private Sub Worksheet_Change(ByVal Target As Range)
   ' MsgBox Range("n5").Value
   Dim i As Integer
   For i = 5 To 14
        Call Macro1(i)
        
   Next
End Sub


Private Sub Worksheet_Calculate()   '重算事件程式碼
  Dim i As Integer
  Application.EnableEvents = False  '停止 觸發事件
  For i = 5 To 14
        Call Macro1(i)
   Next
   Application.EnableEvents = True  '恢復 觸發事件
End Sub

而在模組裡的module2的程式碼可以這樣寫嗎?

Sub Macro1(r As Integer) 'r為參數代表列號.integer為整數型態
        With Sheets("台選")
            .Range("M" & r).GoalSeek Goal:=.Range("N" & r).Value, ChangingCell:=.Range("D" & r)
        End With
With Sheets("台選2")
            .Range("M" & r).GoalSeek Goal:=.Range("N" & r).Value, ChangingCell:=.Range("D" & r)
        End With

    End Sub

是不是這樣不行,因為我這樣寫時,EXCEL就會當掉,或是卡卡的。
可以麻煩殉GBKEE大大能再幫我看一下嗎?
謝謝你。
作者: GBKEE    時間: 2013-5-2 15:26

本帖最後由 GBKEE 於 2013-5-2 15:28 編輯

回復 8# ahsiek

'【台選】,【台選 2】 的事件程序
  1. Option Explicit
  2. Private Sub Worksheet_Change(ByVal Target As Range)
  3.    Dim i As Integer
  4.    Application.EnableEvents = False  '停止 觸發事件
  5.    For i = 5 To 14
  6.         Call Macro1(i, Me)  'ME 指物件模組本身        
  7.    Next
  8.    Application.EnableEvents = True  '恢復 觸發事件
  9. End Sub
  10. Private Sub Worksheet_Calculate()   '重算事件
  11.   Dim i As Integer
  12.   Application.EnableEvents = False  '停止 觸發事件
  13.   For i = 5 To 14
  14.         Call Macro1(i, Me)
  15.    Next
  16.    Application.EnableEvents = True  '恢復 觸發事件
  17. End Sub
複製代碼
  1. '程序新增接收參數 型態為Worksheet物件
  2. Sub Macro1(r As Integer, Sh As Worksheet) 'r為參數代表列號.integer為整數型態
  3.     '' Macro1 Macro''
  4.     With Sh
  5.          .Range("M" & r).GoalSeek Goal:=.Range("N" & r).Value, ChangingCell:=.Range("D" & r)
  6.     End With
  7. End Sub
複製代碼

作者: ahsiek    時間: 2013-5-6 08:57

再次謝謝GBKEE大大
我試過,是可行的。

但,因為我用在主要的檔裡,像【台選】的工作表有六個之多
當我只先更新二個工作表的程式後,沒想到excel就當掉了。
重新打開也跑不動了
可能是我需要用的迴圈太多了,以致於excel跑不動而當掉。
我再想想有什麼方法好了
再次謝謝GBKEE大大
作者: GBKEE    時間: 2013-5-6 10:58

回復 10# ahsiek
像【台選】的工作表有六個之
可用物件類別模組 減少 程式碼的建立




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