VBA - 将数字拆分为特定长度并分成 2 列

问题描述

我正在开发一种工具,在该工具中特定表格被过滤,输出到另一个工作表,然后提交到 word。过滤后的部分也给出并提交给word。这是介绍。

Target Now:通过将数字分成两部分来指定过滤数据,并将一部分提交到附加列。

过滤器代码

Sub Unique_Values_Worksheet_Variables()
    Dim wb As Workbook: Set wb = ThisWorkbook
    Dim sws As Worksheet: Set sws = wb.Worksheets("export")
    Dim dws As Worksheet,rng As Range
Set dws = wb.Worksheets.Add(After:=wb.Sheets(wb.Sheets.Count))
sws.Range("C:C").AdvancedFilter _
    Action:=xlFiltercopy,_
    copyToRange:=dws.Range("A:A"),_
    Unique:=True
          
dws.Columns("A:A").EntireColumn.AutoFit
Set rng = dws.Range("A1",dws.Cells(Rows.Count,1).End(xlUp))


rng.Borders(xlDiagonalDown).Linestyle = xlNone
With rng.Borders()
    .Linestyle = xlContinuous
    .ColorIndex = 0
    .TintAndShade = 0
    .Weight = xlThin
End With

ActiveWindow.displayGridlines = False

End Sub

结果是:

enter image description here

(感谢本论坛的合作)

现在我想按数字拆分 A 列。这意味着最小数字长度为 4 个数字(最后 4 个数字)的每一行都应被拆分并转移到紧贴列。如果有最后 4 位数字的长度要提交到 B 列,则“其余”应保留在 A 列中。

示例:

  1. Cell(2,A) = 是空白的'不需要
  2. Cell(3,A) = 1 '不需要,它不再显示
  3. Cell(6,A) = 40218 ' 这将被分成 4 个剩余的列 A、0218转移到B列

事实是,最后 4 位数字总是要提交到下一列,如果有 4 位数字,则 这4位数字前面的“rest”应保留在A列。

解决方法

按字符数拆分

  • 您可能希望在拆分后应用格式。
Option Explicit

Sub Unique_Values_Worksheet_Variables()
    
    Const Chars As Long = 4
    
    Dim wb As Workbook: Set wb = ThisWorkbook
    Dim sws As Worksheet: Set sws = wb.Worksheets("export")
    Dim dws As Worksheet:
    Set dws = wb.Worksheets.Add(After:=wb.Sheets(wb.Sheets.Count))
    
    sws.Range("C:C").AdvancedFilter _
        Action:=xlFilterCopy,_
        CopyToRange:=dws.Range("A:A"),_
        Unique:=True
          
    dws.Columns("A:A").EntireColumn.AutoFit
    Dim rng As Range:
    Set rng = dws.Range("A1",dws.Cells(dws.Rows.Count,1).End(xlUp))
    rng.Borders(xlDiagonalDown).LineStyle = xlNone
    
    With rng.Borders()
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With

    splitByChars rng.Resize(rng.Rows.Count - 1).Offset(1),Chars
    
    ActiveWindow.DisplayGridlines = False

End Sub

Sub splitByChars( _
        ByRef rg As Range,_
        ByVal Chars As Long)
    
    Dim Data As Variant: Data = rg.Value
    Dim rCount As Long: rCount = UBound(Data,1)
    Dim cCount As Long: cCount = 1
    
    Dim cSize As Long
    Dim r As Long,c As Long
    Dim iLen As Long,fLen As Long,rLen As Long
    Dim iString As String,rString As String
    
    For r = 1 To rCount
        iString = CStr(Data(r,1))
        iLen = Len(iString)
        If iLen >= Chars Then
            fLen = iLen Mod Chars
            Data(r,1) = Left(iString,fLen)
            rLen = iLen - fLen
            cSize = rLen / Chars + 1
            rString = Mid(iString,fLen + 1,rLen)
            If cSize > cCount Then
                cCount = cSize
                ReDim Preserve Data(1 To rCount,1 To cSize)
            End If
            For c = 2 To cSize
                Data(r,c) = Mid(rString,(c - 2) * Chars + 1,Chars)
                Debug.Print r,c,Data(r,c)
            Next c
        End If
    Next r
    
    With rg.Resize(,cCount)
        .NumberFormat = "@"
        .Value = Data
    End With

End Sub
,

感谢@VBasic2008

我现在进一步开发了以下内容

  • 将名称“Produkthierachie”更改为“Produktgruppe”
  • 在活动工作表上输入 Cell.Value(1,2) 到“Serie”
  • 按行将 B 列框起来
  • 删除中间的所有行

enter image description here

我现在想要实现的是将 B 列“Serie”中的所有项目加入一个由逗号分隔的单元格,如果该系列拥有相同的 Produktgruppe“产品组”。

enter image description here

这应该可以用 If 分支或 do 循环还是?

Sub Unique_Values_Worksheet_Variables()
    
    Const Chars As Long = 4
    
    Dim wb As Workbook: Set wb = ThisWorkbook
    Dim sws As Worksheet: Set sws = wb.Worksheets("export")
    Dim dws As Worksheet:
    Set dws = wb.Worksheets.Add(After:=wb.Sheets(wb.Sheets.Count))
    
    sws.Range("C:C").AdvancedFilter _
        Action:=xlFilterCopy,_
        Unique:=True
          
    dws.Columns("A:B").EntireColumn.AutoFit
    Dim rng As Range:
    Set rng = dws.Range("A1:B1",1).End(xlUp))
    rng.Borders(xlDiagonalDown).LineStyle = xlNone
    rng.HorizontalAlignment = xlCenter
    
    
    With rng.Borders()
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
        
    End With
    
    Cells(1,1).Value = "Produktgruppe"
    Cells(1,2).Value = "Serie"

    splitByChars rng.Resize(rng.Rows.Count - 1).Offset(1),Chars
    
    ActiveWindow.DisplayGridlines = False

    End Sub

    Sub splitByChars( _
        ByRef rg As Range,c)
            Next c
            
            Else
            Data(r,1) = ""
            
        End If
    Next r
    
    With rg.Resize(,cCount)
        .NumberFormat = "@"
        .Value = Data
    End With
    
    On Error Resume Next
    
     With rg
    .Value = .Value
    .SpecialCells(xlCellTypeBlanks).EntireRow.Delete
     End With

End Sub