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

时间:2018-08-22 12:20:49

标签: excel vba formatting

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

我是VBA的初学者,并且能够根据字符串中的位置将不同的格式应用于单元格的某些部分,但不能超出此范围。

第1页的F列包含SKU字符串(以逗号分隔)。在对该产品执行检查后,我想将SKU设为粗体。 我将数据导入表2,其中D列包含已检查产品的SKU。

因此,总而言之,我希望基于工作表2的D列中该SKU的存在,将工作表1的F列中的字符串中的单个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

这仍然是一个假设的问题,但是以下文件中有两列内容的一个很小的例子

Example data

1 个答案:

答案 0 :(得分:0)

好的,因此,如果正确理解并基于您的文本”“总而言之,我希望表格1的F列中的字符串中的单个SKU以粗体显示,工作表2” 您要:

  • 浏览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

希望这能回答您的问题,并且已经足够清楚地理解。