gpt4 book ai didi

vba - 我应该如何用 vba 完成这个复杂的字符串替换?

转载 作者:行者123 更新时间:2023-12-04 21:39:57 24 4
gpt4 key购买 nike

我需要完成以下任务:

before

变成

after

基本上在数字标题之间插入空格(1.0、1.1、1.2,如果不存在则插入空格......)

并且如果一个数字不存在,添加它。(如“之前”图片中缺少 2.0 和 6.0)

我想出了如何创建一个数组来检查数据,如下所示:

Dim myRange As Range, c As Range
Dim x As Integer, i As Integer, arSize As Integer, y As Integer
Dim myArray() As String
x = 1
arSize = Int(Range("B" & Rows.Count).End(xlUp).Row)
ReDim myArray(1 To arSize)
Set myRange = Range("B1", Cells(Rows.Count, "B").End(xlUp))
For Each c In myRange
If IsEmpty(c) = True Then
myArray(x) = 0
Else
If IsNumeric(Left(c, 1)) = True Then
myArray(x) = Val(Left(c, 1))
Else: myArray(x) = -1
End If
End If
x = x + 1
Next
'for debugging:
For i = 1 To UBound(myArray)
Range("F" & i).Value = myArray(i)
Next i
End Sub

(如果第一个字符是数字,则将该数字添加到数组元素中;如果不是数字,则将该元素设置为-1,如果为空则将该元素设置为0)

只需要一些建议或如何操作数据以实现目标的示例。非常感谢。任何帮助表示赞赏。

最佳答案

您的想法在数据管理/迭代方面似乎或多或少清晰,尽管您为这个特定问题选择的方法对我来说似乎不是理想的方法。我宁愿依赖 Excel 单元格而不是数组(能够存储更多信息,易于复制并且具有与您可以关联的目标格式等效的结构)。就解释所有必需的更改而言不太容易,我更喜欢写下一个算法来执行你想要的 Action (具有讽刺意味的是,在不久前批评了这个过程之后:))。请记住,此代码依赖于“临时列”(默认为 C)来存储所有更改,该更改在整个过程完成后被清除。请随时询问任何不清楚的地方(我发布此内容是为了让您了解一切,而不仅仅是执行它)。

Dim col2 As String: col2 = "C"
Dim firstRow As Integer: firstRow = 2
Set myRange = Range("B" & firstRow, Cells(Rows.Count, "B").End(xlUp))
Dim prevIndex As Integer: prevIndex = 1
Dim curRow As Long: curRow = firstRow - 1
For Each c In myRange
curRow = curRow + 1
Dim consecutive As Integer: consecutive = 0
If Not IsEmpty(c) Then
Dim written As Boolean: written = False
Dim numRightBefore As Boolean: numRightBefore = False
If IsNumeric(Left(c, 1)) = True Then
Dim curIndex As Integer: curIndex = CInt(Left(c, 1))
If (curIndex <> prevIndex) Then
If (curIndex < prevIndex) Then
'Something went wrong
Exit For
Else
If (curIndex = prevIndex + 1) Then
'Normal situation -> consecutive index
prevIndex = curIndex
If (consecutive <> 0) Then
Range(col2 & curRow).Value = ""
curRow = curRow + 1
End If
Else
Do While (curIndex > prevIndex + 1)
If (consecutive = 0) Then
Range(col2 & curRow).Value = ""
consecutive = 1
Else
curRow = curRow + 1
End If
prevIndex = prevIndex + 1
Range(col2 & curRow).Value = CStr(prevIndex) & ".0 text"
curRow = curRow + 1
Loop
prevIndex = prevIndex + 1
Range(col2 & curRow).Value = ""
curRow = curRow + 1
End If
End If
End If
End If

If (Not written) Then
Range(col2 & curRow).Value = c.Value
End If
consecutive = curIndex
End If
Next


Range(col2 & firstRow & ":" & col2 & curRow).Copy
myRange.PasteSpecial
Range(col2 & firstRow & ":" & col2 & curRow).Clear

注意: 不建议创建太大的数组 .确切的限制取决于计算机的能力(它的内存)和当前条件(正在运行的进一步程序)。另外应该指出的是,我过去确实遇到过一些使用 VBA 和大阵列的问题,因此我更愿意在这里更加谨慎。通常(在任何编程语言中),我很少声明大小超过 5000 的一维数组。

注2: 读取/写入 Excel 单元格 从性能的角度来看,这是一种非常糟糕的方法。 我一般不建议依赖这个 (甚至默认情况下也没有)。我认为在这些特定条件下这是一个好主意:输入数据的大小不明确以及描述 OP 可能能够轻松关联的方法。我个人会依赖数组,并且在一定大小上依赖临时文件(比从 Excel 读取/写入快得多)。

关于vba - 我应该如何用 vba 完成这个复杂的字符串替换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18658971/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com