Excel VBA – 使用VBA创build一个新的,格式化的工作簿

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

首先,我将采用产品供应商的名称和每个供应商的名称创build一个工作表,然后我想循环遍历每张纸,并打印来自每个订购的供应商的产品。

我真的很费力地围绕如何打开一个新的工作簿,并打印我的信息。

正如我以前的答案被删除(被认为“不足”),我必须提供一个更好的答案。

如果您想要将数据从Access输出到Excel,则必须按照以下步骤操作:

  1. 创build(或打开)一个新的工作簿
  2. 阅读您的数据
  3. 将您的数据写入工作簿
  4. 格式化工作簿中的数据

我将专注于数据输出,并将格式化(数据部分是复杂的…格式很容易)

首先,您需要启用Access文件中的Excel对象:工具菜单>参考。 findMicrosoft Excel 12.0对象库并激活checkbox。 现在你有完整的Excel库在你的服务:-)

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

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很乐意接受评论)。

我希望这可以帮助你

 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( “Sheet1中”)。select

 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 

您可以将列/行宽度定义为静态像素量或自适应,粗体等事物是预定义的

  Selection.Font.Bold = True 

您也可以制作模板电子表格,将内容复制到模板中并另存为。 您的post并不表明实际需要完成多less格式。

你没有提供很多细节,所以我不能给你很多细节作为回报。 但是,我将如何做到这一点:

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

现在VBA很简单

 ThisWorkbook.RefreshAll 

而不是每个供应商一张,您将有一张表格供您更换供应商。 这里是你需要的技能

  • 创build一个外部数据表
  • 创build一个参数查询(老参考http://www.dicks-clicks.com/excel/ExternalData6.htm
  • 创builddynamic扩展范围名称
  • 添加一个combobox或数据validation,指向不同的工作表上的范围
  • 上面的SQL显然是不正确的,但我认为你可以写出正确的SQL语句

你应该能够find所有的细节,但如果没有,发表另一个问题。