返回列表 上一主題 發帖

[發問] 將資料自動分類功能

回復 2# iceandy6150
  1. Option Explicit
  2. Sub Ex()
  3.     Dim i As Integer, Sh As Worksheet
  4.     Application.DisplayAlerts = False
  5.     For Each Sh In Sheets
  6.         If Sh.Name <> "工作表1" And Sh.Name <> "工作表2" Then Sh.Delete
  7.         '活頁簿只留 工作表1:是輸入區,工作表2:是歷史記錄
  8.     Next
  9.     With Sheets("工作表2")
  10.         If .UsedRange.Rows.Count = 1 Then               '沒有歷史紀錄
  11.             Sheets("工作表1").UsedRange.Copy            '複製(含標頭)
  12.             .Range("a1").PasteSpecial xlPasteValues
  13.         Else
  14.             Sheets("工作表1").UsedRange.Offset(1).Copy  '複製(不含標頭)
  15.             .Range("A" & .UsedRange.Rows.Count).Offset(3).PasteSpecial xlPasteValues
  16.             'Offset(3) :空2列->第3列貼上
  17.         End If
  18.         .UsedRange.Range("E:E").AdvancedFilter xlFilterCopy, , .Cells(1, .Columns.Count), True
  19.         '進階篩選 E欄 不重複資料到工作表最右欄 ***取得類別的分類***
  20.         i = 2
  21.         .Cells(1, .Columns.Count - 1) = .UsedRange.Range("E1")    '進階篩選的欄位名稱是E欄的標頭
  22.         Do While .Cells(i, .Columns.Count) <> ""                  '工作表最右欄的儲存格 <>""
  23.             Set Sh = Sheets.Add(, Sheets(Sheets.Count))           '新增的類別工作表
  24.             Sh.Name = .Cells(i, .Columns.Count)
  25.             .Cells(2, .Columns.Count - 1) = Sh.Name
  26.            .UsedRange.AdvancedFilter xlFilterCopy, .Cells(1, .Columns.Count - 1).Resize(2), Sh.[a1], True
  27.            '工作表2 進階篩選 準則[分類]="工作表1"最右欄的儲存格, 複製到新增的類別工作表[A1]
  28.            Do While Sh.UsedRange.Rows.Count > 11                  '資料列>11列
  29.                 Sh.Copy , Sheets(Sh.Index)                        '1 原工作表複製
  30.                 Sh.Rows("11:" & Sh.Rows.Count).Delete             '2 原工作表刪除11列以下的資料(保持10列)
  31.                 Set Sh = ActiveSheet                              '3 複製的工作表 指定給變數
  32.                 Sh.Rows("2:11").Delete                            '4 複製的工作表刪除2:11列的資料
  33.            Loop
  34.            i = i + 1
  35.         Loop
  36.         .Cells(1, .Columns.Count).CurrentRegion = ""
  37.     End With
  38. End Sub
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

本帖最後由 GBKEE 於 2014-2-1 10:00 編輯

回復 7# iceandy6150

試試看

Ex.rar (14.91 KB)

感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 9# iceandy6150
請看看 Sheets("工作表2")最右邊的IV欄
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 11# iceandy6150
須多了解程式碼的意義
我的是Sheets("工作表2") 你改為 Sheets("工作表1")
  1. With Sheets("工作表1")'
  2.     .UsedRange.Range("E:E").AdvancedFilter xlFilterCopy, , .Cells(1, .Columns.Count), True
  3.     'AdvancedFilter:進階篩選
  4.    'xlFilterCopy:進階篩選的資料顯示在其他地方
  5.    '.Cells(1, .Columns.Count) ->工作表的最右欄第1個儲存格->進階篩選的資料顯示的地方
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

本帖最後由 GBKEE 於 2014-2-4 09:35 編輯

回復 17# iceandy6150
  1. With Sheets("工作表1")  '工作表物件才有UsedRange物件   
  2.          With .Range("DataRange")  ' 沒有UsedRange
  3.          'a = .UsedRange.Rows.Count '
  4.           MsgBox Application.CountA(.Columns(1)) '指定"DataRange"第一欄->使用的列數
  5.        ' Application.CountA : VBA中使用工作表函數 CountA  
  6.        MsgBox Application.CountA(.Cells)      '"DataRange"範圍內
  7.          End With         
  8.     End With
複製代碼
15#
  1. 'k = 1
  2.         'Do While .Cells(k, .Columns.Count) <> ""
  3.         '.Cells(k, .Columns.Count) = ""
  4.         'k = k + 1
  5.         'Loop
  6.         .Cells(k, .Columns.Count).EntireColumn = ""    'EntireColumn :整欄
  7.         '.Cells(1, .Columns.Count).CurrentRegion = ""  'CurrentRegion:連續的資料範圍
複製代碼
16# 檔案的私密資料遮蔽,上傳看看
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

本帖最後由 GBKEE 於 2014-2-4 14:43 編輯

回復 19# iceandy6150
附檔上總表G欄類別沒數字, 但工作表[保險231],[通訊203]..有數字 這些工作表的命名規則你沒說明!
[總表]資料可在H欄加註辨別新舊資料
16# 可能還要用一個工作表,裡面放參考值,比如說 類別為[一般事務費],那sh.name就是[一般事務費279],字號為[庶字第016號]
庶字第016號 在何處??
請告知疑惑,程式才寫的下去.
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 21# iceandy6150
沒有規律性那你就用手動
  1. Option Explicit   '必須置於模組頂端 強制宣告變數
  2. Sub Ex()
  3.     Dim i As Integer, Sh As Worksheet, Rng As Range, xRow As Range, R As Integer
  4.     With Sheets("總表")
  5.         If .UsedRange.Rows.Count = 1 Then              '沒有歷史紀錄
  6.            Sheets("Sheet1").UsedRange.Copy            '複製(含標頭)
  7.             .Range("A1").PasteSpecial xlPasteValues
  8.         Else
  9.             Sheets("Sheet1").UsedRange.Offset(1).Copy  '複製(不含標頭)
  10.             .Range("A" & .UsedRange.Rows.Count).Offset(3).PasteSpecial xlPasteValues
  11.             'Offset(3) :空2列->第3列貼上
  12.         End If
  13.     End With
  14.     With Sheets("SHEET1")  '工作表:輸入區
  15.         .Range("A1").CurrentRegion.Range("G:G").AdvancedFilter xlFilterCopy, , .Cells(1, .Columns.Count), True
  16.         i = 2
  17.         Do While .Cells(i, .Columns.Count) <> ""
  18.             .Range("A1").AutoFilter 7, .Cells(i, .Columns.Count)         '自動篩選
  19.             Set Sh = Sheets(類別表(.Cells(i, .Columns.Count)))           '指定到類別的工作表
  20.             For Each xRow In .AutoFilter.Range.SpecialCells(xlCellTypeVisible).Rows '自動篩選範圍列的集合
  21.                 If xRow.Row > 1 Then
  22.                      R = Application.CountA(Sh.[D7:D19])                 '有輸入的資料數
  23.                      With Sh.[D7].Offset(R)
  24.                         .Cells(, 1) = xRow.Range("D1")
  25.                         .Cells(, 5) = xRow.Range("F1")
  26.                         .Cells(, 7) = xRow.Range("E1")
  27.                      End With
  28.                      If Application.CountA(Sh.[D7:D19]) = 13 Then
  29.                          Sh.Copy , Sh
  30.                          Set Sh = ActiveSheet
  31.                         Sh.[D7:J19] = ""
  32.                     End If
  33.                 End If
  34.             Next
  35.         i = i + 1
  36.         Loop
  37.         .AutoFilterMode = False       '自動篩選模式:取消
  38.         .UsedRange.Offset(1).Clear    '資料輸入後清除掉
  39.        ' .Cells(1, .Columns.Count).EntireColumn = ""
  40.     End With
  41. End Sub
  42. Function 類別表(類別 As String)    '自訂函數: 尋找類別的工作表
  43.     Dim 表 As String, Sh As Worksheet
  44.     For Each Sh In Sheets                  'Sheets: 工作表的集合
  45.         If InStr(Sh.Name, 類別) = 1 And Application.CountA(Sh.[D7:D19]) = 13 Then  '類別的工作表[D7:D19]有輸入的資料數
  46.             表 = Sh.Name
  47.         ElseIf InStr(Sh.Name, 類別) = 1 And Application.CountA(Sh.[D7:D19]) < 13 Then
  48.             類別表 = Sh.Name
  49.             Exit For
  50.         End If
  51.     Next
  52.     If 類別表 = "" And 表 <> "" Then
  53.         Sheets(表).Copy , Sheets(表)
  54.         類別表 = ActiveSheet.Name
  55.     ElseIf 類別表 = "" And 表 = "" Then
  56.         '*** 找不到類別的工作表 複製 "表格" 的範本
  57.         Sheets("表格").Copy Sheets(1)
  58.         ActiveSheet.Name = 類別
  59.         類別表 = 類別
  60.     End If
  61. End Function
複製代碼
回復 23# yen956
沒有關係的,論壇需要熱心的會員參與.
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 25# iceandy6150
多錄製巨集:可知如何使用VBA的方法.函數.屬性時機,要功力的增進,不二方法下苦工(多看,多問,多練習).大多數書籍的內容,VBA說明都可找到.
  1. Option Explicit
  2. Private Sub CommandButton4_Click()
  3.     Dim i As Integer, j, k As String, Rng As Range
  4.     With Sheets("Sheet1")
  5.         .UsedRange.Range("G:G").AdvancedFilter xlFilterCopy, , .Cells(1, .Columns.Count), True
  6.     End With
  7.     i = 2
  8.     With Sheets("參照表")
  9.         Set Rng = .Range("A:A").Find(what:=Sheets("Sheet1").Cells(i, .Columns.Count))
  10.         k = Rng.Offset(, 1)
  11.         MsgBox (Rng)
  12.         MsgBox (k)
  13.     End With
  14. End Sub
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 28# iceandy6150
錄製巨集能有解答?? 還要多看VBA說明.練習,了解它的範例(書本上的函數,方法,屬性,VBA說明都有)

  1. With Sheets("參照表")
  2.             Set Rng = .Range("A:A").Find(what:=Sheets("Sheet1").Cells(i, .Columns.Count))
  3.             MsgBox Rng Is Nothing '是 True 沒有找到 下面就錯誤
  4.             '沒有物件指定到 Rng
  5.             j = Rng.Offset(, 1)
  6.             End With
  7.             Sh.[C2] = j      'Rng Is Nothing 也會有錯誤
  8.             Sh.Name = Rng    'Rng Is Nothing 也會有錯誤
  9.             
  10.             j = ""              '沒用的:這兩行是我覺得使用後清空,加這兩行錯誤也沒消失
  11.             Rng = ""
  12.             For Each xRow In .AutoFilter.Range.SpecialCells(xlCellTypeVisible).Rows '自動篩選範圍列的集合
  13.                 If xRow.Row > 1 Then
  14.                      R = Application.CountA(Sh.[D7:D19])                 '有輸入的資料數
  15.                      With Sh
  16.                         .[E3] = xRow.Range("B1")                        '@@@  再把日期加進E3
  17.                         .[D7].Offset(R).Cells(, 1) = xRow.Range("D1")
  18.                         .[D7].Offset(R).Cells(, 5) = xRow.Range("F1")
  19.                         .[D7].Offset(R).Cells(, 7) = xRow.Range("E1")
  20.                      End With
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

本帖最後由 GBKEE 於 2014-2-7 09:21 編輯

回復 34# iceandy6150
萬丈高樓,從地起,你已在打地基了
依你的 [零用金清單-上傳用.rar] 修改一下
  1. Option Explicit   '必須置於模組頂端 強制宣告變數
  2. Private Sub CommandButton1_Click()
  3.     Dim Sh As Worksheet, i As Integer, R As Integer, Rng As Range, xRow As Range
  4.     Application.ScreenUpdating = False
  5.     With Sheets("總表")
  6.         If .UsedRange.Rows.Count = 1 Then              '沒有歷史紀錄
  7.            Sheets("Sheet1").UsedRange.Copy             '複製(含標頭)
  8.             .Range("A1").PasteSpecial xlPasteValues
  9.         Else
  10.             Sheets("Sheet1").UsedRange.Offset(1).Copy  '複製(不含標頭)
  11.             .Range("A" & .UsedRange.Rows.Count).Offset(3).PasteSpecial xlPasteValues
  12.                                                        'Offset(3) :空2列->第3列貼上
  13.         End If
  14.     End With
  15.     With Sheets("Sheet1")
  16.         .UsedRange.Range("G:G").AdvancedFilter xlFilterCopy, , .Cells(1, .Columns.Count), True
  17.         i = 2
  18.         Do While .Cells(i, .Columns.Count) <> ""                          '工作表最右欄的儲存格 <>""
  19.             .Range("A:G").AutoFilter 7, .Cells(i, .Columns.Count)          'AutoFilter: 自動篩選 ,第7欄(類別)的準則為 .Cells(i, .Columns.Count)
  20.             Set Rng = Sheets("參照表").Range("A1:A18").Find(.Cells(i, .Columns.Count)).Offset(, 1)
  21.             Set Sh = Sheets(類別表(Rng))
  22.             Sh.Activate
  23.             For Each xRow In .AutoFilter.Range.SpecialCells(xlCellTypeVisible).Rows '自動篩選範圍列的集合
  24.                 If xRow.Row > 1 Then
  25.                     R = Application.CountA(Sh.[D7:D19])                 '有輸入的資料數
  26.                     With Sh
  27.                         .[E3,E29] = xRow.Range("B1")                    '日期加進E3,E29
  28.                         
  29.                         .[D7].Offset(R).Cells(, 1) = xRow.Range("D1")
  30.                         .[D7].Offset(R).Cells(, 5) = xRow.Range("F1")
  31.                         .[D7].Offset(R).Cells(, 7) = xRow.Range("E1")
  32.                         
  33.                         .[D33].Offset(R).Cells(, 1) = xRow.Range("D1")
  34.                         .[D33].Offset(R).Cells(, 5) = xRow.Range("F1")
  35.                         .[D33].Offset(R).Cells(, 7) = xRow.Range("E1")
  36.                     End With
  37.                     If Application.CountA(Sh.[D7:D19]) = 13 Then
  38.                         Sh.Copy , Sh
  39.                         Set Sh = ActiveSheet
  40.                         Sh.[D7:J19,D33:J45] = ""
  41.                         'Sh.[D33:J45] = ""
  42.                     End If
  43.                 End If
  44.             Next
  45.             i = i + 1
  46.         Loop
  47.         .AutoFilterMode = False   '**** 取消自動篩選模式,資料全部顯示下面的清除才有效果*****
  48.    '     .UsedRange.Offset(1) = "'"                      'UsedRange: 工作表的已使用範圍
  49.         '.Cells(1, .Columns.Count).EntireColumn = ""    'EntireColumn:整欄
  50.         '.Cells(1, .Columns.Count).CurrentRegion = ""   'CurrentRegion: 有資料的延伸範圍
  51.      '   .Activate
  52.     End With
  53.     Application.ScreenUpdating = True
  54. End Sub
  55. Function 類別表(類別 As Range) As String      '自訂函數: 尋找類別的工作表
  56.     Dim 表 As String, Sh As Worksheet
  57.     For Each Sh In Sheets                  'Sheets: 工作表的集合
  58.         If InStr(Sh.Name, 類別) = 1 And Application.CountA(Sh.[D7:D19]) = 13 Then  '類別的工作表[D7:D19]有輸入的資料數
  59.             表 = Sh.Name
  60.         ElseIf InStr(Sh.Name, 類別) = 1 And Application.CountA(Sh.[D7:D19]) < 13 Then
  61.             類別表 = Sh.Name
  62.             Exit For
  63.         End If
  64.     Next
  65.     If 類別表 = "" And 表 <> "" Then
  66.         Sheets(表).Copy , Sheets(表)
  67.         ActiveSheet.[C2] = 類別.Offset(, 2)
  68.         類別表 = ActiveSheet.Name
  69.     ElseIf 類別表 = "" And 表 = "" Then
  70.         '*** 找不到類別的工作表 複製 "表格" 的範本
  71.         Sheets("表格範本").Copy Sheets(1)
  72.         ActiveSheet.Name = 類別
  73.         ActiveSheet.[C2] = 類別.Offset(, 1)
  74.         類別表 = 類別
  75.     End If
  76. End Function
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

        靜思自在 : 信心、毅力、勇氣三者具備,則天下沒有做不成的事。
返回列表 上一主題