Board logo

標題: [發問] 變數設定 [打印本頁]

作者: Scott090    時間: 2016-3-7 14:49     標題: 變數設定

請把陣列中的對應位置值設給變數,VBA如何做,謝謝
  1. Option Base 1
  2. Option Explicit

  3. Sub Test()

  4.     '定義變數
  5.     Dim Qref%, kWref%, COPref%, Qev_ref%, Qcd_ref%, Tchws%, Tchwr%, Tcws%, Tcwr%
  6.     Dim a0%, a1%, a2%, a3%, a4%, a5%
  7.     Dim ar
  8.    
  9.     '變數名稱陣列,   說明: 名稱在陣列中的位置是會變的
  10.     ar = Array("Qref", "kWref", "COPref", "Qev_ref", "Qcd_ref", "Tchws", "Tchwr", "Tcws", "Tcwr", _
  11.                 "a0", "a1", "a2", "a3", "a4", "a5")
  12.    
  13.     '把變數名稱在陣列中的位置設給變數
  14.    
  15.     '(如何寫VBA可以得到期望結果)'?
  16.     'Qref = 1
  17.     'kWref = 2
  18.     'COPref = 3
  19.     'Qev_ref = 4
  20.     'Qcd_ref = 5
  21.    
  22.     '   .
  23.     '   .
  24.     '   .
  25.     'a5 = 15
  26.    
  27.    
  28. End Sub
複製代碼

作者: stillfish00    時間: 2016-3-7 15:06

本帖最後由 stillfish00 於 2016-3-7 15:25 編輯

回復 1# Scott090
這樣?
Qref = Application.Match("Qref", ar, 0)
kWref = Application.Match("kWref", ar, 0)
作者: Scott090    時間: 2016-3-7 18:23

回復 2# stillfish00


    謝謝大大的解惑,答案正是所要的,非常感恩

再請教,
假如事先沒變數設定,是否能從名稱陣列中分離出 使成各個變數並賦于在陣列中的位置值?
作者: stillfish00    時間: 2016-3-7 19:01

本帖最後由 stillfish00 於 2016-3-7 19:02 編輯

回復 3# Scott090
沒辦法吧 , 除非全用code寫code?
是說你這樣變數的名稱放在Array有啥好處嗎,奇怪的用法。
作者: Scott090    時間: 2016-3-8 07:35

回復 4# stillfish00

非結構化性資料表欄位多,做計算的程式易失去可讀性而混亂;
例如:
       AR(i,j) 的 j 代表欄位,欄位多了 ,j 只是一個數字概念,沒有名詞意義;當然,數字用來做迴圈很重要
       Cells(i,"B").offset(,j) 一樣的意思

假如能用欄位名稱當變數 j, 則是:
     AR(i,欄位名稱)
     cells(i,"B").offset(,欄位名稱)

以上請教 大大  有沒有其他的解法

謝謝
作者: ML089    時間: 2016-3-8 08:53

回復 1# Scott090
  1. Option Base 1
  2. Option Explicit

  3. Sub Test1()

  4. '定義變數
  5.     Dim Qref%, kWref%, COPref%, Qev_ref%, Qcd_ref%, Tchws%, Tchwr%, Tcws%, Tcwr%
  6.     Dim a0%, a1%, a2%, a3%, a4%, a5%
  7.     Dim ar, x
  8.     Dim D As Object
  9.     Set D = CreateObject("Scripting.Dictionary")

  10.     '變數名稱陣列,   說明: 名稱在陣列中的位置是會變的
  11.     ar = Array("Qref", "kWref", "COPref", "Qev_ref", "Qcd_ref", "Tchws", "Tchwr", "Tcws", "Tcwr") ', "a0", "a1", "a2", "a3", "a4", "a5")

  12.     '把變數名稱在陣列中的位置設給變數

  13.     '(如何寫VBA可以得到期望結果)'?
  14.     'Qref = 1
  15.     'kWref = 2
  16.     'COPref = 3
  17.     'Qev_ref = 4
  18.     'Qcd_ref = 5

  19.     '   .
  20.     '   .
  21.     '   .
  22.     'a5 = 15
  23.     For Each x In ar
  24.         D(x) = Application.Match(x, ar, 0)
  25.     Next

  26.     [E1:F1].Resize(D.Count) = Application.Transpose(Array(D.keys, D.items))
  27.    
  28.     For Each x In D.keys
  29.         Debug.Print x, D(x)
  30.     Next
  31. End Sub
複製代碼

作者: stillfish00    時間: 2016-3-8 09:30

本帖最後由 stillfish00 於 2016-3-8 09:34 編輯

回復 5# Scott090
處理資料欄位標題,如果需要 我也是採類似ML版主的做法
建立一個字典來對應 : 名稱 -> 欄號
這樣你就能像這樣去使用 : Cells(i,"B").offset(,D("Qref"))
不用宣告 Qref 變數

當然,通常資料欄位都是固定位置時,直接用Const定常數就好。
作者: Scott090    時間: 2016-3-8 10:26

回復 6# ML089


    謝謝大大的回應
抱歉,我沒把問題描述清楚

問題的目標是要 賦值 給 變數,不只是字串在陣列中的位置
例如:
          Qref =1,因為字串 "Qref" 在 陣列的位置 是 1
          Qev_ref = 4, 因為字串 "Qev_ref" 在陣列的位置是 4
作者: Scott090    時間: 2016-3-8 10:42

回復 7# stillfish00


之所以發想要以動態的方式處理,
    就是因為欄位很多且位置會變;直接用 Const 會拉得很長,資料位置變動時也不易更改

提議用 ML 版主的字典法 D("Qref") 應可行

測試後再報告

謝謝
作者: GBKEE    時間: 2016-3-8 16:00

回復 9# Scott090
試試看
  1. Option Base 1
  2. Option Explicit
  3. Sub Test()
  4.     '定義變數
  5.     '  Dim Qref%, kWref%, COPref%, Qev_ref%, Qcd_ref%, Tchws%, Tchwr%, Tcws%, Tcwr%
  6.     '  Dim a0%, a1%, a2%, a3%, a4%, a5%
  7.     Dim ar, i As Integer
  8.    
  9.     '變數名稱陣列,   說明: 名稱在陣列中的位置是會變的
  10.     ar = Array("Qref", "kWref", "COPref", "Qev_ref", "Qcd_ref", "Tchws", "Tchwr", "Tcws", "Tcwr", _
  11.                 "_a0", "_a1", "_a2", "_a3", "_a4", "_a5")  '
  12.     For i = 1 To UBound(ar)
  13.         ActiveSheet.Names.Add ar(i), i     '在作用中工作表上定義名稱,給值
  14.     Next
  15.     MsgBox Cells(i, "B").Offset(, [Qref]).Address
  16. End Sub
複製代碼

作者: Scott090    時間: 2016-3-8 17:21

回復 10# GBKEE
回復 9# stillfish00
回復 6# ML089


    謝謝各位大大的幫忙
經測試後,使用 字典法 的 D("Qref") 或 名稱定義 的 [Qref] 替代 變數 Qref 都可以解決問題

再次感恩
作者: Scott090    時間: 2016-3-31 07:11

回復 11# Scott090

有看到 clio 的回文通知但看不到全文

請clio 版大再回文

謝謝




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