返回列表 上一主題 發帖

[發問] 跨欄置中與擷取文字問題

[發問] 跨欄置中與擷取文字問題

想請問各位高手們
我想要顯示圖片中的效果
資料一開始都是混亂的(上千筆)
1. 先依照A欄先排序, 知後再依照相同東西(如AAA)再一次依照D欄再排序一次
2. 依照C欄,D欄,E欄 做簡化
   2-1. C欄共通點從第一個字元開始到第一個『  -  』 都保留
   2-2. D欄共通點從05-xxxx- 第二個『  -  』 都保留
   2-3. E欄共通點第一個字元到其中會有個字串『  SPC  』 或 『  SCL  』,後面都不要
   2-4. 可以再幫我真對E欄 再做另一個版本嗎 , 另一個版本是從字串中 ,從『QVS』後到『  SPC  』 或 『  SCL  』
3. 完成1、2步驟後,依照B欄相同的跨欄置中, 如圖片中
4.依照D欄相同的字串用黑框線
5.B欄位資料字體大小16 , C與D欄字體大小12 , 資料表縮放比例63%檢視

回復 1# v03586
圖片密密麻麻怎不附檔,要試的人自己依圖去填嗎?
表達不清、題意不明確、沒附檔案格式、沒有討論問題的態度~~~~~~以上愛莫能助。

TOP

http://blog.xuite.net/hcm19522/twblog/372926021
http://blog.xuite.net/hcm19522/twblog/372906150
參考

TOP

Sorry , 補檔案
test.rar (87.5 KB)

TOP

回復 3# hcm19522


    大大果然是函數達人!!!!  因處理資料上千筆, 所以必須寫入迴圈
我覺得大大這個方法也很好!!!值得參考

TOP

回復 4# v03586
Try this
4.依照D欄相同的字串用黑框線  => 改為依合併的A欄畫粗框
  1. Sub Test()
  2.     Dim oRegexp As Object: Set oRegexp = CreateObject("vbscript.regexp")
  3.     Dim ar, i, j, s
  4.    
  5.     ar = Sheets("報表").Range("A9:F21").Value  'or .Range("A9").CurrentRegion.Value
  6.    
  7.     With oRegexp
  8.         .Pattern = "^[^-]*-"
  9.         For i = 1 To UBound(ar)
  10.             If .Test(ar(i, 3)) Then ar(i, 3) = .Replace(ar(i, 3), "")
  11.         Next
  12.         .Pattern = "^[^-]*-[^-]*-"
  13.         For i = 1 To UBound(ar)
  14.             If .Test(ar(i, 4)) Then ar(i, 4) = .Replace(ar(i, 4), "")
  15.         Next
  16.         .Pattern = "^(.{2})(.)(.*)[a-zA-Z]$"
  17.         For i = 1 To UBound(ar)
  18.             If .Test(ar(i, 5)) Then
  19.                 s = .Replace(ar(i, 5), "$1-$2-$3")
  20.                 mch = Application.VLookup(s, Sheets("Flow").[A:B], 2, False)
  21.                 If Not IsError(mch) Then ar(i, 5) = mch
  22.             End If
  23.         Next
  24.         .Pattern = "(SPC|SCL).*$"
  25.         '另一種 QVS to SPC/SCL
  26.         '.Pattern = "^.*?(QVS.*?(SPC|SCL)).*$"
  27.         For i = 1 To UBound(ar)
  28.             If .Test(ar(i, 6)) Then ar(i, 6) = .Replace(ar(i, 6), "$1")
  29.         Next
  30.         
  31.     End With
  32.    
  33.     Application.ScreenUpdating = False
  34.     With Sheets.Add.[A1].Resize(UBound(ar), UBound(ar, 2))
  35.         .Value = ar
  36.         .Sort key1:=.Cells(1, 1), order1:=xlAscending, key2:=.Cells(1, 4), order2:=xlAscending
  37.         .Borders.LineStyle = xlContinuous
  38.         .Borders.Weight = xlThin
  39.         Application.DisplayAlerts = False
  40.         i = 1
  41.         For j = 1 To UBound(ar)
  42.             If .Cells(j, 2).Value <> .Cells(j + 1, 2).Value Then
  43.                 If i <> j Then Range(.Cells(i, 1), .Cells(j, 1)).Merge
  44.                 With .Cells(i, 1).MergeArea.Resize(, .Columns.Count)
  45.                     .Borders(xlEdgeTop).Weight = xlMedium
  46.                     .Borders(xlEdgeBottom).Weight = xlMedium
  47.                     .Borders(xlEdgeLeft).Weight = xlMedium
  48.                     .Borders(xlEdgeRight).Weight = xlMedium
  49.                 End With
  50.                 i = j + 1
  51.             End If
  52.         Next
  53.         Application.DisplayAlerts = True
  54.         
  55.         [B:B].Font.Size = 16
  56.         [C:D].Font.Size = 12
  57.         ActiveWindow.Zoom = 63
  58.         [A:F].EntireColumn.AutoFit
  59.         [A:B].HorizontalAlignment = xlCenter
  60.     End With
  61.     Application.ScreenUpdating = True
  62. End Sub
複製代碼
表達不清、題意不明確、沒附檔案格式、沒有討論問題的態度~~~~~~以上愛莫能助。

TOP

回復 6# stillfish00


    感謝大大的幫忙!!!
但我部分看不太清楚 , 可否麻煩大大針對幾項功能協助做個說明

EX :
  1.    With oRegexp
  2.         .Pattern = "^[^-]*-"
  3.         For i = 1 To UBound(ar)
  4.             If .Test(ar(i, 3)) Then ar(i, 3) = .Replace(ar(i, 3), "")
  5.         Next
  6.         .Pattern = "^[^-]*-[^-]*-"
複製代碼
這一段是判斷什麼功能?
  1.         For i = 1 To UBound(ar)
  2.             If .Test(ar(i, 4)) Then ar(i, 4) = .Replace(ar(i, 4), "")
  3.         Next
  4.         .Pattern = "^(.{2})(.)(.*)[a-zA-Z]$"
複製代碼
這一段是判斷什麼功能
我不知道這樣切 有沒有切錯段落

TOP

回復 7# v03586
  1. oRegexp : regular expression 正則表達式/正規表示法,用來查找、替換、提取、驗證字串,
  2. ,可參考 http://club.excelhome.net/thread-1128647-1-2.html 學習

  3. .Pattern = "^[^-]*-" 用來設定規則
  4. ^ : 字串開頭位置
  5. [^-] : 非-的任意字元
  6. [^-]* : 0~n個非-的任意字元
  7. - : -字元
  8. 所以是匹配開頭到第一個-字元

  9. .Test 是用來測試是否符合規則
  10. .Replace 是把符合規則部分的字串取代掉
複製代碼
表達不清、題意不明確、沒附檔案格式、沒有討論問題的態度~~~~~~以上愛莫能助。

TOP

用最基本的程式語法, 自行去研究, 不再多說明~~
  1. Sub TEST()
  2. Dim R&, xArea As Range, xR As Range, xH As Range, T, TT, X
  3. R = [報表!A65536].End(xlUp).Row: If R < 9 Then Exit Sub
  4. Set xArea = Sheets("報表").Range("A9:A" & R)
  5. For Each xR In xArea
  6.   T = xR(1, 3): xR(1, 3) = Mid(T, InStr(T, "-") + 1)
  7.   xR(1, 4) = Right(xR(1, 4), 9)
  8.       
  9.   T = xR(1, 5):  T = Left(T, 2) & "-" & Mid(T, 3, 1) & "-" & Mid(T, 4, 4)
  10.   TT = Application.VLookup(T, [Flow!A:B], 2, 0)
  11.   If Not IsError(TT) Then xR(1, 5) = TT Else xR(1, 5).Font.Color = vbRed
  12.       
  13.   T = xR(1, 6)
  14.   T = Mid(T & ",QVS", InStr(T, "QVS") + 4) '取 QVS 以後字串
  15.   For Each TT In Array("SPC", "SCL")
  16.     X = InStr(T, TT): If X > 0 Then xR(1, 6) = Left(T, X + 2): Exit For
  17.   Next
  18. Next
  19.  
  20. xArea.Resize(, 6).Sort Key1:=xArea(1, 1), Order1:=xlAscending, _
  21.                        Key2:=xArea(1, 4), Order2:=xlAscending, Header:=xlNo
  22.                        
  23. Application.DisplayAlerts = False
  24. For Each xR In xArea
  25.   If xR & xR(1, 2) <> xR(0) & xR(0, 2) Then Set xH = xR
  26.   If xR & xR(1, 2) <> xR(2) & xR(2, 2) Then
  27.    Range(xH, xR).Merge: Range(xH(1, 2), xR(1, 2)).Merge
  28.    Range(xH, xR(1, 6)).Borders.LineStyle = 1
  29.    For i = 7 To 10
  30.      Range(xH, xR(1, 6)).Borders(i).Weight = xlMedium
  31.    Next i
  32.   End If
  33. Next
  34. End Sub
複製代碼

TOP

回復 9# 准提部林


    Excel 打開比對A2欄位有 ON HAND--PC_ONHAND2HR_1ST_FLOW
就等同匯入報表嗎

TOP

        靜思自在 : 對父母要知恩,感恩、報恩。
返回列表 上一主題