I have the following VBA codes which is working but I wonder how it could be made shorter and more efficient. I have Access 2010 and Excel 2007
I have a table called TempBudget in my Access database made up from the previous year incomes and expenses by month. I want to transfer this table(106 rows and 16 columns) to Excel as it is easier to manipulate spreadsheet in Excel. When I am satisfied with the budget, I want to transfer the table(spreadsheet) back to Access. I want to do everything thru VBA coding.
I tried to transfer the table to Excel with the DoCmd.Output and Docmd.TransferSpreadsheet but both don't transfer table with the xlsm format. I needed a way to get to an Excel file which included macro. [FONT="]Here is the code:[/FONT]
[/code]On Error Resume Next
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12, "TempBudget", "C:\Data\FinancialProgram\TempBudget"
Call BudgetToExcel(BudgetYear)
Sub BudgetToExcel(BudgetYear)
' Late Binding (Needs no reference set)
Dim oXL As Object
Dim oExcel As Object
Dim sFullPath As String
Dim sPath As String
' Create a new Excel instance
Set oXL = CreateObject("Excel.Application")
On Error Resume Next
oXL.UserControl = True
On Error GoTo 0
Select Case (BudgetYear)
Case "2012"
On Error GoTo ErrHandle
sFullPath = CurrentProject.Path & "\Budget2012.xlsm"
Case "2013"
On Error GoTo ErrHandle
sFullPath = CurrentProject.Path & "\Budget2013.xlsm"
Case "2014"
On Error GoTo ErrHandle
sFullPath = CurrentProject.Path & "\Budget2014.xlsm"
Case "2015"
On Error GoTo ErrHandle
sFullPath = CurrentProject.Path & "\Budget2015.xlsm"
Case "2016"
On Error GoTo ErrHandle
sFullPath = CurrentProject.Path & "\Budget2016.xlsm"
Case "2017"
On Error GoTo ErrHandle
sFullPath = CurrentProject.Path & "\Budget2017.xlsm"
Case "2018"
On Error GoTo ErrHandle
sFullPath = CurrentProject.Path & "\Budget2018.xlsm"
Case "2019"
On Error GoTo ErrHandle
sFullPath = CurrentProject.Path & "\Budget2019.xlsm"
Case "2020"
On Error GoTo ErrHandle
sFullPath = CurrentProject.Path & "\Budget2020.xlsm"
Case "2021"
On Error GoTo ErrHandle
sFullPath = CurrentProject.Path & "\Budget2021.xlsm"
Case "2022"
On Error GoTo ErrHandle
sFullPath = CurrentProject.Path & "\Budget2022.xlsm"
End Select
' Open it
With oXL
.Visible = True
.Workbooks.Open (sFullPath)
End With
ErrExit:
Set oXL = Nothing
Exit Sub
ErrHandle:
oXL.Visible = False
MsgBox Err.Description
GoTo ErrExit
End Sub
[FONT="]When the budget file for a given year opens in Excel, I have the following code for the file in Excel (Thisworkbook):[/FONT]
Public Sub Workbook_Open()
Dim wb As Workbook
Dim ws As Worksheet
Set ws = ActiveSheet
Application.DisplayAlerts = False
Set wb = Workbooks.Open("C:\Data\FinancialProgram\TempBudget") ' import table in budgetyearX
wb.Worksheets(1).Cells.Copy
ws.Range("A1:O107").PasteSpecial
wb.Close
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("B2:B107") _
, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Sheet1").Sort ' sort table by categoryID
.SetRange Range("A1:O107")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Range("P2").Select
ActiveCell.FormulaR1C1 = "=SUM(RC[-12]:RC[-1])" ' calculate total for each row and column
Range("P2").Select
Selection.Copy
Range("P2
107").Select
ActiveSheet.Paste
Range("Q8").Select
Range("P19").Select
ActiveCell.FormulaR1C1 = "=SUM(R[-17]C:R[-2]C)"
Range("D21:O107").Select
Range("D107").Activate
ActiveCell.FormulaR1C1 = "=SUM(R[-86]C:R[-1]C)"
Range("D21:O107").Select
Range("E107").Activate
ActiveCell.FormulaR1C1 = "=SUM(R[-86]C:R[-1]C)"
Range("D21:O107").Select
Range("F107").Activate
ActiveCell.FormulaR1C1 = "=SUM(R[-86]C:R[-1]C)"
Range("D21:O107").Select
Range("G107").Activate
ActiveCell.FormulaR1C1 = "=SUM(R[-86]C:R[-1]C)"
Range("D21:O107").Select
Range("H107").Activate
ActiveCell.FormulaR1C1 = "=SUM(R[-86]C:R[-1]C)"
Range("D21:O107").Select
Range("I107").Activate
ActiveCell.FormulaR1C1 = "=SUM(R[-86]C:R[-1]C)"
Range("D21:O107").Select
Range("J107").Activate
ActiveCell.FormulaR1C1 = "=SUM(R[-86]C:R[-1]C)"
Range("D21:O107").Select
Range("K107").Activate
ActiveCell.FormulaR1C1 = "=SUM(R[-86]C:R[-1]C)"
Range("D21:O107").Select
Range("L107").Activate
ActiveCell.FormulaR1C1 = "=SUM(R[-86]C:R[-1]C)"
Range("D21:O107").Select
Range("M107").Activate
ActiveCell.FormulaR1C1 = "=SUM(R[-86]C:R[-1]C)"
Range("D21:O107").Select
Range("N107").Activate
ActiveCell.FormulaR1C1 = "=SUM(R[-86]C:R[-1]C)"
Range("D21:O107").Select
Range("O107").Activate
ActiveCell.FormulaR1C1 = "=SUM(R[-86]C:R[-1]C)"
Range("R24").Select
Range("P20").Select
ActiveCell.FormulaR1C1 = "=SUM(R[-86]C:R[-1]C)"
Range("P108").Select
Selection.ColumnWidth = 8.432 ' reset some column width
Range("C2").Select
Selection.ColumnWidth = 20
Range("A1").Select
Selection.ColumnWidth = 5
End Sub
[FONT="]To bring the table back to Access to be used in various reports:[/FONT]
[FONT="]Private Sub Command35_Click()[/FONT]
[FONT="]Call Macro1[/FONT]
[FONT="]End Sub[/FONT]
Function Macro1()
On Error GoTo Macro1_Err
DoCmd.TransferSpreadsheet acImport, 10, "Budget2013", "C:\Data\Quicken Replacement\Budget2013.xlsm", True, ""
Macro1_Exit:
Exit Function
Macro1_Err:
MsgBox Error$
Resume Macro1_Exit
End Function[/code]
I have a table called TempBudget in my Access database made up from the previous year incomes and expenses by month. I want to transfer this table(106 rows and 16 columns) to Excel as it is easier to manipulate spreadsheet in Excel. When I am satisfied with the budget, I want to transfer the table(spreadsheet) back to Access. I want to do everything thru VBA coding.
I tried to transfer the table to Excel with the DoCmd.Output and Docmd.TransferSpreadsheet but both don't transfer table with the xlsm format. I needed a way to get to an Excel file which included macro. [FONT="]Here is the code:[/FONT]
[/code]On Error Resume Next
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12, "TempBudget", "C:\Data\FinancialProgram\TempBudget"
Call BudgetToExcel(BudgetYear)
Sub BudgetToExcel(BudgetYear)
' Late Binding (Needs no reference set)
Dim oXL As Object
Dim oExcel As Object
Dim sFullPath As String
Dim sPath As String
' Create a new Excel instance
Set oXL = CreateObject("Excel.Application")
On Error Resume Next
oXL.UserControl = True
On Error GoTo 0
Select Case (BudgetYear)
Case "2012"
On Error GoTo ErrHandle
sFullPath = CurrentProject.Path & "\Budget2012.xlsm"
Case "2013"
On Error GoTo ErrHandle
sFullPath = CurrentProject.Path & "\Budget2013.xlsm"
Case "2014"
On Error GoTo ErrHandle
sFullPath = CurrentProject.Path & "\Budget2014.xlsm"
Case "2015"
On Error GoTo ErrHandle
sFullPath = CurrentProject.Path & "\Budget2015.xlsm"
Case "2016"
On Error GoTo ErrHandle
sFullPath = CurrentProject.Path & "\Budget2016.xlsm"
Case "2017"
On Error GoTo ErrHandle
sFullPath = CurrentProject.Path & "\Budget2017.xlsm"
Case "2018"
On Error GoTo ErrHandle
sFullPath = CurrentProject.Path & "\Budget2018.xlsm"
Case "2019"
On Error GoTo ErrHandle
sFullPath = CurrentProject.Path & "\Budget2019.xlsm"
Case "2020"
On Error GoTo ErrHandle
sFullPath = CurrentProject.Path & "\Budget2020.xlsm"
Case "2021"
On Error GoTo ErrHandle
sFullPath = CurrentProject.Path & "\Budget2021.xlsm"
Case "2022"
On Error GoTo ErrHandle
sFullPath = CurrentProject.Path & "\Budget2022.xlsm"
End Select
' Open it
With oXL
.Visible = True
.Workbooks.Open (sFullPath)
End With
ErrExit:
Set oXL = Nothing
Exit Sub
ErrHandle:
oXL.Visible = False
MsgBox Err.Description
GoTo ErrExit
End Sub
[FONT="]When the budget file for a given year opens in Excel, I have the following code for the file in Excel (Thisworkbook):[/FONT]
Public Sub Workbook_Open()
Dim wb As Workbook
Dim ws As Worksheet
Set ws = ActiveSheet
Application.DisplayAlerts = False
Set wb = Workbooks.Open("C:\Data\FinancialProgram\TempBudget") ' import table in budgetyearX
wb.Worksheets(1).Cells.Copy
ws.Range("A1:O107").PasteSpecial
wb.Close
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("B2:B107") _
, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Sheet1").Sort ' sort table by categoryID
.SetRange Range("A1:O107")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Range("P2").Select
ActiveCell.FormulaR1C1 = "=SUM(RC[-12]:RC[-1])" ' calculate total for each row and column
Range("P2").Select
Selection.Copy
Range("P2

ActiveSheet.Paste
Range("Q8").Select
Range("P19").Select
ActiveCell.FormulaR1C1 = "=SUM(R[-17]C:R[-2]C)"
Range("D21:O107").Select
Range("D107").Activate
ActiveCell.FormulaR1C1 = "=SUM(R[-86]C:R[-1]C)"
Range("D21:O107").Select
Range("E107").Activate
ActiveCell.FormulaR1C1 = "=SUM(R[-86]C:R[-1]C)"
Range("D21:O107").Select
Range("F107").Activate
ActiveCell.FormulaR1C1 = "=SUM(R[-86]C:R[-1]C)"
Range("D21:O107").Select
Range("G107").Activate
ActiveCell.FormulaR1C1 = "=SUM(R[-86]C:R[-1]C)"
Range("D21:O107").Select
Range("H107").Activate
ActiveCell.FormulaR1C1 = "=SUM(R[-86]C:R[-1]C)"
Range("D21:O107").Select
Range("I107").Activate
ActiveCell.FormulaR1C1 = "=SUM(R[-86]C:R[-1]C)"
Range("D21:O107").Select
Range("J107").Activate
ActiveCell.FormulaR1C1 = "=SUM(R[-86]C:R[-1]C)"
Range("D21:O107").Select
Range("K107").Activate
ActiveCell.FormulaR1C1 = "=SUM(R[-86]C:R[-1]C)"
Range("D21:O107").Select
Range("L107").Activate
ActiveCell.FormulaR1C1 = "=SUM(R[-86]C:R[-1]C)"
Range("D21:O107").Select
Range("M107").Activate
ActiveCell.FormulaR1C1 = "=SUM(R[-86]C:R[-1]C)"
Range("D21:O107").Select
Range("N107").Activate
ActiveCell.FormulaR1C1 = "=SUM(R[-86]C:R[-1]C)"
Range("D21:O107").Select
Range("O107").Activate
ActiveCell.FormulaR1C1 = "=SUM(R[-86]C:R[-1]C)"
Range("R24").Select
Range("P20").Select
ActiveCell.FormulaR1C1 = "=SUM(R[-86]C:R[-1]C)"
Range("P108").Select
Selection.ColumnWidth = 8.432 ' reset some column width
Range("C2").Select
Selection.ColumnWidth = 20
Range("A1").Select
Selection.ColumnWidth = 5
End Sub
[FONT="]To bring the table back to Access to be used in various reports:[/FONT]
[FONT="]Private Sub Command35_Click()[/FONT]
[FONT="]Call Macro1[/FONT]
[FONT="]End Sub[/FONT]
Function Macro1()
On Error GoTo Macro1_Err
DoCmd.TransferSpreadsheet acImport, 10, "Budget2013", "C:\Data\Quicken Replacement\Budget2013.xlsm", True, ""
Macro1_Exit:
Exit Function
Macro1_Err:
MsgBox Error$
Resume Macro1_Exit
End Function[/code]
Last edited: