excel - 根据另一个单元格的内容将格式应用于单元格的一部分
问题描述
我正在尝试根据另一个单元格的内容将特定格式应用于单元格的一部分。
我是一名 VBA 初学者,并且已经能够根据字符串中的位置将不同的格式应用于单元格的某些部分,但不能比这更进一步。
表 1,F 列有 SKU 的字符串(用逗号分隔)。一旦对该产品进行了检查,我想将单个 SKU 设为粗体。我正在将数据导入表 2,其中 D 列包含已检查产品的 SKU。
总而言之,我希望表 1 上 F 列中的字符串中的单个 SKU 为粗体,基于表 2 上 D 列中该 SKU 的存在
任何人都可以协助提供必要的 VBA 代码吗?如有任何帮助,我将不胜感激。
(我搜索了很多论坛,目前还没有找到答案)
编辑:我发现了以下内容,并且可以使用它。它虽然基于设置变量,但不是动态的:
Sub test()
For row_num = 1 To 13
'Cell contents
cell_text = Cells(row_num, 1)
'Same contents split into three parts and saved in an array
text_array = Split(cell_text, " ")
'Length of part 1
length_1 = Len(text_array(0))
'Length of part 2
length_2 = Len(text_array(1))
'Set ITALICS for Part 1
Cells(row_num, 1).Characters(1, length_1).Font.Color = vbGreen
'Set BOLD for Part 2
Cells(row_num, 1).Characters(length_1 + 2, length_2).Font.Bold =
True
Next
End Sub
这仍然是一个假设性问题,但是两列内容的一个非常小的示例在以下文件中
解决方案
好的,所以如果理解正确并基于您的文本“总而言之,我希望表 1 上 F 列中的字符串中的单个 SKU 为粗体,基于表 2 上 D 列中该 SKU 的存在”您想要:
- 遍历 Sheets(2) 上 D 列中的行。
- 在 Sheets(1) 的 F 列中查找任何匹配项。
- 在字符串中突出显示(粗体文本)该数字。
我会尽力让你朝着正确的方向前进:
1)。首先,您要动态地遍历 Sheets(2) 上 D 列中的所有行。很多方法可以做到这一点,但我个人喜欢使用.UsedRange
. 例如:
Dim CL As Range
For Each CL In Sheets(2).UsedRange.Columns(4).Rows
'Your code Part 2
Next CL
2)。现在您必须在 Sheets(1) 的 F 列中找到这些值的匹配项。一个聪明/快速的方法是利用.FindNext
查看价值部分。实际上,这看起来像这样:
Dim CLL as Range
Dim FirstAddress as String
With Sheets(1).Columns(6)
Set CLL = .Find(What:=CL.Value, LookIn:=xlValues, Lookat:=xlPart)
If Not CLL Is Nothing Then
FirstAddress = CLL.Address
Do
'You code Part 3
Set CLL = .FindNext(CLL)
Loop While Not CLL Is Nothing And CLL.Address <> FirstAddress
End If
End With
3)。现在我们正在寻找包含我们正在寻找的值的适当单元格,我们需要确定我们的值在整个字符串中的位置。我们可以为此使用一些方便的东西,称为.InStr
. 这个函数的作用是确定我们的值的第一个字符在整个字符串中的位置。在实践中,它看起来像这样:
Dim POS as Long
POS = InStr(1, CLL.Value, CL.Value)
“1”表示我们要从字符串中的哪个位置开始搜索。CLL.Value 是我们查找的整个字符串,使 CL.Value 成为我们的搜索值。
4)。现在我们能够指出我们的字符串从哪里开始并且我们想知道我们的搜索值的长度,我们可以使用该.Len
函数来产生一个数值。
=Len(CL.Value)
5)。快到了吧?只需使用 . 将字符加粗即可.Characters
。我们可以设置一个Bold
设置True
。它非常好,像这样使用:
CLL.Characters(POS, Len(CL.Value)).Font.Bold = True
POS
这里用作我们的起始位置,而LEn(CL.Value)
显然是我们需要的粗体长度。
6)。我们到了。如果我们将所有这些拼凑在一起:
Sub CreateBold()
Dim CL As Range, CLL As Range
Dim FirstAddress As String
Dim POS As Long
For Each CL In Sheets(2).UsedRange.Columns(4).Rows
With Sheets(1).Columns(6)
Set CLL = .Find(What:=CL.Value, LookIn:=xlValues, Lookat:=xlPart)
If Not CLL Is Nothing Then
FirstAddress = CLL.Address
Do
POS = InStr(1, CLL.Value, CL.Value)
CLL.Characters(POS, Len(CL.Value)).Font.Bold = True
Set CLL = .FindNext(CLL)
Loop While Not CLL Is Nothing And CLL.Address <> FirstAddress
End If
End With
Next CL
End Sub
希望这确实回答了您的问题,并且已经足够清晰可以理解。
推荐阅读
- regex - 替换@之前的所有字符
- python - 如何在使用 BERT 的掩码语言建模中将表情符号添加到我的标记器?
- javascript - 我可以将其他脚本动态加载到现有工作人员中吗?
- python - 如何从数据框中的下一列中获取数据
- php - Laravel 8. Eloquent 模型工厂(播种,数据库测试)。如果模型已经存在,如何不创建模型?
- android - 每次单击登录按钮时都会重建登录小部件
- facebook - 适用于 Android/Unity 的 Facebook SDK:更改活动(类)名称而不影响实时应用?
- opencv3.0 - 在为增强现实构建应用程序配置时,如何解决以下问题我收到以下错误:
- ruby-on-rails - Rails: UnknownAttribute Error - How do I make my model "know" attributes in the first place in Rails6?
- linux - 如何在登录文件之前剥离标准输出?