Excel VBA - 使用VBA创建新的格式化工作簿

时间:2012-09-04 16:39:09

标签: excel vba excel-vba

我正在尝试编写程序的最后一部分,我需要从Access文档中提取数据并将其打印到新的工作簿中。

首先,我将获取产品供应商的名称并使用每个供应商名称创建工作表,然后我想循环遍历每个工作表并打印订购的每个供应商的产品。

我真的很想解决如何打开新工作簿并打印我的信息。

4 个答案:

答案 0 :(得分:6)

由于我之前的答案被删除(被认为是“不足”),我必须提供更好的答案。

如果要从Access输出数据,则必须执行以下步骤:

  1. 创建(或打开)新工作簿
  2. 阅读您的数据
  3. 将数据写入工作簿
  4. 格式化工作簿中的数据
  5. 我将专注于数据输出,并保留格式化(数据部分是复杂的...格式化很容易)

    首先,您需要在Access文件中启用Excel对象:工具菜单>引用。找到 Microsoft Excel 12.0对象库并激活该复选框。现在,您可以在服务中获得完整的Excel库: - )

    现在是数据处理的时候了。我将假设你需要创建一个新的工作簿:

    public sub createExcelFile()
        dim XL as Excel.Application, WB as Excel.Workbook, WKS as Excel.Worksheet
        dim db as DAO.database, rec as DAO.recordset, f as DAO.field
        dim i as integer, j as integer
    
        ' Prepare your Excel stuff
        Set XL = new Excel.Application
        XL.Visible = True
        Set WB = XL.Workbooks.Add 
        WB.Activate
        Set WKS = WB.ActiveSheet ' Default: The first sheet in the newly created book
    
        ' Read your data here
        set db = currentdb()
        set rec = db.openrecordset("tblSampleData")
    
        ' A simple table that will show the data from rec
        ' i and j will be the coordiantes of the active cell in your worksheet
        with rec
            .movefirst
    
            ' The table headers
            i = 1
            j = 1
            for each f in .fields
                WKS.cells(i,j).value = f.name
                j = j + 1
            next f
    
            ' The table data
            do
                i = i+1
                j = 1
                for each f in .Fields
                    WKS.cells(i,j).value = f.value
                    j = j+1
                next f     
                .moveNext     
            loop until .EOF
        end with
    end sub
    

    如果要格式化单元格,可以使用WKS.cells(i,j)(或WKS.range(...))属性。

    看看我之前留下的链接(Siddarth Rout很乐意转到评论)。

    我希望这有助于你

答案 1 :(得分:1)

Option Compare Database
Public Function format(filepath, sheetname)


Set xls = CreateObject("EXCEL.APPLICATION")
xls.screenupdating = False
xls.displayalerts = False
xls.Visible = True
xls.workbooks.Open filepath
Set xlsdd = xls.ActiveWorkbook

'删除标题

xls.Range("1:1").Select
xls.Selection.Delete Shift:=xlUp

'添加一列

    xls.Columns("A:A").Select
   xls.Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove

'adding 5 rows

“ActiveWorkbook.Sheets( ”工作表Sheet“)。选择

xls.Rows("1:5").Insert Shift:=xlDown

'从访问中获取行并将它们放入excel

strsql = "select top 5 " & sheetname & ".* into top5_records from " & sheetname
DoCmd.RunSQL strsql
outputFileName = "C:\Users\hp\Desktop\top5_records.xls"
 DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, "top5_records",    outputFileName, True

'然后打开excel并复制行

Set xls2 = CreateObject("EXCEL.APPLICATION")
xls2.screenupdating = False
xls2.displayalerts = False
xls2.Visible = True
xls2.workbooks.Open outputFileName
Set xlsdd2 = xls.ActiveWorkbook
 xls2.Rows("1:5").Select
 xls2.Selection.Copy
  xls.Cells(1, 1).Select
 xls.activesheet.Paste



     '  Dim currdb As DAO.Database
'  Dim rst As DAO.Recordset
'
'  Set currdb = CurrentDb
'  Set rst = currdb.OpenRecordset(strsql) '<<<Opens query recordset via DAO
'  rst.MoveLast
'  rowsToReturn = rst.RecordCount
'  Set rng = xls.Cells(1, 1)
'  'copy specified number of records to worksheet
'
'rng.CopyFromRecordset rst, rowsToReturn '<<<Gets all records in recordset

'将第6行设为粗体

 xls.Rows("6:6").Select
  With xls.Selection.Font
  .Bold = True
  .Name = "Arial"
    .Size = 10
    .Strikethrough = False
    .Superscript = False
    .Subscript = False
    .OutlineFont = False
    .Shadow = False
End With

'自动调整数据

xls.Sheets(sheetname).Cells.Columns.autofit
xls.CutCopyMode = False
With xlsdd
.Save
.Close
End With
xls.Visible = False

Set xlsdd = Nothing
Set xls = Nothing

End Function

答案 2 :(得分:0)

您可以将列/行宽度定义为静态像素数量或自动调整,粗体等内容是预定义的

示例

Selection.Font.Bold = True

您还可以制作模板电子表格,将内容复制到模板中并另存为。 你的帖子并没有说明实际需要做多少格式化。

答案 3 :(得分:0)

你没有提供很多细节,所以我不能给你很多细节作为回报。但是我会这样做:

  1. 使用两张工作表手动创建新工作簿
  2. 在一张工作表上,添加一个外部数据表,该表返回供应商名称列表,如SELECT SupplierName FROM tblSuppliers WHERE Active = True;或类似的东西。
  3. 创建一个使用该查询表动态扩展的工作簿级命名范围
  4. 在第二张表格中,添加一个外部数据表,例如SELECT * FROM Orders WHERE SupplierName =? (这将是参数查询)。在第3行启动该外部数据表
  5. 我排了一个组合框,指向供应商列表。
  6. 现在VBA很简单

    ThisWorkbook.RefreshAll
    

    您可以在一张纸上更换供应商,而不是每个供应商一张纸。以下是您需要的技能

    • 创建外部数据表
    • 创建参数查询(旧参考http://www.dicks-clicks.com/excel/ExternalData6.htm
    • 创建动态扩展范围名称
    • 添加指向不同工作表上的范围的组合框或数据验证
    • 上面的SQL显然不对,但我假设您可以编写正确的SQL语句

    您应该能够找到所有这些的详细信息,但如果没有,请发布另一个问题。