根据另一个单元格的内容将格式应用于单元格的一部分



我正在尝试根据另一个单元格的内容将特定格式应用于单元格的一部分。

我是 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 的存在">您想要:

  • 循环遍历工作表 (2( 上 D 列中的行。
  • 在工作表 (1( 的 F 列中查找任何匹配项。
  • 突出显示(粗体文本(字符串中的该数字。

我会尽力让你朝着正确的方向前进:

首先,您要动态遍历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(.现在,您必须在工作表(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

希望这确实回答了您的问题,并且已经足够清晰地理解。

最新更新