返回列表 上一主題 發帖

[發問] 如資料行、列數不一定如何統一合併為兩攔且以空格分開

回復 6# billchenfantasy

若依你的範例說明是要移除重複(原22列資料,整理後為15列)
是有先將最末2欄向前移動,只是有再恢復原貌而以
  1. Sub ex()
  2. Dim Rng As Range, A As Range, C As Range
  3. Set d = CreateObject("Scripting.Dictionary")
  4. d("first") = Array("Mplan_no", "Mdate")    '新標題
  5. [A1].End(xlToRight).Offset(, -1).Resize(, 2).EntireColumn.Cut  '最後2欄剪下
  6. [C1].Insert  '在C欄插入剪下的儲存格
  7. For Each A In Range([A2], [A2].End(xlDown))
  8. mystr = "": x = "": y = ""
  9.   Set Rng = A.EntireRow.SpecialCells(xlCellTypeConstants, xlNumbers)  '以日期作為基準
  10.   For Each C In Rng
  11.      'mystr = IIf(mystr = "", C.Offset(, -1) & C, mystr & C.Offset(, -1) & C) '若要排除重複則使用此為字典索引
  12.      x = IIf(x = "", C.Offset(, -1), x & " " & C.Offset(, -1))
  13.      y = IIf(y = "", C, y & " " & C)
  14.   Next
  15.   s = s + 1
  16.   d(s) = Array(x, y)
  17.   'd(mystr) = Array(x, y)  '若要排除重複則使用此為字典索引
  18. Next
  19. [C:D].Cut [A1].End(xlToRight).Offset(, 1)  '將C:D欄剪下貼回資料表最末端
  20. [C:D].Delete  'C:D剪下後變成空白欄,所以將其刪除,回覆成原資料表
  21. [A1].End(xlDown).Offset(3).Resize(d.Count, 2) = Application.Transpose(Application.Transpose(d.items))
  22. End Sub   
複製代碼
學海無涯_不恥下問

TOP

回復 5# billchenfantasy

補充一點_資料是不需移除重複的謝謝您

TOP

回復 3# Hsieh
感謝您的答覆與協助,原來有這麼多寫法可以參考
而在嘗試運用您的公式時,發現並未先將最後兩攔剪下移至0-2之前
是否是須將後三行的指令順序移動呢?
感恩

TOP

回復 2# luhpro [/b
謝謝您的答覆與指導,確實會因計算導致誤刪的狀況發生,感謝您的細心。
您的公式在使用過後,補齊2-2那一欄的狀況下可以將資料整理至欲達成的格式。

然而在沒有補齊的狀況下,則會發生以下狀況

您的公式我會好好學習,再次感謝

TOP

回復 1# billchenfantasy
是否也要排除重複?
  1. Sub ex()
  2. Dim Rng As Range, A As Range, C As Range
  3. Set d = CreateObject("Scripting.Dictionary")
  4. d("first") = Array("Mplan_no", "Mdate")
  5. [A1].End(xlToRight).Offset(, -1).Resize(, 2).EntireColumn.Cut
  6. [C1].Insert
  7. For Each A In Range([A2], [A2].End(xlDown))
  8. mystr = "": x = "": y = ""
  9.   Set Rng = A.EntireRow.SpecialCells(xlCellTypeConstants, xlNumbers)
  10.   For Each C In Rng
  11.      mystr = IIf(mystr = "", C.Offset(, -1) & C, mystr & C.Offset(, -1) & C)
  12.      x = IIf(x = "", C.Offset(, -1), x & " " & C.Offset(, -1))
  13.      y = IIf(y = "", C, y & " " & C)
  14.   Next
  15.   d(mystr) = Array(x, y)
  16. Next
  17. [C:D].Cut [A1].End(xlToRight).Offset(, 1)
  18. [C:D].Delete
  19. [A1].End(xlDown).Offset(3).Resize(d.Count, 2) = Application.Transpose(Application.Transpose(d.items))
  20. End Sub
複製代碼
學海無涯_不恥下問

TOP

呈上 因資料筆數較多 請各位前輩賜教 感恩
billchenfantasy 發表於 2013-2-18 14:16


觀看你舉例的結果與上方原稿內容似乎有部分地方無法對應,例如 :
M12 雖然有對應 2002/9/24
但找不到 M63 (0-0 2-2) 裡的 2-2 (M64 是 1974/8/22 2002/9/24)
故假設你原稿中 Plan_Dat_5 與 Plan_Dat_6 (即 L 欄與 M 欄間)中間有一欄被誤刪了.
底下的程式是以此假設為基礎做出來的.
  1. Sub ex()
  2.   Dim iCols%, iCol%
  3.   Dim lRows As Long, lRow As Long
  4.   
  5.   iCols = Cells(1, Columns.Count).End(xlToLeft).Column
  6.   Range(Columns(iCols - 1), Columns(iCols)).Cut
  7.   Columns(3).Insert xlShiftToRight
  8.   lRows = Cells(Rows.Count, 1).End(xlUp).Row
  9.   
  10.   For lRow = 2 To lRows
  11.     For iCol = 3 To iCols Step 2
  12.       If Cells(lRow, iCol) <> "" Then
  13.         Cells(lRow, 1) = Cells(lRow, 1) & " " & Cells(lRow, iCol)
  14.         Cells(lRow, iCol) = ""
  15.         Cells(lRow, 2) = Cells(lRow, 2) & " " & Cells(lRow, iCol + 1)
  16.         Cells(lRow, iCol + 1) = ""
  17.       End If
  18.     Next iCol
  19.   Next lRow
  20.   End Sub
複製代碼

TOP

        靜思自在 : 虛空有盡.我願無窮,發願容易行願難。
返回列表 上一主題