返回列表 上一主題 發帖

[發問] 如何加資料

這個dictionary究竟是什麼東西? 有什麼作用? 感覺很神秘,一般vba書都未必提及
80 字節以內
不支持自定義 Discuz! 代碼

TOP

本帖最後由 FAlonso 於 2011-1-4 20:26 編輯
  1. Sub abc()
  2. Dim myrange As Range, mystring(), count()
  3. Dim i, j, k As Integer
  4. Set myrange = Range("A1:D" & Range("A1").End(xlDown).Row)   '計算字母串的總範圍
  5. i = myrange.Cells.count / 4        '計算字母串的列數

  6. ReDim mystring(i)          '把mystring的array調較至字母串列數
  7. ReDim count(i)             '每一個字母串均設有一個計數器

  8. For j = 1 To i
  9. count(j) = 1   '每個字串均出現一次,所以設計數器為1
  10. Next

  11. For j = 1 To i      
  12. For k = 1 To 4
  13. mystring(j) = mystring(j) + myrange.Cells(j, k)   '把字串輸入mystring
  14. Next   '如mystring(1)是ASDF,mystring(2)是ASSS (請參考樓主excel的字母)
  15. Next

  16. For j = 1 To i - 1
  17. For k = j + 1 To i

  18. If count(j) = 0 Then
  19. Exit For                      '計數器為0,即重覆字母刪掉,不需再檢查
  20. End If

  21. If mystring(j) = mystring(k) Then     '比較mystring array中的字母串
  22. mystring(k) = vbnullstring   '把重覆的字母幹掉
  23. count(j) = count(j) + 1      '相同的話,計數器加1
  24. count(k)=0   '將重覆的字母的計數器給關掉
  25. End If  
  26. Next                                                
  27. Next     

  28. Range("H1").Select
  29. For j = 1 To i
  30. If mystring(j) <> vbNullString Then       '不是vbnullstring便抄錄在H欄
  31. ActiveCell.Value = Cells(j, 1)
  32. ActiveCell.Offset(, 1).Value = Cells(j, 2)
  33. ActiveCell.Offset(, 2).Value = Cells(j, 3)
  34. ActiveCell.Offset(, 3).Value = Cells(j, 4)
  35. ActiveCell.Offset(, 4).Value = count(j)
  36. ActiveCell.Offset(1).Activate
  37. End If
  38. Next

  39. End Sub
複製代碼
希望高手評評我這個macro
80 字節以內
不支持自定義 Discuz! 代碼

TOP

我做了一個完整的程式,樓主可以試試,大家也可給意見
寫得真慢,40幾行花了一天時間
80 字節以內
不支持自定義 Discuz! 代碼

TOP

回復  basarasy
這是很直觀的代碼
Hsieh 發表於 2011-1-3 22:50


兩次使用application.transpose有點難解,數學上應該沒轉變,所謂的"標準二維陣列"是什麼
80 字節以內
不支持自定義 Discuz! 代碼

TOP

本帖最後由 FAlonso 於 2011-1-8 20:25 編輯

關於transpose問題....

例如excel有如下排列
    A    B    C    D
1  r
2  e
3  s
4  t

將一個column的字連串:
transpose一次

結果是r,e,s,t
  1. Sub abc()
  2. Dim mystring
  3. mystring = Join(Application.Transpose(Range("A1:a4").Value), ",")  '注意這裡是一個column串

  4. Range("A10").Value = mystring

  5. End Sub
複製代碼
將一個row的字連串:
transpose二次

  A    B    C    D
1  r   t    u    i
  1. Sub abc()
  2. Dim mystring
  3. mystring = Join(Application.Transpose(Application.Transpose(Range("A1:D1"))), ",") '注意這裡是一個row串

  4. Range("A10").Value = mystring

  5. End Sub
複製代碼
結果是r,t,u,i

今日做了一點詳細研究,是土法大鍊鋼
先把以下程式抄進VBA
  1. Sub check()
  2. Dim ar As Variant
  3. Dim i As Integer

  4. Set ar = [a1:a4]   'try [a1:d1] later

  5. For i = 1 To 6
  6. ar = Application.Transpose(ar)
  7. Next

  8. Set ar = Nothing

  9. End Sub
複製代碼
打開檢視->區域變數視窗,再按F8,逐行執行,觀察ar陣的資料

先看[a1:a4],一個column的range
是一個2D陣列(看紅色圈子), variant(1 to 4,1 to 1)

transpose一次後,變成了一個1D陣列, variant(1 to 4),這個是可以進入join()程式的東東

不論再如何transpose,都只會重覆variant(1 to 4,1 to 1) -> variant(1 to 4) -> variant(1 to 4,1 to 1) 這個循環

再看[a1:d1](自己把程式修改),一個row的range
是一個2D陣列, variant(1 to 1,1 to 4),這裡不再print screen了,大家自己看看
transpose一次後,變成另外一個2D陣列,叫variant(1 to 4,1 to 1),這樣是不能進入join程式
transpose第二次,便變了variant(1 to 4),可以了!
但之後無論怎transpose,都只會重覆variant(1 to 4,1 to 1) -> variant(1 to 4) -> variant(1 to 4,1 to 1) 這個循環,永遠不會變回variant(1 to 1,1 to 4)這個設定

打個比喻,就等如一個2-D row的陣列,首先變了"類似"2-D column的形態,再變1-D array
而2-D column就馬上變了1-D array
這樣應該能夠解釋為什麼row要transpose多一次,但row為什麼要首先變成column形,不要問我

最後d1.items那行
看以下例子
  1. Dim myrange As Range
  2. Dim i As Integer, k
  3. Set myobject = CreateObject("scripting.dictionary")

  4. myobject("A") = Array(1, 2)
  5. myobject("B") = Array(4, 5)
  6. myobject("C") = Array(7, 8)

  7. Set myrange = Worksheets("sheet2").Range("A1").Resize(3, 2)

  8. k = myobject.items
  9. k = Application.Transpose(Application.Transpose(k))
  10. myrange = k
複製代碼
在完成myobject配置後,區域變數的顯示指該物件尚未是array(沒有那些variant(x,y),純粹是很散的架構)
把myobject.items叫出來,便看到k有variant(0,2)的1D形態(3個索引,"A","B","C")
打開k的"+"鍵,會看到k(0),k(1),k(2)各自都有variant(0,1)的1D形態(即每個索引中的兩個數字的表示)
transpose()一次,便會成一個variant(1 to 2,1 to 3)的2D陣列
其實此時已經可以貼上格子囉!試把resize(3,2)變成(2,3)看看!
不過因為我們想排成
      A       B
1    1       2
2    4       5
3   7        8
所以再transpose一次而已
80 字節以內
不支持自定義 Discuz! 代碼

TOP

回復 19# Hsieh
那麼正確的維數其實是怎樣定義? 想來想去都想不通
在我的示範,Range("A1:A4")算不算是一個陣列?
為什麼打直的格子,一次transpose就可以,打橫的要兩次? 我試過打直的用兩次transpose,會有錯誤出現

還有
  1. d(mystr) = d(mystr) + A.Offset(, 4).Value
複製代碼
這句是怎解釋,為什麼可以作累加的作用
是否dictionary自動就是array,不需declare(即像普通的變數要作x()這樣的宣告))?

希望H大解答
80 字節以內
不支持自定義 Discuz! 代碼

TOP

第二個問題先擱下不表
第三個問題是否指先把mystr注冊在dictionary的index,d(mystr),而該index的default資料為 = 0(即 d(mystr)=0), 再引以offset(,4)計數?還有dictionary照理說應該是幾D array?

感覺愈來愈近真相!
80 字節以內
不支持自定義 Discuz! 代碼

TOP

回復 26# Hsieh
多謝H大指點,現在終於完全解通了
另外在#18,我新增了一些筆記,希望以後對他人有用
80 字節以內
不支持自定義 Discuz! 代碼

TOP

        靜思自在 : 【做人的開始】每一天都是故人的開始,每一個時刻都是自己的警惕。
返回列表 上一主題