返回列表 上一主題 發帖

原資料如何用字典拆分,入不連續的欄位

原資料如何用字典拆分,入不連續的欄位

請問這一段如何
Sub test() '字典與數組
Dim arr
    Set d = CreateObject("scripting.dictionary")
    Dim lastrow&
    lastrow = Sheet2.Cells(Rows.Count, 1).End(xlUp).Row
    arr = Sheet3.Range("a1:h" & lastrow)
    For i = 2 To UBound(arr)
'        d(arr(i, 1)) = Array(arr(i, 2), arr(i, 3), arr(i, 4), arr(i, 5), arr(i, 6), arr(i, 7), arr(i, 8))
        d(arr(i, 1)) = Array(arr(i, 2), arr(i, 3), arr(i, 4), arr(i, 6), arr(i, 7), arr(i, 8))
    Next
    For Each Rng In Range("a2:a" & Cells(Rows.Count, 1).End(xlUp).Row)
        Rng.Offset(0, 1).Resize(1, 8) = d(Rng.Value)
    Next
End Sub

字典1070913.zip (12.99 KB)

希望支持!

回復 21# s7659109

不用字典物件
  1. Option Explicit
  2. Sub Ex()
  3.     Dim Rng As Range, S As Variant, Ar(), Arr(), i As Long, ii As Integer
  4.     With Sheets("test")
  5.         Set Rng = .Range("b1:" & .Cells(1, Columns.Count).End(xlToLeft).Address) 'test上的欄位
  6.         Ar = Application.Transpose(Application.Transpose(Rng))
  7.         For i = 1 To Rng.Cells.Count
  8.             S = Application.Match(Rng(i), Sheets("data").Rows(1), 0)
  9.             Ar(i) = IIf(IsError(S), "", S)  '置入test上的欄位在data上的欄號
  10.         Next
  11.         Set Rng = .Range("a2:" & .Cells(Rows.Count, 1).End(xlUp).Address).Resize(, Rng.Columns.Count + 1)
  12.         Arr = Rng
  13.     End With
  14.     For i = 1 To UBound(Arr)
  15.         S = Application.Match(Arr(i, 1), Sheets("data").Columns(1), 0)
  16.         If Not IsError(S) Then    'test上的學號在data上的位置
  17.             For ii = 1 To UBound(Ar) '導入test上的欄位在data上的欄號
  18.              If Ar(ii) <> "" Then Arr(i, ii + 1) = Sheets("data").Cells(S, Ar(ii))
  19.             Next
  20.         End If
  21.     Next
  22.     Rng.Value = Arr
  23. End Sub
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

阿龍大:
快多了,0.34秒
希望支持!

TOP

本帖最後由 n7822123 於 2018-10-4 11:25 編輯

回復 18# s7659109

應該不是當了,3萬筆要執行一段時間!
字典物件的key輸入字串型態可提升速度(這也是跟準大學習的)
test1 不需修改
程序 test2修改如下

Sub test2()
Set d = CreateObject("scripting.dictionary")
Dim Rn&, Cn&, arr, tt$
Sheets("data").Activate
Rn = Sheet2.Cells(Rows.Count, 1).End(xlUp).Row
Cn = Cells(1, Columns.Count).End(xlToLeft).Column
For C = 2 To Cn
  tt = Cells(1, C).Value
  d(tt) = Cells(2, C).Resize(Rn - 1, 1)
Next C
Sheets("test").Activate
Cn = Cells(1, Columns.Count).End(xlToLeft).Column
For C = 2 To Cn
  tt = Cells(1, C).Value
  Cells(2, C).Resize(Rn - 1, 1) = d(tt)
Next C
End Sub

使用&#25968;&#32452;和字典1071004.rar (8.64 KB)
程式是依需求寫的,需求表達不清楚
或者沒有上傳附件,愛莫能助

TOP

回復 13# s7659109

Ar = Array(1, 2, 3, 4, 5, 6, 7, 8, 18, 19, 20, 21, 22, 23, 24, 25, 26)
Br = Array(1, 2, 3, 4, 5, 6, 7, 8, 11, 12, 13, 14, 15, 16, 17, 18, 19)

如果是像上面這樣[兩段式]的連續欄位:
Cells(2, 1).Resize(R, 8) = xA(2, 1).Resize(R, 8).Value
Cells(2, 18).Resize(R, 9) = xA(2, 11).Resize(R, 9).Value

TOP

阿龍大:
筆數30000筆,當了。
希望支持!

TOP

本帖最後由 n7822123 於 2018-10-4 01:33 編輯

回復 16# s7659109


請使用你附件裡面的 "test2"程序!

test1 與 test2 都可以符合你的需求,不同寫法
test1 最彈性,學號也不連續也可以!

sheet2.test 程序是你自己原本的!
有點無言.....

按Alt+F8
程式是依需求寫的,需求表達不清楚
或者沒有上傳附件,愛莫能助

TOP

本帖最後由 s7659109 於 2018-10-3 08:27 編輯

阿龍大:
經測試結果,仍達不到預期,如附檔。

使用&#25968;&#32452;和字典1071003.zip (12.75 KB)

希望支持!

TOP

本帖最後由 n7822123 於 2018-10-2 23:25 編輯

回復 14# n7822123


靈光一閃,這樣應該滿意了吧!?
程序:test2
  1. Sub test2()
  2. Set d = CreateObject("scripting.dictionary")
  3. Dim Rn&, Cn&, arr
  4. Sheets("data").Activate
  5. Rn = Sheet2.Cells(Rows.Count, 1).End(xlUp).Row
  6. Cn = Cells(1, Columns.Count).End(xlToLeft).Column
  7. For C = 2 To Cn: d(Cells(1, C).Value) = Cells(2, C).Resize(Rn - 1, 1): Next C
  8. Sheets("test").Activate: Cn = Cells(1, Columns.Count).End(xlToLeft).Column
  9. For C = 2 To Cn: Cells(2, C).Resize(Rn - 1, 1) = d(Cells(1, C).Value): Next C
  10. End Sub
複製代碼
使用&#25968;&#32452;和字典1071002+.rar (12.29 KB)
程式是依需求寫的,需求表達不清楚
或者沒有上傳附件,愛莫能助

TOP

本帖最後由 n7822123 於 2018-10-2 22:33 編輯

回復 13# s7659109


   來源資料要貼入的資料,需要建立1-1對應關係

   如果沒有規律的話,應該是沒辦法用變數取代的

  除非要寫判斷式找出2個工作表的對應關係,這樣就跟你的命題:不需判斷衝突了。
程式是依需求寫的,需求表達不清楚
或者沒有上傳附件,愛莫能助

TOP

        靜思自在 : 不要隨心所欲,要隨心教育自己。
返回列表 上一主題