VBA学习(77):Excel表格拆分通用版终极神器

1.用户窗体-定义变量:

Dim xlApp As Object
Dim xlBook As Object
Dim xlSheet As Object
Dim wrdApp As Object
Dim wrdDoc As Object
Dim wrdTable As Object
Dim filePath As String
Dim fileName As String
Dim saveFolder As String
Dim sht As Worksheet
Dim shtName As String
Dim lastRow As Integer, lastCol As Integer
Dim rng As Range
Dim arr(), arrDate(), arrSplit(), tbTitle(), arrNumber(), arrFilter()
Dim SplitCol As Integer
Dim dateCol As Integer, NumberCol As Integer
Dim filterCol As Integer
Dim arrTem()
Dim newRow As Integer
Dim filesCounter As Integer

用户窗体-Sub CkbTitle

Private Sub CkbTitle_Click()If Me.CkbTitle ThenMe.TxbTitle.Visible = TrueElseMe.TxbTitle.Visible = FalseMe.TxbTitle = ""End If
End Sub

代码解析:插入标题,点击勾选则显示文本框,再点击取消勾选,隐藏文本框。

用户窗体-Sub CmbFilterColumn


Private Sub CmbFilterColumn_Change()On Error Resume NextDim dicFilter As ObjectSet dicFilter = CreateObject("Scripting.Dictionary")For i = 1 To lastColIf arr(1, i) = Me.CmbFilterColumn ThenfilterCol = iExit ForEnd IfNextFor i = 1 To lastColIf arr(1, i) = Me.CmbSplitColumn ThenSplitCol = iExit ForEnd IfNextFor i = 2 To lastRowIf Me.CmbSplit = "" ThendicFilter(arr(i, filterCol)) = 1ElseIf arr(i, SplitCol) = Me.CmbSplit ThendicFilter(arr(i, filterCol)) = 1End IfEnd IfNextarrFilter = dicFilter.keysCall SortArray(arrFilter)Me.CmbInclude.List = arrFilterMe.CmbExclude.List = arrFilterMe.CmbInclude = ""Me.CmbInclude = ""End Sub

代码解析:其他筛选,改变筛选字段,重新设置其下两个复合框的List

用户窗体-Sub CmbSplit_Change


Private Sub CmbSplit_Change()On Error Resume NextDim dicDate As ObjectDim dicNumber As ObjectDim dicFilter As ObjectDim strArr As String, strCmb As StringSet dicDate = CreateObject("Scripting.Dictionary")Set dicNumber = CreateObject("Scripting.Dictionary")Set dicFilter = CreateObject("Scripting.Dictionary")For i = 2 To lastRowstrArr = CStr(arr(i, SplitCol))strCmb = CStr(Me.CmbSplit)If dateCol > 0 ThenIf strArr = strCmb ThendicDate(arr(i, dateCol)) = 1End IfEnd IfIf NumberCol > 0 ThenIf strArr = strCmb ThendicNumber(arr(i, NumberCol)) = 1End IfEnd IfIf filterCol > 0 ThenIf strArr = strCmb ThendicFilter(arr(i, filterCol)) = 1End IfEnd IfNextMe.CmbMinDate.ClearMe.CmbMaxDate.CleararrDate = dicDate.keysCall SortArray(arrDate)Me.CmbMinDate.List = arrDateMe.CmbMaxDate.List = arrDateMe.CmbMinNumber.ClearMe.CmbMaxNumber.CleararrNumber = dicNumber.keysCall SortArray(arrNumber)Me.CmbMinNumber.List = arrNumberMe.CmbMaxNumber.List = arrNumberMe.CmbInclude.ClearMe.CmbExclude.CleararrFilter = dicFilter.keysCall SortArray(arrFilter)Me.CmbInclude.List = arrFilterMe.CmbExclude.List = arrFilterEnd Sub

代码解析:单选项目change事件,右边的三个筛选都要随之改变。 

用户窗体-Sub CmbSplitColumn_Change

Private Sub CmbSplitColumn_Change()'On Error Resume NextDim dicSplit As ObjectDim dicNumber As ObjectDim dicDate As ObjectDim dicFilter As ObjectSet dicSplit = CreateObject("Scripting.Dictionary")Set dicDate = CreateObject("Scripting.Dictionary")Set dicNumber = CreateObject("Scripting.Dictionary")Set dicFilter = CreateObject("Scripting.Dictionary")For i = 1 To lastColIf arr(1, i) = Me.CmbDateColumn ThendateCol = iElseIf arr(1, i) = Me.CmbSplitColumn ThenSplitCol = iElseIf arr(1, i) = Me.CmbNumberColumn ThenNumberCol = iElseIf arr(1, i) = Me.CmbFilterColumn ThenfilterCol = iEnd IfNextFor i = 2 To lastRowIf SplitCol > 0 ThendicSplit(arr(i, SplitCol)) = 1End IfIf dateCol > 0 ThendicDate(arr(i, dateCol)) = 1End IfIf NumberCol > 0 ThendicNumber(arr(i, NumberCol)) = 1End IfIf filterCol > 0 ThendicFilter(arr(i, filterCol)) = 1End IfNextarrSplit = dicSplit.keysMe.CmbSplit.List = dicSplit.keysarrDate = dicDate.keysCall SortArray(arrDate)arrNumber = dicNumber.keysCall SortArray(arrNumber)arrFilter = dicFilter.keysCall SortArray(arrFilter)Me.CmbMinDate.List = arrDateMe.CmbMaxDate.List = arrDateMe.CmbMinNumber.List = arrNumberMe.CmbMaxNumber.List = arrNumberMe.CmbInclude.List = arrFilterMe.CmbExclude.List = arrFilterMe.CmbMinDate = ""Me.CmbMaxDate = ""Me.CmbMinNumber = ""Me.CmbMaxNumber = ""Me.CmbSplit = ""End Sub

代码解析:拆分列的change事件,右边的三个筛选都随之改变。

用户窗体-Sub CmbDateColumn_Change

Private Sub CmbDateColumn_Change()On Error Resume NextDim dicDate As ObjectDim arrMinDate(), arrMaxDate()Set dicDate = CreateObject("Scripting.Dictionary")For i = 1 To lastColIf arr(1, i) = Me.CmbDateColumn ThendateCol = iExit ForEnd IfNextFor i = 1 To lastColIf arr(1, i) = Me.CmbSplitColumn ThenSplitCol = iExit ForEnd IfNextFor i = 2 To lastRowIf Me.CmbSplit = "" ThendicDate(arr(i, dateCol)) = 1ElseIf arr(i, SplitCol) = Me.CmbSplit ThendicDate(arr(i, dateCol)) = 1End IfEnd IfNextarrDate = dicDate.keysCall SortArray(arrDate)Me.CmbMinDate.List = arrDateMe.CmbMaxDate.List = arrDateMe.CmbMinDate = ""Me.CmbMaxDate = ""End Sub

代码解析:日期筛选列的change事件,其下两个筛选都随之改变。

用户窗体-Sub CmbNumberColumn_Change


Private Sub CmbNumberColumn_Change()On Error Resume NextDim dicNumber As ObjectDim arrMinNumber(), arrMaxnumber()Set dicNumber = CreateObject("Scripting.Dictionary")For i = 1 To lastColIf arr(1, i) = Me.CmbNumberColumn ThenNumberCol = iExit ForEnd IfNextFor i = 1 To lastColIf arr(1, i) = Me.CmbSplitColumn ThenSplitCol = iExit ForEnd IfNextFor i = 2 To lastRowIf Me.CmbSplit = "" ThendicNumber(arr(i, NumberCol)) = 1ElseIf arr(i, SplitCol) = Me.CmbSplit ThendicNumber(arr(i, NumberCol)) = 1End IfEnd IfNextarrNumber = dicNumber.keysCall SortArray(arrNumber)Me.CmbMinNumber.List = arrNumberMe.CmbMaxNumber.List = arrNumberMe.CmbMinNumber = ""Me.CmbMaxNumber = ""End Sub

代码解析:数值筛选列的change事件。

用户窗体-Sub CmbSheets_Change

Private Sub CmbSheets_Change()Dim ckBox As ControlDim ctrl As ControlshtName = Me.CmbSheetsSet xlSheet = xlBook.Sheets(shtName)Set rng = xlSheet.UsedRangearr = rng.ValuelastRow = UBound(arr, 1)lastCol = UBound(arr, 2)For i = 1 To lastColReDim Preserve tbTitle(1 To i)tbTitle(i) = arr(1, i)NextFor Each ctrl In Me.ControlsIf InStr(ctrl.Name, "CheckBox_") > 0 ThenMe.Controls.Remove ctrl.NameEnd IfNextleftPos = Me.LbColumn.Left + 10  ' 左侧位置topPos = Me.LbColumn.Top + Me.LbColumn.Height + 2 ' 复选框的顶部位置iwidth = 70'For i = 1 To lastColSet ckBox = Me.Controls.Add("Forms.CheckBox.1", "CheckBox_" & i)With ckBox.Left = leftPos.Top = topPos.Width = iwidth.Height = 20.Caption = tbTitle(i).Value = TrueEnd With'更新位置If (i) Mod 4 = 0 Then'换行leftPos = Me.LbColumn.Left + 10topPos = topPos + 20Else'同行下一个位置leftPos = leftPos + iwidthEnd IfNextMe.CmbSplitColumn.ClearMe.CmbDateColumn.ClearMe.CmbNumberColumn.ClearMe.CmbFilterColumn.ClearFor i = 1 To lastColIf IsDate(arr(2, i)) Then   '日期字段Me.CmbDateColumn.AddItem arr(1, i)ElseIf IsNumeric(arr(2, i)) Then      '数值字段Me.CmbNumberColumn.AddItem arr(1, i)Else      '除日期、数值字段,其他可供筛选字段Me.CmbFilterColumn.AddItem (arr(1, i))End IfNextMe.CmdSelect.Visible = TrueMe.CmbDateColumn = ""Me.CmbMinDate.ClearMe.CmbMaxDate.ClearMe.CmbNumberColumn = ""Me.CmbMinNumber.ClearMe.CmbMaxNumber.ClearMe.CmbFilterColumn = ""Me.CmbInclude.ClearMe.CmbExclude.ClearMe.CmbSplit.CleardateCol = 0SplitCol = 0With Me.CmbSplitColumn.Clear.List = tbTitle.Text = .List(0)End WithEnd Sub

代码解析:拆分目标工作表的change事件,窗体上的大部筛选都要重设。

用户窗体-Sub CmdChooseFile_Click

Private Sub CmdChooseFile_Click()Set xlApp = CreateObject("Excel.Application")Me.TxbExcelFile = FileSelectedfilePath = Me.TxbExcelFileIf Not filePath = "" ThenSet xlBook = xlApp.Workbooks.Open(filePath)ElseMsgBox "请选择文件!"Exit SubEnd IfFor Each sht In xlBook.WorksheetsIf sht.Cells(1, 1) <> "" ThenMe.CmbSheets.AddItem sht.NameEnd IfNextMe.CmbSheets.Text = Me.CmbSheets.List(0)shtName = Me.CmbSheetsEnd Sub

代码解析:选择拆分文件。

用户窗体-Sub CmdChoosePath_Click

Private Sub CmdChoosePath_Click()Dim preFolder As StringpreFolder = Me.TxbWordPathIf Not IsFolderExists(preFolder) ThenpreFolder = ThisWorkbook.PathEnd IfsaveFolder = PathSelectedIf Not saveFolder = "" ThenMe.TxbWordPath = saveFolderElsesaveFolder = preFolderMe.TxbWordPath = saveFolderEnd If
End Sub

代码解析:选择保存路径。

用户窗体-Sub CmbDateColumn_Change

Private Sub CmdOutPut_Click()On Error Resume NextDim arrTitle()Dim minDate As Date, maxDate As DateDim minNumber As Double, maxNumber As DoubleDim strInclude As String, strExclude As StringApplication.ScreenUpdating = FalsefilesCounter = 0t = 0For i = LBound(tbTitle) To UBound(tbTitle)If Me.Controls("CheckBox_" & i) = True Thent = 1Exit ForEnd IfNextIf t = 0 ThenMsgBox "至少选择一列"Exit SubEnd IfIf Me.OptWord ThenSet wrdApp = CreateObject("Word.Application")End If
'    wrdApp.Visible = True ' 将Word应用程序设置为可见For i = 1 To lastColIf Controls("CheckBox_" & i) ThenReDim Preserve arrTitle(k)arrTitle(k) = Controls("CheckBox_" & i).Captionk = k + 1End IfNextnewRow = UBound(arrTitle, 1)ReDim arrTem(0 To newRow, 0 To 0)For i = 0 To newRowarrTem(i, 0) = arrTitle(i)Next'日期范围If Me.CmbDateColumn <> "" ThenIf Me.CmbMinDate = "" ThenminDate = arrDate(LBound(arrDate))ElseminDate = CDate(Me.CmbMinDate)End IfIf Me.CmbMaxDate = "" ThenmaxDate = arrDate(UBound(arrDate))ElsemaxDate = CDate(Me.CmbMaxDate)End IfEnd If'金额范围If Me.CmbNumberColumn <> "" ThenIf Me.CmbMinNumber = "" ThenminNumber = CDbl(arrNumber(LBound(arrNumber)))ElseminNumber = CDbl(Me.CmbMinNumber)End IfIf Me.CmbMaxNumber = "" ThenmaxNumber = CDbl(arrNumber(UBound(arrNumber)))ElsemaxNumber = CDbl(Me.CmbMaxNumber)End IfEnd If'筛选字段If Me.CmbFilterColumn <> "" ThenIf Me.CmbInclude = "" ThenstrInclude = ""ElsestrInclude = CStr(Me.CmbInclude)End IfIf Me.CmbExclude = "" ThenstrExclude = "1234567890qwertyuiop"ElsestrExclude = CStr(Me.CmbExclude)End IfEnd IfIf Me.CmbSplitColumn = "" Then    '客户为空MsgBox "拆分字段不能为空"Exit SubEnd IfIf Me.CmbSplit = "" Then '未选具体拆分项目     第一层IFIf Me.CmbDateColumn = "" Then      '未选日期列    第二层IFIf Me.CmbNumberColumn = "" Then    '未选数值列   第三层IFIf Me.CmbFilterColumn = "" Then '未选筛选列    第四层IFFor i = LBound(arrSplit) To UBound(arrSplit)For j = 2 To lastRowIf arr(j, SplitCol) = arrSplit(i) Thenm = UBound(arrTem, 2) + 1ReDim Preserve arrTem(0 To newRow, 0 To m)For k = 0 To newRowFor n = 1 To lastColIf arr(1, n) = arrTem(k, 0) ThenarrTem(k, m) = arr(j, n)End IfNextNextEnd IfNextfileName = arrSplit(i) & "_" & Format(Now, "YYYYMMDDhhmmss") & ".docx"fileName = Replace(fileName, "\", "_")fileName = Replace(fileName, "/", "_")Call SaveToFileReDim Preserve arrTem(0 To newRow, 0 To 0)
'                     StopNextElse  '选了筛选列   e1   第四层IF elseFor i = LBound(arrSplit) To UBound(arrSplit)For j = 2 To lastRowIf arr(j, SplitCol) = arrSplit(i) And InStr(arr(j, filterCol), strInclude) > 0 _And InStr(arr(j, filterCol), strExclude) = 0 Thenm = UBound(arrTem, 2) + 1ReDim Preserve arrTem(0 To newRow, 0 To m)For k = 0 To newRowFor n = 1 To lastColIf arr(1, n) = arrTem(k, 0) ThenarrTem(k, m) = arr(j, n)End IfNextNextEnd IfNextfileName = arrSplit(i) & "_" & Format(Now, "YYYYMMDDhhmmss") & ".docx"fileName = Replace(fileName, "\", "_")fileName = Replace(fileName, "/", "_")Call SaveToFileReDim Preserve arrTem(0 To newRow, 0 To 0)NextEnd If    '第四层IF  endElse    '选了数值列  第三层IF elseIf Me.CmbFilterColumn = "" Then '未选筛选列For i = LBound(arrSplit) To UBound(arrSplit)For j = 2 To lastRowIf arr(j, SplitCol) = arrSplit(i) And CDbl(arr(j, NumberCol)) >= minNumber _And CDbl(arr(j, NumberCol)) <= maxNumber Thenm = UBound(arrTem, 2) + 1ReDim Preserve arrTem(0 To newRow, 0 To m)For k = 0 To newRowFor n = 1 To lastColIf arr(1, n) = arrTem(k, 0) ThenarrTem(k, m) = arr(j, n)End IfNextNextEnd IfNextfileName = arrSplit(i) & "_" & Format(Now, "YYYYMMDDhhmmss") & ".docx"fileName = Replace(fileName, "\", "_")fileName = Replace(fileName, "/", "_")Call SaveToFileReDim Preserve arrTem(0 To newRow, 0 To 0)NextElse  '选了筛选列 E3For i = LBound(arrSplit) To UBound(arrSplit)For j = 2 To lastRowIf arr(j, SplitCol) = arrSplit(i) And CDbl(arr(j, NumberCol)) >= minNumber _And CDbl(arr(j, NumberCol)) <= maxNumber _And InStr(arr(j, filterCol), strInclude) > 0 _And InStr(arr(j, filterCol), strExclude) = 0 Thenm = UBound(arrTem, 2) + 1ReDim Preserve arrTem(0 To newRow, 0 To m)For k = 0 To newRowFor n = 1 To lastColIf arr(1, n) = arrTem(k, 0) ThenarrTem(k, m) = arr(j, n)End IfNextNextEnd IfNextfileName = arrSplit(i) & "_" & Format(Now, "YYYYMMDDhhmmss") & ".docx"fileName = Replace(fileName, "\", "_")fileName = Replace(fileName, "/", "_")Call SaveToFileReDim Preserve arrTem(0 To newRow, 0 To 0)NextEnd IfEnd If   '第三层IF endElse    '第二层IF else  选择了日期列If Me.CmbNumberColumn = "" Then    '选择了日期列,未选数值列If Me.CmbFilterColumn = "" Then '选择了日期列,未选数值列,未选筛选列For i = LBound(arrSplit) To UBound(arrSplit)For j = 2 To lastRowIf arr(j, SplitCol) = arrSplit(i) And CDate(arr(j, dateCol)) >= minDate _And CDate(arr(j, dateCol)) <= maxDate Thenm = UBound(arrTem, 2) + 1ReDim Preserve arrTem(0 To newRow, 0 To m)For k = 0 To newRowFor n = 1 To lastColIf arr(1, n) = arrTem(k, 0) ThenarrTem(k, m) = arr(j, n)End IfNextNextEnd IfNextfileName = arrSplit(i) & "_" & Format(Now, "YYYYMMDDhhmmss") & ".docx"fileName = Replace(fileName, "\", "_")fileName = Replace(fileName, "/", "_")Call SaveToFileReDim Preserve arrTem(0 To newRow, 0 To 0)NextElse  ' '选择了日期列,未选数值列,选了筛选列For i = LBound(arrSplit) To UBound(arrSplit)For j = 2 To lastRowIf arr(j, SplitCol) = arrSplit(i) And CDate(arr(j, dateCol)) >= minDate _And CDate(arr(j, dateCol)) <= maxDate _And InStr(arr(j, filterCol), strInclude) > 0 _And InStr(arr(j, filterCol), strExclude) = 0 Thenm = UBound(arrTem, 2) + 1ReDim Preserve arrTem(0 To newRow, 0 To m)For k = 0 To newRowFor n = 1 To lastColIf arr(1, n) = arrTem(k, 0) ThenarrTem(k, m) = arr(j, n)End IfNextNextEnd IfNextfileName = arrSplit(i) & "_" & Format(Now, "YYYYMMDDhhmmss") & ".docx"fileName = Replace(fileName, "\", "_")fileName = Replace(fileName, "/", "_")Call SaveToFileReDim Preserve arrTem(0 To newRow, 0 To 0)NextEnd IfElse     '选择了日期列,选了数值列If Me.CmbFilterColumn = "" Then  '选择了日期列,选了数值列,未选筛选列For i = LBound(arrSplit) To UBound(arrSplit)For j = 2 To lastRowIf arr(j, SplitCol) = arrSplit(i) And CDate(arr(j, dateCol)) >= minDate _And CDate(arr(j, dateCol)) <= maxDate _And CDbl(arr(j, NumberCol)) >= minNumber _And CDbl(arr(j, NumberCol)) <= maxNumber Thenm = UBound(arrTem, 2) + 1ReDim Preserve arrTem(0 To newRow, 0 To m)For k = 0 To newRowFor n = 1 To lastColIf arr(1, n) = arrTem(k, 0) ThenarrTem(k, m) = arr(j, n)End IfNextNextEnd IfNextfileName = arrSplit(i) & "_" & Format(Now, "YYYYMMDDhhmmss") & ".docx"fileName = Replace(fileName, "\", "_")fileName = Replace(fileName, "/", "_")Call SaveToFileReDim Preserve arrTem(0 To newRow, 0 To 0)NextElse  '选择了日期列,选了数值列,选了筛选列For i = LBound(arrSplit) To UBound(arrSplit)For j = 2 To lastRowIf arr(j, SplitCol) = arrSplit(i) And CDate(arr(j, dateCol)) >= minDate _And CDate(arr(j, dateCol)) <= maxDate _And CDbl(arr(j, NumberCol)) >= minNumber _And CDbl(arr(j, NumberCol)) <= maxNumber _And InStr(arr(j, filterCol), strInclude) > 0 _And InStr(arr(j, filterCol), strExclude) = 0 Thenm = UBound(arrTem, 2) + 1ReDim Preserve arrTem(0 To newRow, 0 To m)For k = 0 To newRowFor n = 1 To lastColIf arr(1, n) = arrTem(k, 0) ThenarrTem(k, m) = arr(j, n)End IfNextNextEnd IfNextfileName = arrSplit(i) & "_" & Format(Now, "YYYYMMDDhhmmss") & ".docx"fileName = Replace(fileName, "\", "_")fileName = Replace(fileName, "/", "_")Call SaveToFileReDim Preserve arrTem(0 To newRow, 0 To 0)NextEnd IfEnd IfEnd IfElse    '选择了具体拆分项目If Me.CmbDateColumn = "" Then      '未选日期列    第二层IFIf Me.CmbNumberColumn = "" Then    '未选数值列   第三层IFIf Me.CmbFilterColumn = "" Then '未选筛选列    第四层IFFor j = 2 To lastRowIf arr(j, SplitCol) = Me.CmbSplit Thenm = UBound(arrTem, 2) + 1ReDim Preserve arrTem(0 To newRow, 0 To m)For k = 0 To newRowFor n = 1 To lastColIf arr(1, n) = arrTem(k, 0) ThenarrTem(k, m) = arr(j, n)End IfNextNextEnd IfNextfileName = Me.CmbSplit & "_" & Format(Now, "YYYYMMDDhhmmss") & ".docx"fileName = Replace(fileName, "\", "_")fileName = Replace(fileName, "/", "_")Call SaveToFileReDim Preserve arrTem(0 To newRow, 0 To 0)Else  '选了筛选列   e1   第四层IF elseFor j = 2 To lastRowIf arr(j, SplitCol) = Me.CmbSplit And InStr(arr(j, filterCol), strInclude) > 0 _And InStr(arr(j, filterCol), strExclude) = 0 Thenm = UBound(arrTem, 2) + 1ReDim Preserve arrTem(0 To newRow, 0 To m)For k = 0 To newRowFor n = 1 To lastColIf arr(1, n) = arrTem(k, 0) ThenarrTem(k, m) = arr(j, n)End IfNextNextEnd IfNextfileName = Me.CmbSplit & "_" & Format(Now, "YYYYMMDDhhmmss") & ".docx"fileName = Replace(fileName, "\", "_")fileName = Replace(fileName, "/", "_")Call SaveToFileReDim Preserve arrTem(0 To newRow, 0 To 0)End If    '第四层IF  endElse    '选了数值列  第三层IF elseIf Me.CmbFilterColumn = "" Then '未选筛选列For j = 2 To lastRowIf arr(j, SplitCol) = Me.CmbSplit And CDbl(arr(j, NumberCol)) >= minNumber _And CDbl(arr(j, NumberCol)) <= maxNumber Thenm = UBound(arrTem, 2) + 1ReDim Preserve arrTem(0 To newRow, 0 To m)For k = 0 To newRowFor n = 1 To lastColIf arr(1, n) = arrTem(k, 0) ThenarrTem(k, m) = arr(j, n)End IfNextNextEnd IfNextfileName = Me.CmbSplit & "_" & Format(Now, "YYYYMMDDhhmmss") & ".docx"fileName = Replace(fileName, "\", "_")fileName = Replace(fileName, "/", "_")Call SaveToFileReDim Preserve arrTem(0 To newRow, 0 To 0)Else  '选了筛选列 E3For j = 2 To lastRowIf arr(j, SplitCol) = Me.CmbSplit And CDbl(arr(j, NumberCol)) >= minNumber _And CDbl(arr(j, NumberCol)) <= maxNumber _And InStr(arr(j, filterCol), strInclude) > 0 _And InStr(arr(j, filterCol), strExclude) = 0 Thenm = UBound(arrTem, 2) + 1ReDim Preserve arrTem(0 To newRow, 0 To m)For k = 0 To newRowFor n = 1 To lastColIf arr(1, n) = arrTem(k, 0) ThenarrTem(k, m) = arr(j, n)End IfNextNextEnd IfNextfileName = Me.CmbSplit & "_" & Format(Now, "YYYYMMDDhhmmss") & ".docx"fileName = Replace(fileName, "\", "_")fileName = Replace(fileName, "/", "_")Call SaveToFileReDim Preserve arrTem(0 To newRow, 0 To 0)End IfEnd If   '第三层IF endElse    '第二层IF else  选择了日期列If Me.CmbNumberColumn = "" Then    '选择了日期列,未选数值列If Me.CmbFilterColumn = "" Then '选择了日期列,未选数值列,未选筛选列For j = 2 To lastRowIf arr(j, SplitCol) = Me.CmbSplit And CDate(arr(j, dateCol)) >= minDate _And CDate(arr(j, dateCol)) <= maxDate Thenm = UBound(arrTem, 2) + 1ReDim Preserve arrTem(0 To newRow, 0 To m)For k = 0 To newRowFor n = 1 To lastColIf arr(1, n) = arrTem(k, 0) ThenarrTem(k, m) = arr(j, n)End IfNextNextEnd IfNextfileName = Me.CmbSplit & "_" & Format(Now, "YYYYMMDDhhmmss") & ".docx"fileName = Replace(fileName, "\", "_")fileName = Replace(fileName, "/", "_")Call SaveToFileReDim Preserve arrTem(0 To newRow, 0 To 0)Else  ' '选择了日期列,未选数值列,选了筛选列For j = 2 To lastRowIf arr(j, SplitCol) = Me.CmbSplit And CDate(arr(j, dateCol)) >= minDate _And CDate(arr(j, dateCol)) <= maxDate _And InStr(arr(j, filterCol), strInclude) > 0 _And InStr(arr(j, filterCol), strExclude) = 0 Thenm = UBound(arrTem, 2) + 1ReDim Preserve arrTem(0 To newRow, 0 To m)For k = 0 To newRowFor n = 1 To lastColIf arr(1, n) = arrTem(k, 0) ThenarrTem(k, m) = arr(j, n)End IfNextNextEnd IfNextfileName = Me.CmbSplit & "_" & Format(Now, "YYYYMMDDhhmmss") & ".docx"fileName = Replace(fileName, "\", "_")fileName = Replace(fileName, "/", "_")Call SaveToFileReDim Preserve arrTem(0 To newRow, 0 To 0)End IfElse     '选择了日期列,选了数值列If Me.CmbFilterColumn = "" Then  '选择了日期列,选了数值列,未选筛选列For j = 2 To lastRowIf arr(j, SplitCol) = Me.CmbSplit And CDate(arr(j, dateCol)) >= minDate _And CDate(arr(j, dateCol)) <= maxDate _And CDbl(arr(j, NumberCol)) >= minNumber _And CDbl(arr(j, NumberCol)) <= maxNumber Thenm = UBound(arrTem, 2) + 1ReDim Preserve arrTem(0 To newRow, 0 To m)For k = 0 To newRowFor n = 1 To lastColIf arr(1, n) = arrTem(k, 0) ThenarrTem(k, m) = arr(j, n)End IfNextNextEnd IfNextfileName = Me.CmbSplit & "_" & Format(Now, "YYYYMMDDhhmmss") & ".docx"fileName = Replace(fileName, "\", "_")fileName = Replace(fileName, "/", "_")Call SaveToFileReDim Preserve arrTem(0 To newRow, 0 To 0)Else  '选择了日期列,选了数值列,选了筛选列For j = 2 To lastRowIf arr(j, SplitCol) = Me.CmbSplit And CDate(arr(j, dateCol)) >= minDate _And CDate(arr(j, dateCol)) <= maxDate _And CDbl(arr(j, NumberCol)) >= minNumber _And CDbl(arr(j, NumberCol)) <= maxNumber _And InStr(arr(j, filterCol), strInclude) > 0 _And InStr(arr(j, filterCol), strExclude) = 0 Thenm = UBound(arrTem, 2) + 1ReDim Preserve arrTem(0 To newRow, 0 To m)For k = 0 To newRowFor n = 1 To lastColIf arr(1, n) = arrTem(k, 0) ThenarrTem(k, m) = arr(j, n)End IfNextNextEnd IfNextfileName = Me.CmbSplit & "_" & Format(Now, "YYYYMMDDhhmmss") & ".docx"fileName = Replace(fileName, "\", "_")fileName = Replace(fileName, "/", "_")Call SaveToFileReDim Preserve arrTem(0 To newRow, 0 To 0)End IfEnd IfEnd IfEnd IfMsgBox "成功拆分【" & filesCounter & "】个文件"'打开拆分文件所在目录Shell "explorer.exe " & saveFolder, vbMaximizedFocusOn Error Resume NextIf Not xlBook Is Nothing Then'工作簿已打开,执行关闭xlBook.Close FalseEnd IfwrdApp.QuitxlApp.QuitSet wrdTable = NothingSet wrdDoc = NothingSet wrdApp = NothingSet xlSheet = NothingSet xlBook = NothingSet xlApp = NothingUnload MeApplication.ScreenUpdating = True
End Sub

代码解析:导出文件

1、如果没有选择“单选项目”,则会将拆分列的所有项目拆分为单独文件。

2、循环拆分项目,根据右边筛选条件,提取数据,存到数据,导出到文件。

3、代码量主要在选择判断方面。

用户窗体-其他代码


Private Sub CmdSelect_Click()If Me.CmdSelect.Caption = "全选" ThenFor i = LBound(tbTitle) To UBound(tbTitle)Me.Controls("CheckBox_" & i) = TrueNextMe.CmdSelect.Caption = "全消"Me.CmdSelect.BackColor = &HC0FFC0ElseFor i = LBound(tbTitle) To UBound(tbTitle)Me.Controls("CheckBox_" & i) = FalseNextMe.CmdSelect.Caption = "全选"Me.CmdSelect.BackColor = &H8080FFEnd If
End SubPrivate Sub OptExcel_Change()If OptExcel ThenMe.OptExcel.ForeColor = vbRedMe.OptWord.ForeColor = vbBlueElseMe.OptExcel.ForeColor = vbBlueMe.OptWord.ForeColor = vbRedEnd If
End SubPrivate Sub UserForm_Initialize()saveFolder = ThisWorkbook.PathMe.TxbWordPath = saveFolder
End SubPrivate Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)On Error Resume NextIf Not xlBook Is Nothing Then'工作簿已打开,执行关闭xlBook.Close FalseEnd IfwrdApp.QuitxlApp.QuitSet wrdTable = NothingSet wrdDoc = NothingSet wrdApp = NothingSet xlSheet = NothingSet xlBook = NothingSet xlApp = NothingEnd SubSub SaveToFile()'如果没有明细数据,导出选项If UBound(arrTem, 2) = LBound(arrTem, 2) ThenIf Not Me.CheckBox1 ThenExit SubEnd IfEnd IffilesCounter = filesCounter + 1If Me.OptExcel ThenCall SaveToExcelElseCall SaveToWordEnd If
End Sub
Sub SaveToWord()'Stop'创建新的Word文档Set wrdDoc = wrdApp.Documents.AddSet myrange = wrdDoc.Range(0, 0)With myrange.InsertBefore Me.TxbTitle & vbCrLfWith .Font.Name = "黑体".Size = 16'.Bold = TrueEnd With'.ParagraphFormat.Alignment = wdAlignParagraphCenter'.InsertParagraphAfter.Collapse Direction:=wdCollapseEndEnd WithWith wrdDoc.Paragraphs(1).Alignment = wdAlignParagraphCenterEnd With'添加新的表格Set wrdTable = wrdDoc.Tables.Add(myrange, UBound(arrTem, 2) + 1, newRow + 1)'设置表格边框格式为灰色虚线With wrdTable.Style = "网格型"End WithFor c = 1 To UBound(arrTem, 2) + 1For d = 1 To newRow + 1wrdTable.Cell(c, d).Range.Text = arrTem(d - 1, c - 1)NextNextwrdDoc.SaveAs saveFolder & "\" & fileNamewrdDoc.Close SaveChanges:=False
End SubSub SaveToExcel()'原来导出的是word文件,扩展名改一下fileName = Replace(fileName, ".docx", ".xlsx")Workbooks.AddWith ActiveWorkbookIf Me.CkbTitle Then.Sheets(1).Range(Cells(1, 1), Cells(1, UBound(arrTem, 1) + 1)).MergeCells = True.Sheets(1).Range("A1") = Me.TxbTitle.Sheets(1).Range("A1").HorizontalAlignment = xlCenter.Sheets(1).Range("A2").Resize(UBound(arrTem, 2) + 1, UBound(arrTem, 1) + 1) = Application.WorksheetFunction.Transpose(arrTem)Else.Sheets(1).Range("A1").Resize(UBound(arrTem, 2) + 1, UBound(arrTem, 1) + 1) = Application.WorksheetFunction.Transpose(arrTem)End If.SaveAs fileName:=saveFolder & "\" & fileName.CloseEnd With
End Sub

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1556752.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

最强AI绘画大模型Flux可以在SDWebUI 上使用了!超便捷的Flux模型使用教程!AI绘画零基础入门到实战教程

大家好&#xff0c;我是画画的小强 目前最强的AI绘画大模型Flux.1 横空出世有段时间了&#xff0c;模型效果也得到了广泛的认可&#xff0c;但是 Stable Diffusion WebUI 官方迟迟没有跟进&#xff0c;据说是因为要修改很多底层的处理机制&#xff0c;加之ComfyUI如火如荼&…

C++读取大文件三种方法速度比较

目录 测试说明第一种方法&#xff1a;按块读&#xff0c;一次读8kb第二种方法&#xff1a;按行读&#xff0c;一次读一行第三种方法&#xff1a;多线程并行读取完整示例 测试说明 测试文件&#xff1a;100万行&#xff0c;每一行是两个小数&#xff0c;中间用逗号隔开&#xf…

LeetCode讲解篇之377. 组合总和 Ⅳ

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 总和为target的元素组合个数 可以由 总和为target - nums[j]的元素组合个数 转换而来&#xff0c;其中j为nums所有元素的下标 而总和target - nums[j]的元素组合个数 可以由 总和为target - nums[j] - nums[k]的…

谁喝酒 1.3.0 | 这款聚会游戏完全免费,无需注册登录,简洁易用。

适合聚会时玩的游戏APP&#xff0c;完全免费&#xff0c;无需注册登录。 大小&#xff1a;36M 百度网盘&#xff1a;https://pan.baidu.com/s/1nkUi4W3UhMyEsnAiSoOP9g?pwdolxt 夸克网盘&#xff1a;https://pan.quark.cn/s/239397c0c894 移动网盘&#xff1a;https://caiyun…

【英语】4. 熟词僻义

文章目录 前言e.g.总结参考文献 前言 进行英语前后缀的复习 e.g. spell: 咒语 时期want: povertyaddress: 强调&#xff0c;地址&#xff0c;演讲bear: stand, endureblow: blast &#xff0c;冲击chair: 主席的位置 &#xff0c;掌管 chair a company fuel: add 燃料&#x…

融乐·Music 1.1.3 | 专为音乐爱好者打造,海量免费音乐资源

融乐Music提供了海量免费音乐资源&#xff0c;满足各种类型的音乐需求。界面简洁&#xff0c;操作方便&#xff0c;支持在线播放和离线下载。 大小&#xff1a;13.6M 百度网盘&#xff1a;https://pan.baidu.com/s/1AVKX747bvteAcO__3o1KCQ?pwdolxt 夸克网盘&#xff1a;http…

【含开题报告+文档+PPT+源码】基于SSM框架的线上交易商城的设计与实现

开题报告 随着互联网的快速发展&#xff0c;电子商务成为了现代化社会中不可或缺的一部分。线上交易平台的兴起&#xff0c;为商家和消费者创造了更多的交易机会和便利。然而&#xff0c;传统的电商平台通常由一家中央机构管理和控制&#xff0c;对商家和消费者的自由度有一定…

JWT集成Keycloak

一、直接使用现有域账号、密码获取token方式 1.KeyClack 使用现有配置 Client id : account-console 2.服务配置文件配置 3.API接口配置 4. 获取token 5.调用方式&#xff08;Swagger&#xff09;(代码方式直接在请求头加上token) 5.1 配置在Swagger访问 5.2 访问需要认证的接…

【JavaEE初阶】深入理解线程池的概念以及Java标准库提供的方法参数分析

前言 &#x1f31f;&#x1f31f;本期讲解关于MySQL索引事务&#xff0c;希望能帮到屏幕前的你。 &#x1f308;上期博客在这里&#xff1a;【JavaEE初阶】多线程案列之定时器的使用和内部原码模拟-CSDN博客 &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl…

Python酷库之旅-第三方库Pandas(134)

目录 一、用法精讲 601、pandas.DataFrame.plot.pie方法 601-1、语法 601-2、参数 601-3、功能 601-4、返回值 601-5、说明 601-6、用法 601-6-1、数据准备 601-6-2、代码示例 601-6-3、结果输出 602、pandas.DataFrame.plot.scatter方法 602-1、语法 602-2、参数…

【C++】入门基础介绍(下)输入输出,函数重载,缺省与引用

文章目录 7. C输入与输出8. 缺省参数9. 函数重载10. 引用10. 1 引用的概念10. 2 引用的特性10. 3 引用的使用10. 4 const引用10. 5 指针和引用的关系 11. inline12. nullptr 7. C输入与输出 iostream是 Input Output Stream 的缩写&#xff0c;是标准输入、输出流库&#xff0…

BFS解决最短路问题_最小基因变化、单词接龙_C++

BFS解决最短路问题_最小基因变化、单词接龙_C 1. 题目解析2. 算法分析3. 代码实现4. 举一反三&#xff1a;单词接龙 1. 题目解析 leetcode链接&#xff1a;https://leetcode.cn/problems/minimum-genetic-mutation/submissions/569463000/ 基因序列可以表示为一条由 8 个字符组…

【计算机网络】面试必问TCP十大机制

1. TCP协议的报文格式 说明&#xff1a; TCP 报文格式主要分为两部分&#xff1a;TCP 报文头部和数据部分。以下是对各字段的详细解释&#xff1a; TCP 报文头部 源/目的端口&#xff1a;各占用16位。表示数据从哪个进程发送&#xff0c;发送到哪个进程去。序号字段&#xff1a…

千古风流人物 陆游

简介 陆游&#xff08;1125年-1210年&#xff09;&#xff0c;字务观&#xff0c;号放翁&#xff0c;越州山阴&#xff08;今浙江绍兴&#xff09;人&#xff0c;南宋诗人、词人。后人每以陆游为南宋诗人之冠。是中国南宋时期的著名文学家、词人、政治家和军事家。 陆游出生在…

基于SpringBoot+Vue+MySQL的药品信息管理系统

系统展示 管理员界面 医生界面 员工界面 系统背景 随着医疗技术的不断提升&#xff0c;药品在治疗疾病中扮演着越来越重要的角色。传统的药品管理方式以人工方式为主&#xff0c;但人工管理难以满足现代社会快速发展的需求。因此&#xff0c;需要一种更加高效、便捷的信息化管理…

FLORR.IO画廊(2)

指南针&#xff08;超级&#xff09; 是Florr.io的一种辅助花瓣&#xff0c;用于指示超级生物的位置。 基础&#xff08;超级&#xff09; 是florr.io的一种攻击型花瓣&#xff0c;玩家在初次游玩时即获得5个基本&#xff0c;个数不随着等级改变而改变&#xff0c;基本不可合成…

C++之模版进阶篇

目录 前言 1.非类型模版参数 2.模版的特化 2.1概念 2.2函数模版特化 2.3 类模板特化 2.3.1 全特化和偏特化 2.3.2类模版特化应用实例 3.模版分离编译 3.1 什么是分离编译 3.2 模板的分离编译 3.3 解决方法 4. 模板总结 结束语 前言 在模版初阶我们学习了函数模版和类…

erlang学习:Linux命令学习9

sed命令介绍 sed全称是&#xff1a;Stream EDitor&#xff08;流编辑器&#xff09; Linux sed 命令是利用脚本来处理文本文件&#xff0c;sed 可依照脚本的指令来处理、编辑文本文件。Sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等 sed 的运行…

四川全寄宿自闭症学校专业团队详解

在广州市的一隅&#xff0c;有一所名为星贝育园的特殊教育学校&#xff0c;它远离城市的喧嚣与纷扰&#xff0c;为自闭症儿童提供了一个宁静、安全的学习与生活环境。这所学校致力于通过全方位的教育和照顾&#xff0c;帮助自闭症儿童在这个充满挑战的世界中寻找到属于自己的快…