2016-02-17 71 views
-1

这不是循环我有这样的代码应通过在下拉列表中的每个项循环。当选择下一个项目时,它应该更新主工作表。然后创建工作表的pdf。什么情况是它创建的每个项目命名的PDF格式,但内容不从第一项改变。我基本上有50个项目1的pdf,称为50个不同的东西。尽管我想要50篇文章,每篇文章都以50个名字命名?任何帮助表示赞赏为什么通过下拉列表

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 
+1

您总是导出相同的'ActiveSheet',您可能想要根据c的值更改您导出的工作表。也许'Sheet(c.Value).ExportAsFixedFormat ...',但不确定,因为你没有解释输入范围的内容是什么。 –

+0

下拉列表中有公司名称。当从列表中选择新公司时,该页面将更新该公司的信息。所以我总是使用Sheet1,它总是ActiveSheet。 ActiveSheet是迄今为止生成pdf表单的唯一方法,麻烦在于,它显然不会循环访问列表,因为只能提供第一个公司的信息? – IIJHFII

+0

您的代码不会更新工作表,因为它不会更新组合框中所做的选择,而只是运行组合框中可用的值。您可以尝试更新AD5单元格的值,并在导出之前计算每个值的工作表。 –

回答

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 
+0

谢谢你亲切先生:)一个额外的问题,如果我虽然可以!如果我想修改这个以将活动工作表保存为新的Excel工作簿。我曾尝试过ActiveSheet.SaveAs文件格式:= 52,文件名:= ......等,但得到“对象需要? – IIJHFII

0

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

因为它是现在,在for循环中只有一个用于创建PDF指令,因此,它是执行的唯一动作。

尝试到外地的修改加入到循环。

希望它能帮助你。

0

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

如果我成立DV像:

enter image description here

并运行代码的简化版本:

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 

我得到:

enter image description here

尝试我的首先是短节目。

编辑#1:

从您的意见,尝试更换:

ActiveSheet.ExportAsFixedFormat _ 

有:

c.ExportAsFixedFormat _ 

编辑#2:

我们可能会接近。我想,每个Ç代表在DV列表单细胞和每个Ç包含电池块的地址出口。如果是这样的话,那么替换:

ActiveSheet.ExportAsFixedFormat _ 

与线:

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

我得到同样的东西,但与我的价值观。我认为问题在于,在下拉列表中选择下一个值时,它可能不会激活/刷新工作表。在列表中的下一项被选中后,有没有办法“激活/刷新”页面?或者可能在选择工作后保存工作表? – IIJHFII

+0

@IIJHFII您的代码导出**整个工作表**五十次.........您不在**工作表内导出一个范围**! –

+0

哦!我的工作表中的单元格AD5是一个下拉列表,其中每个项目更改我的工作簿Sheet1中的值。计划是为下拉列表中的每个值导出Sheet1!我怎样才能为此目的修改代码? – IIJHFII

0

也许这可以帮助你:

 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