Excel 使用文本字符串将特定字符前的特定单词斜体化

Excel 使用文本字符串将特定字符前的特定单词斜体化,excel,vba,Excel,Vba,我在Excel中有500个单元格,其中一些单元格包含如下文本字符串: 圆形(8):黑色(4)、红色(2)、黄色(2); 非形状9; 大方块12:黑色6,红色4,黄色2“ 单元格范围还包含其他文本字符串,但没有一个包含冒号“:” 我需要一种将“圆”和“大正方形”以及冒号前的数字斜体化的方法 数字会因范围内的每个单元格而异,但文本不会;然而,文本的顺序可能会发生变化,“圆”可能在“大正方形”之后 “Non-Shape”不需要斜体,冒号后面的数字也不需要斜体,而是在下一个字符串之前 问题是文本字符串的

我在Excel中有500个单元格,其中一些单元格包含如下文本字符串:

圆形(8):黑色(4)、红色(2)、黄色(2); 非形状9; 大方块12:黑色6,红色4,黄色2“

单元格范围还包含其他文本字符串,但没有一个包含冒号“:”

我需要一种将“圆”和“大正方形”以及冒号前的数字斜体化的方法

数字会因范围内的每个单元格而异,但文本不会;然而,文本的顺序可能会发生变化,“圆”可能在“大正方形”之后

“Non-Shape”不需要斜体,冒号后面的数字也不需要斜体,而是在下一个字符串之前

问题是文本字符串的长度会因区域中不同单元格的数字变化而变化,我只想将此应用于包含单词“圆形”和“大正方形”的区域中的单元格

我想写一个VBA脚本,将单元格范围内字符串中的特定文本斜体化。 如果有人能帮上忙,我们将不胜感激

Sub Italicize()

Dim c As Range
Dim i As Long
Dim lngPos As Integer
Dim length As Integer

For Each c In Range("L7:L500")

For i = 1 To 1000
    lngPos = InStr(c.Value, "Rate variance (" & i & "):")
    length = Len("Rate variance (" & i & "):")
    If lngPos > 0 Then
        With c.Characters(Start:=lngPos, length:=length - 1).Font
            .FontStyle = "Italic"
        End With
    End If

    lngPos = InStr(c.Value, "Prior per adj (" & i & "):")
    length = Len("Prior per adj (" & i & "):")
    If lngPos > 0 Then
        With c.Characters(Start:=lngPos, length:=length - 1).Font
            .FontStyle = "Italic"
        End With
    End If
Next i

Next c

End Sub
我已经编辑了代码,但单词已经更改,因为现在我正在excel中处理实际单词。我相信我仍然缺少一些组件。 1)我没有声明我在哪张纸上 2.)数字也可能包含小数 3.)我应该提到,我试图格式化的范围实际上是一个通过excel中的索引匹配公式返回文本字符串的公式。这也会是一个问题吗?如果是这样,我可以将范围更改为实际文本,然后再将其索引到我想要的工作表中

要回答您的问题,Bobby,请通过您对我的评论的回复: 1.范围已更新 2.范围转到第500行,任何给定单元格内的数字可以跨越到1000,并且可以是混合数字,例如101.4 3.字符串中单词的大小写确实发生了变化,但它似乎不起作用,即使是那些遵循编码格式的单词,例如“比率差异” 有没有办法解释资本化的变化?字符串中的第一个单词将被大写,除此之外没有其他内容。 4.每个单词和数字之间有1个空格,数字和冒号之间没有空格

简要回顾: 我已经将“圆形”更改为“速率差异”,将“大正方形”更改为“每调整一次之前”,作为我想要格式化的数字


我非常感谢你在这方面的帮助。

对于这种情况,你可以使用Instr。Instr所做的是在较大字符串中搜索特定字符串,如果找到,则返回起始位置(在下面的示例中定义为LNGPO)

然而,Instr不支持任何“通配符”或类似的搜索,这是一个问题,因为数字在您的情况下会有所不同。然而,由于我们只处理数字,我们可以通过循环一组数字(在下面的示例中,我们循环数字1-100)轻松绕过这个问题。当我们找到匹配的文本时,lngPos值将大于0

下面还定义了一个名为Length的变量。这只是您正在搜索的字符串的字符长度。我们需要知道这一点,这样我们才能格式化正确数量的字符

使用这些信息(起始位置和长度),我们可以编写一个with语句来格式化指定的字符

Sub Format_Text()

Dim c As Range
Dim i As Integer
Dim lngPos As Integer
Dim length As Integer

For Each c In Range("A1:A10")

    For i = 1 To 100
        lngPos = InStr(c.Value, "Round Circles (" & i & "):")
        length = Len("Round Circles (" & i & "):")
        If lngPos > 0 Then
            With c.Characters(Start:=lngPos, length:=length - 1).Font
                .FontStyle = "Italic"
            End With
        End If

        lngPos = InStr(c.Value, "Large Squares (" & i & "):")
        length = Len("Large Squares (" & i & "):")
        If lngPos > 0 Then
            With c.Characters(Start:=lngPos, length:=length - 1).Font
                .FontStyle = "Italic"
            End With
        End If
    Next i

Next c

End Sub
供你自己使用。将范围(“A1:A10”)更改为您需要的任何范围。将i=1的更改为100,使其成为您正在使用的任何数字范围


如果您有任何问题或需要调试帮助,请告诉我您提供的其他信息确实会改变这种情况。我理解有时候信息可能很敏感,但下次请尽量更明确

首先,正如您在编辑的注释中所提到的,您需要将其转换为值才能工作

其次,因为我们使用的是小数,所以我们需要更新循环语句。让我们将i定义为双精度而不是整数,这样我们就可以使用小数。然后我们需要增加循环的步长。在下面的示例中,我添加了步骤0.01。另外,因为excel有时会很奇怪,我还包括了一个四舍五入(I,2)语句,这将结果保留在小数点后2位

最后,考虑到资本化的差异,让我们用UCase调整我们的仪器,使一切资本化。别担心,这不会影响结果

这可能不是最好的方法,因为现在您将循环通过500个单元格x 100000个潜在数字,但希望它能完成这项工作

Sub Italicize()

Dim c As Range
Dim i As Double
Dim lngPos As Integer
Dim length As Integer


For Each c In Worksheets("Sheet1").Range("L7:L500")

c.Value = c.Value

    For i = 1 To 1000 Step 0.01
        lngPos = InStr(UCase(c.Value), "RATE VARIANCE (" & Round(i, 2) & "):")
        length = Len("RATE VARIANCE (" & Round(i, 2) & "):")
        If lngPos > 0 Then
            With c.Characters(Start:=lngPos, length:=length - 1).Font
                .FontStyle = "Italic"
            End With
        End If

        lngPos = InStr(UCase(c.Value), "PRIOR PER ADJ (" & Round(i, 2) & "):")
        length = Len("PRIOR PER ADJ (" & Round(i, 2) & "):")
        If lngPos > 0 Then
            With c.Characters(Start:=lngPos, length:=length - 1).Font
                .FontStyle = "Italic"
            End With
        End If
    Next i

Next c

End Sub

欢迎来到堆栈溢出!你能告诉我们你已经做了什么吗?如果人们能更好地理解你的问题,他们会更愿意帮助你。你好,鲍比,谢谢你的快速回复。我似乎很难让它发挥作用。它没有出问题,但似乎没有做任何事情,我确信这是我的错。我是这个网站的新手,我似乎无法在评论框中发布我的代码来向您展示我所做的编辑,就像您在上面所做的那样。你能告诉我你是怎么做到的吗?@JackFD,好吧,太简单了!让我们来排除故障。1.检查范围(“A1:A10”),并确保已更新到您的单元格范围。2.你的数字有多高?将i=1的值更新为100,以符合您的要求。3.Instr是特定于具体情况的,因此请检查资本化是否是原因。4.单词(如圆形)与数字(如8)之间的间距是多少?是单空格、双空格还是制表符?间距一致吗?5.与文件中的文本相比,我们在宏中编写的文本中的任何其他变化,让我们根据Instr的要求进行双重检查match@JackFD,也不要认为你可以在答案的注释中添加代码,我只会编辑你原来的问题。在底部键入代码,然后在格式栏中,您应该会看到