【问题标题】:why does this not loop through drop down list为什么这不循环通过下拉列表
【发布时间】:2016-02-17 11:46:57
【问题描述】:

我有这段代码,它应该遍历下拉列表中的每个项目。选择下一个项目时,应更新主工作表。然后创建工作表的pdf。发生的情况是它在每个项目之后创建一个 pdf NAMED,但内容与第一个项目相比没有变化。我基本上有 50 个第 1 项的 pdf,称为 50 种不同的东西。而我想要以每件事命名的 50 个事物的 50 个 pdf 文件?任何帮助表示赞赏

Sub Create_pdf_pack()

 Dim inputRange As Range
 Dim c As Range
 Set inputRange = Evaluate(Range("AD5").Validation.Formula1)
 For Each c In inputRange
    ActiveSheet.ExportAsFixedFormat _
    Type:=xlTypePDF, _
    fileName:="C:\test\" & c.Value, _
    Quality:=xlQualityStandard, _
    IncludeDocProperties:=True, _
    IgnorePrintAreas:=False, _
    OpenAfterPublish:=False

    Next c

End Sub

【问题讨论】:

  • 您总是导出相同的ActiveSheet,您可能希望根据 c 的值更改导出的工作表。也许Sheet(c.Value).ExportAsFixedFormat ...,但不确定,因为你没有解释 inputrange 的内容是什么。
  • 下拉列表中有公司名称。当从列表中选择新公司时,页面会更新该公司信息。所以我一直在使用 Sheet1,它始终是 ActiveSheet。到目前为止,ActiveSheet 是唯一一种在 pdf 上生成表格的方法,问题是它显然没有循环遍历列表,因为它只提供第一家公司的信息?
  • 您的代码不会更新工作表,因为它不会更新在组合框中做出的选择,您只是在运行组合框中的可用值。您可以尝试更新 AD5 单元格的值并在导出之前计算每个值的工作表。

标签: vba excel pdf


【解决方案1】:

这是我上一条评论对应的代码。 它应该检索验证值(来自 ComboBox 的值)并为每个可能的值更改 [AD5] 中的值,然后计算工作表并将其导出。

Sub Create_pdf_pack()
    Dim inputRange As Range
    Dim c As Range
    Set inputRange = Evaluate(Range("AD5").Validation.Formula1)
    For Each c In inputRange
        [AD5] = c.Value
        'you might need to refresh the sheet here
        ActiveSheet.Calculate
        ActiveSheet.ExportAsFixedFormat _
            Type:=xlTypePDF, _
            fileName:="C:\test\" & c.Value, _
            Quality:=xlQualityStandard, _
            IncludeDocProperties:=True, _
            IgnorePrintAreas:=False, _
            OpenAfterPublish:=False
    Next c
End Sub

【讨论】:

  • 谢谢您,先生 :) 如果可以的话,还有一个问题!如果我想修改它以将活动工作表另存为新的 Excel 工作簿。我试过 ActiveSheet.SaveAs fileformat:=52, filename:=...... 等等,但得到一个错误“需要对象?
【解决方案2】:

您可能忘记修改下拉列表的值(名为 c 的变量?)。该值被读取并添加到 pdf 名称中,但不会被修改。

现在,在 for 循环中只有一条用于创建 pdf 的指令,因此,它是唯一执行的操作。

尝试将字段的修改添加到循环中。

希望对你有帮助。

【讨论】:

    【解决方案3】:

    如果 数据验证 已设置为支持它,您的编码应该可以工作。这很容易验证。

    如果我像这样设置 DV

    并运行您的代码的缩短版本:

    Sub qwerty()
        Dim inputRange As Range
        Dim c As Range, msg As String
    
        Set inputRange = Evaluate(Range("AD5").Validation.Formula1)
    
        msg = inputRange.Address & vbCrLf & vbCrLf
        For Each c In inputRange
            msg = msg & c.Address & vbTab & "C:\test\" & c.Value & vbCrLf
        Next c
        MsgBox msg
    End Sub
    

    我明白了:

    先试试我的短节目。

    编辑#1:

    从您的 cmets 中,尝试替换:

    ActiveSheet.ExportAsFixedFormat _
    

    与:

    c.ExportAsFixedFormat _
    

    编辑#2:

    我们可能正在接近。我认为每个 c 代表 DV 列表中的一个单个单元格,并且每个 c 都包含要导出的单元格块。如果是这种情况,请替换:

    ActiveSheet.ExportAsFixedFormat _
    

    用线条:

        Dim rng As Range
        Set rng = Range(c.Text)
        rng.ExportAsFixedFormat _
    

    【讨论】:

    • 我得到了同样的东西,但我的价值观。我认为问题在于,在下拉列表中选择下一个值时,它可能不会激活/刷新工作表。选择列表中的下一个项目后,有没有办法“激活/刷新”页面?或者可能会在选择工作后保存工作表?
    • @IIJHFII 您的代码将整个工作表导出五十次............您没有导出工作表的范围!
    • 哦!我工作表中的单元格 AD5 是一个下拉列表,其中每个项目都会更改工作簿 Sheet1 中的值。计划是为下拉列表中的每个值导出 Sheet1!我怎样才能为此目的修改代码?
    • @IIJHFII 查看我的 EDIT1
    • 不幸的是,c.ExportAsFixedFormat 只打印了列表中值为 c 的 pdf。然后我尝试了 c.Worksheet.ExportAsFixedFormat 但这也不会打印 Sheet 1 工作表。下拉列表在表 1 中,这就是我认为 Active.Worksheet 可以工作的原因。选择 c 值后,是否有一行代码可以“刷新”页面?顺便说一句,到目前为止,我非常感谢您的帮助:)
    【解决方案4】:

    也许这可以帮助你:

            Public mainSheets(3) As String
    
        Public Function setMainSheets()
            mainSheets(0) = "sheet1"
            mainSheets(1) = "sheet2"
            mainSheets(2) = "sheet3"
        End Function
    
        Public Function hasMainSheet(search As String, arrey As Variant) As Boolean
          hasMainSheet = (UBound(Filter(arrey, search)) > -1)
        End Function
    
        function yourFunction()
        setMainSheets
            For Each plan In Worksheets
                    If (Not hasMainSheet(plan.Name, mainSheets)) Then
        your code here
        end if
        next
    end function
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-28
      • 2017-04-22
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      相关资源
      最近更新 更多