Excel 使用文本字符串将特定字符前的特定单词斜体化
我在Excel中有500个单元格,其中一些单元格包含如下文本字符串: 圆形(8):黑色(4)、红色(2)、黄色(2); 非形状9; 大方块12:黑色6,红色4,黄色2“ 单元格范围还包含其他文本字符串,但没有一个包含冒号“:” 我需要一种将“圆”和“大正方形”以及冒号前的数字斜体化的方法 数字会因范围内的每个单元格而异,但文本不会;然而,文本的顺序可能会发生变化,“圆”可能在“大正方形”之后 “Non-Shape”不需要斜体,冒号后面的数字也不需要斜体,而是在下一个字符串之前 问题是文本字符串的长度会因区域中不同单元格的数字变化而变化,我只想将此应用于包含单词“圆形”和“大正方形”的区域中的单元格 我想写一个VBA脚本,将单元格范围内字符串中的特定文本斜体化。 如果有人能帮上忙,我们将不胜感激Excel 使用文本字符串将特定字符前的特定单词斜体化,excel,vba,Excel,Vba,我在Excel中有500个单元格,其中一些单元格包含如下文本字符串: 圆形(8):黑色(4)、红色(2)、黄色(2); 非形状9; 大方块12:黑色6,红色4,黄色2“ 单元格范围还包含其他文本字符串,但没有一个包含冒号“:” 我需要一种将“圆”和“大正方形”以及冒号前的数字斜体化的方法 数字会因范围内的每个单元格而异,但文本不会;然而,文本的顺序可能会发生变化,“圆”可能在“大正方形”之后 “Non-Shape”不需要斜体,冒号后面的数字也不需要斜体,而是在下一个字符串之前 问题是文本字符串的
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,也不要认为你可以在答案的注释中添加代码,我只会编辑你原来的问题。在底部键入代码,然后在格式栏中,您应该会看到