Excel VBA – 使用VBA创build一个新的,格式化的工作簿
我试图编写我的程序的最后一部分,我需要从一个Access文档中提取数据并将其打印到一个新的工作簿中。
首先,我将采用产品供应商的名称和每个供应商的名称创build一个工作表,然后我想循环遍历每张纸,并打印来自每个订购的供应商的产品。
我真的很费力地围绕如何打开一个新的工作簿,并打印我的信息。
正如我以前的答案被删除(被认为“不足”),我必须提供一个更好的答案。
如果您想要将数据从Access输出到Excel,则必须按照以下步骤操作:
- 创build(或打开)一个新的工作簿
- 阅读您的数据
- 将您的数据写入工作簿
- 格式化工作簿中的数据
我将专注于数据输出,并将格式化(数据部分是复杂的…格式很容易)
首先,您需要启用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格式。
你没有提供很多细节,所以我不能给你很多细节作为回报。 但是,我将如何做到这一点:
- 用两张纸手动创build一个新的工作簿
- 在一张表上,添加一个外部数据表,该表返回供应商名称列表,如SELECT SupplierName FROM tblSuppliers WHERE Active = True; 或类似的东西。
- 创build一个工作簿级别的命名范围,dynamic扩展该查询表
- 在第二张纸上,添加一个外部数据表,如SELECT * FROM Orders WHERE SupplierName =? (这将是一个参数查询)。 在第3行中启动该外部数据表
- 我排,把一个combobox指向供应商名单。
现在VBA很简单
ThisWorkbook.RefreshAll
而不是每个供应商一张,您将有一张表格供您更换供应商。 这里是你需要的技能
- 创build一个外部数据表
- 创build一个参数查询(老参考http://www.dicks-clicks.com/excel/ExternalData6.htm )
- 创builddynamic扩展范围名称
- 添加一个combobox或数据validation,指向不同的工作表上的范围
- 上面的SQL显然是不正确的,但我认为你可以写出正确的SQL语句
你应该能够find所有的细节,但如果没有,发表另一个问题。