测试某个字符串范围的较短方法

时间:2017-03-30 05:04:54

标签: excel vba excel-vba

尝试创建将Excel发票表导出为PDF的代码到指定的文件路径。该路径基于发票是否列出某个产品ProductX。

这就是我想出来的,但是在一个范围内遍历每个单元格以查看ProductX是否存在似乎很麻烦。

有更简单的方法吗?感谢任何帮助!

Sub ExportToPDF()
'
Dim file_path As String
Dim search_range As Range
Dim each_cell As Range

' Set search_range as desired search range
Set search_range = ActiveSheet.Range("A53:R56")

For Each each_cell In search_range.Cells
    If InStr(1, each_cell.Value, "ProductX", vbTextCompare) Then
        file_path = Some_path_A
    Else: file_path = Some_path_B
    End If
Next each_cell

'Export the sheet as PDF
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, FileName:=file_path, Quality:=xlQualityStandard _
        , IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:= _
        True
End Sub

4 个答案:

答案 0 :(得分:10)

您可以使用Find进行部分匹配。

此代码假定返回的路径包含您需要的 filepath 变量 - 您可能需要调整它。

Dim rng1 As Range
Set rng1 = ActiveSheet.Range("A53:R56").Find("ProductX", , xlFormulas, xlPart)
If rng1 Is Nothing Then Exit Sub

ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=rng1.Value, Quality:=xlQualityStandard _
        , IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:= _
        True

答案 1 :(得分:3)

根据 brettdj 建议的内容,您可以使用以下建议的代码...

a

答案 2 :(得分:1)

我认为最简短的方法如下:

If WorksheetFunction.CountIf(ActiveSheet.Range("A53:R56"), "*ProductX*") = 0 Then Exit Sub

可以进一步简化为:

If WorksheetFunction.CountIf(Range("A53:R56"), "*ProductX*") = 0 Then Exit Sub

因为ActiveSheet默认 ragnge worksheet资格

答案 3 :(得分:1)

有一种方法可以通过一行代码找到确切的代码,但是如果你在1列上搜索,它只会起作用。对于您的情况,我认为它会起作用,因为通常产品名称将在一列中。代码如下:

Dim test As Variant
Product = "ProductX"
' Set search_range as desired search range
search_range = Application.WorksheetFunction.Transpose(Sheets(1).Range("A53:A56"))
If UBound(Filter(search_range, Product)) > -1 Then
    file_path = Some_path_A
Else
    file_path = Some_path_B
End If

您可以尝试一下,如果这对您有用,请告诉我。如果不是,我会尝试找到一种方法来使用多列并改进答案