RLE Excel中的文本单元格数组
我有一个Excel文件,其中包含另一个程序的输出。 其格式为: 我想用VBA宏对其进行RLE编码,格式类似于: 例如:RLE Excel中的文本单元格数组,excel,vba,encoding,run-length-encoding,Excel,Vba,Encoding,Run Length Encoding,我有一个Excel文件,其中包含另一个程序的输出。 其格式为: 我想用VBA宏对其进行RLE编码,格式类似于: 例如: 0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00将被编码为 4,0xff,4,0x00 表示为一个单元格,其中包含第一个字符的出现次数0xff,直到行中的值发生变化,然后以下一个字符的重复次数开始新的计数 有没有一种方法可以更简单地做到这一点,而我只是没有看到 这可能会给你一些想法: Function RLE(items As Variant)
0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00将被编码为 4,0xff,4,0x00 表示为一个单元格,其中包含第一个字符的出现次数0xff,直到行中的值发生变化,然后以下一个字符的重复次数开始新的计数
有没有一种方法可以更简单地做到这一点,而我只是没有看到 这可能会给你一些想法:
Function RLE(items As Variant) As Collection
'Takes a 1-dimensional array of items and returns a collection
'which consists of alternating counts and items
Dim item As Variant, count As Long
Dim i As Long
Dim Col As New Collection
item = items(LBound(items))
count = 1
For i = LBound(items) + 1 To UBound(items)
If items(i) = item Then
count = count + 1
Else
Col.Add count
Col.Add item
item = items(i)
count = 1
End If
Next i
Col.Add count
Col.Add item
Set RLE = Col
End Function
'for testing purposes:
Function JoinCollection(C As Collection, Optional delim As String = "") As String
Dim A As Variant
Dim i As Long, n As Long
n = C.count
ReDim A(1 To n)
For i = 1 To n
A(i) = C(i)
Next i
JoinCollection = Join(A, delim)
End Function
例如,在即时窗口中:
?JoinCollection(RLE(Array("H","T","T","T","H","H","T","H","H","H","T")))
1H3T2H1T3H1T
另一个简单的方法。这将把编码值放在数据下面3行,如图所示。 可以根据您的要求修改代码,以便将输出放在其他工作表/工作簿中
Sub test()
Dim Rw As Long, Col As Long, Trw As Long, Tcol As Long, PrvVal As Variant, Val As Variant, Cnt As Long
Rw = 1
Trw = ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row + 3 'Target row modify according to
'Trw = 20
With ActiveSheet
PrvVal = .Cells(Rw, 1).Value
Do While PrvVal <> ""
Col = 1
Tcol = 1
Cnt = 0
Do
Val = .Cells(Rw, Col).Value
If Val = PrvVal Then
Cnt = Cnt + 1
Else
.Cells(Trw, Tcol).Value = Cnt & " " & PrvVal
PrvVal = Val
Cnt = 1
Tcol = Tcol + 1
If Val = "" Then
Cnt = 0
Exit Do
End If
End If
Col = Col + 1
Loop
Rw = Rw + 1
Trw = Trw + 1
PrvVal = .Cells(Rw, 1).Value
Loop
End With
End Sub
子测试()
Dim Rw为长型,Col为长型,Trw为长型,Tcol为长型,PrvVal为变型,Val为变型,Cnt为长型
Rw=1
Trw=ActiveSheet.Range(“A”&Rows.Count)。End(xlUp)。Row+3'目标行根据修改
“Trw=20
使用ActiveSheet
PrvVal=.Cells(Rw,1).Value
当PrvVal“”时执行
Col=1
Tcol=1
Cnt=0
做
Val=.Cells(Rw,Col).Value
如果Val=PrvVal,则
Cnt=Cnt+1
其他的
.Cells(Trw,Tcol).Value=Cnt&''&PrvVal
PrvVal=Val
Cnt=1
Tcol=Tcol+1
如果Val=”“,则
Cnt=0
退出Do
如果结束
如果结束
Col=Col+1
环
Rw=Rw+1
Trw=Trw+1
PrvVal=.Cells(Rw,1).Value
环
以
端接头
请编辑问题,添加您尝试过的代码,并指定您遇到的确切问题。目前的问题与主题无关,“有没有更简单的方法……”比什么更简单?如果不知道您当前编写此宏的方法,很难说是否有更简单的方法。此外,您的描述也不清楚。您是单独对每一行进行运行长度编码,还是可以从一行运行到下一行?谢谢,这给了我足够的工作来完成此例程。VBA是一种我不习惯使用的语言。通常情况下,我只是硬件方面的人,但需要快速整理一些数据,以便进行新的设计。当我获得了满足我需求的完整解决方案后,我将使用所使用的完整脚本进行更新。@R.Greenway欢迎对代码实现的任何进一步查询(如果在我的范围内)。谢谢John。我现在明白了。我相信我有足够的资源来满足我的需求。