簡體   English   中英

如果單元格值不相等,則VBA / EXCEL在特定行上拆分excel文件

[英]VBA/EXCEL Split excel file on specific row if cells value are not equal

我對分割的excel文件沒什么問題。 我的情況是我有一個文件,例如有10k行,我想每1k行拆分一次,但是最重要的是第二條語句,它應該說如果我們在1k行上並且b行中的單元格的值等於前一個單元格,那么當它們不相等時,我們應該拆分文件。

現在,我可以拆分excel文件並保存,但是我不知道如何編寫if語句是否擁有循環。 我的if語句:

 If counter = 1500 And require.Value <> require.Offset(-1).Value Then

還有一點,文件中MAX行必須為1500,且不包含標題

這是我的代碼:

Sub SplitRowsToFiles()

Dim wb As Workbook
Dim saveFile As String
Dim WorkRng As Range
Dim WR As Range
Dim last As Double
Dim counter As Double
Dim part As Double
Dim name As String

Dim string1 As String
Dim string11 As String
Dim string12 As String
Dim Taba() As String
Dim value1 As Double
Dim header As Range
Dim require As Range


On Error Resume Next

xTitleId = "Export To TXT"

Set require = Range("b140:b14000")

Set WorkRng = Application.Selection
Set WorkRng = Application.InputBox("Range", xTitleId, "A2:C11", Type:=8)
Set header = Application.Selection
Set header = Application.InputBox("Header range", xTitleId, "A1:C1", Type:=8)
Set WR = WorkRng
saveFile = Application.GetSaveAsFilename

With ActiveSheet.UsedRange

    last = .Cells(1, 1).Row + .Rows.Count - 1

  End With
  MsgBox "ab" & last & "ab"

string1 = WorkRng.Address()

Taba() = Split(string1, ":")

string11 = Mid(Taba(0), 4)
string12 = Mid(Taba(1), 4)

value1 = Val(string12) - Val(string11) + 1


For counter = 0 To last
If counter = 1500 And require.Value <> require.Offset(-1).Value Then

part = part + 1
Application.ScreenUpdating = True
Application.DisplayAlerts = False
Set wb = Application.Workbooks.Add
Set WR = Union(header, WR)
WR.Copy
wb.Worksheets(1).Paste
name = saveFile & part & ".xls"
wb.SaveAs Filename:=name, FileFormat:=xlExcel8, CreateBackup:=False
wb.Close
Application.CutCopyMode = False
Application.DisplayAlerts = True
Application.ScreenUpdating = False
Set WorkRng = WorkRng.Offset(value1)
Set WR = WorkRng
counter = counter + value1
Else
End If
Next


End Sub

謝謝!

以下將原始文件拆分為多個“拆分”文件,以使每個“拆分”文件將至少具有“ blkSize”行,包括標題(目前,根據您的問題陳述,“ blkSize”設置為1000)並且不超過'blkSize'+'maxLimit'行(目前將maxlimit設置為500)-因此包括標頭在內的行不超過1500。

我假設原始文件中的前“ hdrSize”行是要復制到每個文件的標頭,作為前幾行(“ hdrSize”當前為1)。

如果在“ B”列中沒有重復項,那么您將獲得“ blkSize”行的“拆分”文件,但最后一個將僅包含剩余的行。 如果在拆分發生時“ B”列中有重復項,您將獲得從“ blkSize”到“ blkSize” +“ maxLimit”行的可變大小文件大小。 由於每個拆分文件的長度可能會有所不同,具體取決於“ B”列中重復項的數量,因此在運行代碼之前您不會知道將生成多少個文件。

您可以根據需要在代碼頂部設置以下每個變量:“ hdrSize”,“ blkSize”和“ maxLimit”。

Option Explicit


Sub SplitRowsToFiles()

  Dim hdrSize As Integer: hdrSize = 1
  Dim blkSize As Integer:  blkSize = 1000 - hdrSize
  Dim maxLimit As Integer: maxLimit = 500

  Dim wb As Workbook
  Dim wrkSht As Worksheet
  Dim saveFile As String, name As String
  Dim WR As Range, header As Range

  Set wrkSht = ActiveSheet
  Set header = wrkSht.Rows("1:" & hdrSize)

  saveFile = Application.GetSaveAsFilename

  Dim last As Integer
  With wrkSht.UsedRange
    last = .Rows.Count
  End With

  Dim i As Integer, j As Integer
  Dim limit As Integer, part As Integer
  part = 0
  i = hdrSize + 1 ' skip the header

  Do While True

    j = i + blkSize - 1
    If j <= last Then
      ' process from blkSize to blkSize+maxLimit rows
      limit = j + maxLimit
      Do While Cells(j, "B") = Cells(j + 1, "B") And _
           j < limit And j < last
        j = j + 1
      Loop
    Else
      ' otherwise process up to the last row
      j = last
    End If

    Application.ScreenUpdating = True
    Application.DisplayAlerts = False

     Set wb = Application.Workbooks.Add 
     Set WR = wrkSht.Rows(i & ":" & j)

     header.Copy wb.Worksheets(1).Rows("1:" & hdrSize)
     WR.Copy wb.Worksheets(1).Rows(hdrSize + 1)

     part = part + 1
     name = saveFile & part & ".xls"
     wb.SaveAs Filename:=name, FileFormat:=xlExcel8, CreateBackup:=False
     wb.Close

    Application.DisplayAlerts = True
    Application.ScreenUpdating = False

    i = j + 1
    If i > last Then Exit Do

  Loop

End Sub

我尚未對此進行測試,但是我認為您只是缺少一個達到極限(1500)並重置為零(受B列不匹配)的計數器。 我用過pcounter (p代表'partial')

嘗試這個:

Sub SplitRowsToFiles()

Dim wb As Workbook
Dim saveFile As String
Dim WorkRng As Range
Dim WR As Range
Dim last As Double
Dim counter As Double
Dim pcounter As Double
Dim part As Double
Dim name As String

Dim string1 As String
Dim string11 As String
Dim string12 As String
Dim Taba() As String
Dim value1 As Double
Dim header As Range
Dim require As Range


On Error Resume Next

xTitleId = "Export To TXT"

Set require = Range("b140:b14000")

Set WorkRng = Application.Selection
Set WorkRng = Application.InputBox("Range", xTitleId, "A2:C11", Type:=8)
Set header = Application.Selection
Set header = Application.InputBox("Header range", xTitleId, "A1:C1", Type:=8)
Set WR = WorkRng
saveFile = Application.GetSaveAsFilename

With ActiveSheet.UsedRange
    last = .Cells(1, 1).Row + .Rows.Count - 1
End With

MsgBox "ab" & last & "ab"

string1 = WorkRng.Address()

Taba() = Split(string1, ":")

string11 = Mid(Taba(0), 4)
string12 = Mid(Taba(1), 4)

value1 = Val(string12) - Val(string11) + 1

pcounter = 0

For counter = 0 To last
    If pcounter > 1500 And require.Value <> require.Offset(-1).Value Then
        pcounter = 0
        part = part + 1
        Application.ScreenUpdating = True
        Application.DisplayAlerts = False
        Set wb = Application.Workbooks.Add
        Set WR = Union(header, WR)
        WR.Copy
        wb.Worksheets(1).Paste
        name = saveFile & part & ".xls"
        wb.SaveAs Filename:=name, FileFormat:=xlExcel8, CreateBackup:=False
        wb.Close
        Application.CutCopyMode = False
        Application.DisplayAlerts = True
        Application.ScreenUpdating = False
        Set WorkRng = WorkRng.Offset(value1)
        Set WR = WorkRng
        counter = counter + value1
    Else
        pcounter = pcounter + 1
    End If
Next
Application.ScreenUpdating = True
Application.DisplayAlerts = False    

End Sub

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM