Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
Home
Discussion GroupsFormsForms ProgrammingQueriesModules / DAO / VBAReports / PrintingMacrosDatabase DesignSecurityConversionImporting / LinkingSQL Server / ADPMultiuser / NetworkingReplicationSetup / ConfigurationDeveloper ToolkitsActiveX ControlsNew UsersGeneral 1General 2
Access DirectoryToolsTutorialsUser Groups
Related Topics
SQL ServerOther DB ProductsMS OfficeMore Topics ...

MS Access Forum / Modules / DAO / VBA / March 2005

Tip: Looking for answers? Try searching our database.

Writing Excel cells within Access

Thread view: 
Enable EMail Alerts  Start New Thread
Thread rating: 
Bob Bonta - 14 Mar 2005 14:55 GMT
Hey folks - I'm looking for a sample code snippet on
writing to an Excel spreadsheet one cell at a time from a
query built within MS Access.

Any assistance is greatly appreciated.

Thanx!

Bob
Chris2 - 14 Mar 2005 15:31 GMT
> Hey folks - I'm looking for a sample code snippet on
> writing to an Excel spreadsheet one cell at a time from a
[quoted text clipped - 5 lines]
>
> Bob

Bob,

A Query (QueryDef) in MS Access cannot send information to MS Excel.

You will need to write VBA code, instantiate a recordset (you can name
an existing QueryDef when you do this), and then loop through the
recordset, writing out to the MS Excel "cells" based on whatever
conditions are appropriate.

Sincerely,

Chris O.
Bob Bonta - 14 Mar 2005 15:38 GMT
Thank you Chris.  What you suggested is exactly my
intention (perhaps I wasn't clear enough in my original
post.).  

Do you have a sample of how to write to Excel cells from
within Access?

Bob
>-----Original Message-----
>
[quoted text clipped - 22 lines]
>
>.
Ken Snell [MVP] - 14 Mar 2005 18:03 GMT
Some sample code that may get you started (you can add loops to this code to
loop through each worksheet in a book if you'd like). This code opens an
EXCEL workbook and reads data from it and writes the data into a recordset.
You can modify this as needed to do things directly on the spreadsheet, etc.

Dim lngColumn As Long
Dim xlx As Object, xlw As Object, xls As Object, xlc As Object
Dim dbs As DAO.Database
Dim rst As DAO.Recordset
Set xlx = CreateObject("Excel.Application")
xlx.Visible = True
Set xlw = xlx.Workbooks.Open("C:\Filename.xls"), , True
Set xls = xlw.Worksheets("WorksheetName")
Set xlc = xls.Range("A1")
Set dbs = CurrentDb()
Set rst = dbs.OpenRecordset("TableName", dbOpenDynaset, dbAppendOnly)
Do While xlc.Value <> ""
   rst.AddNew
       For lngColumn = 0 To rst.Fields.Count - 1
           rst.Fields(lngColumn).Value = xlc.Offset(0, lngColumn).Value
       Next lngColumn
   rst.Update
   Set xlc = xlc.Offset(1,0)
Loop
rst.Close
Set rst = Nothing
dbs.Close
Set dbs = Nothing
Set xlc = Nothing
Set xls = Nothing
xlw.Close False
Set xlw = Nothing
xlx.Quit
Set xlx = Nothing

Signature

       Ken Snell
<MS ACCESS MVP>

> Thank you Chris.  What you suggested is exactly my
> intention (perhaps I wasn't clear enough in my original
[quoted text clipped - 35 lines]
>>
>>.
Marshall Barton - 14 Mar 2005 16:29 GMT
[]
>A Query (QueryDef) in MS Access cannot send information to MS Excel.
[]

No help to the OP, Chris, but you can use a query to write a
block of data to an Excel sheet or named range.  Using a
tabledef that's linked the Excel file is obviously the easy
way to use an append or update query.

Another way without having a tabledef is to just use a
connect string:

    INSERT INTO range IN "" "connect"
or
    INSERT INTO [connect].range

OTOH, if you want to assign values to individual cells
within a sheet or named range, it is possible to open a
recordset on a query with a connect string and use .Move to
address individual rows.

Personally, I suspect that automation may be easier, but
there are times when automation is overkill for a updating a
small set of values.

Signature

Marsh
MVP [MS Access]

JaRa - 14 Mar 2005 16:29 GMT
Hi,

I wrote an excel wrapper class (see below) maybe this can bring you to some
ideas :
So you should copy this code into a new class object
instantiate it with e.g. dim xl as new YourClass and then you can call all
these methods and properties.

It's not a 100% but it can help some of you.

-Raoul

Option Compare Database
Option Explicit
Public Filename As String

Public Row As Long
Public Column As Long

Public xlWB As Excel.Workbook
Dim xlWS As Excel.Worksheet
Dim xlApp As Excel.Application
Public Sub CreateFile(Filename As String, Optional OpenFile As Boolean =
False, Optional Visible As Boolean = False)
   Me.Filename = Filename
   Set xlWB = xlApp.Workbooks.add
   If Not OpenFile Then
       xlWB.Close True, Me.Filename
       Set xlWB = Nothing
   Else
       xlWB.SaveAs Me.Filename
       xlApp.Visible = Visible
   End If
End Sub
Public Sub OpenFile(Optional Filename As String = "", Optional Visible As
Boolean = False)
   If Len(Filename) > 0 Then
       Me.Filename = Filename
   End If
   Set xlWB = xlApp.Workbooks.Open(Me.Filename)
   xlApp.Visible = Visible
End Sub
Public Sub CloseFile(Optional Save As Boolean = True)
   If Not IsNothing(xlWB) Then
       xlWB.Close Save
   End If
   Set xlWB = Nothing
End Sub
Public Function CreateWorksheet(WorksheetName As String) As Excel.Worksheet
   Set xlWS = xlWB.Worksheets.add
   xlWS.Name = WorksheetName
   Set CreateWorksheet = xlWS
End Function
Public Sub RemoveWorksheets()
Dim i As Integer

   Set xlWS = Nothing
   For i = xlWB.Sheets.Count To 2 Step -1
       xlWB.Sheets(i).Delete
   Next
End Sub
Public Function RenameWorkSheet(OldName As String, ByVal NewName As String,
Optional AutoNumber As Boolean = True) As Excel.Worksheet
Dim bFound As Boolean
Dim iSheetId As Integer
Dim strSheet As String
Dim xlSheet As Excel.Worksheet
Dim lPosId As Long

   strSheet = NewName
   If AutoNumber Then
       bFound = True
       iSheetId = 0
       While bFound
           bFound = False
           For Each xlSheet In xlWB.Sheets
                If xlSheet.Name = strSheet Then
                   lPosId = 0
                   If Right(strSheet, 1) = ")" Then
                       lPosId = InStrRev(strSheet, "(")
                   End If
                   If lPosId > 0 Then
                       iSheetId = Val(Mid(strSheet, lPosId + 1)) + 1
                       strSheet = Left(strSheet, lPosId) & iSheetId & ")"
                   Else
                       iSheetId = 1
                       strSheet = strSheet & "(1)"
                   End If
                   bFound = True
                End If
           Next
       Wend
       If iSheetId = 0 Then
           strSheet = NewName
       Else
           lPosId = 0
           If Right(NewName, 1) = ")" Then
               lPosId = InStrRev(NewName, "(")
           End If
           If lPosId > 0 Then
               strSheet = Left(NewName, lPosId - 1) & Chr(40) & iSheetId &
Chr(41)
           Else
               strSheet = NewName & Chr(40) & iSheetId & Chr(41)
           End If
       End If
   End If
   Me.SelectWorksheet OldName
   xlWS.Name = strSheet
   Set RenameWorkSheet = xlWS
End Function
Public Function SelectWorksheet(WorksheetName As String) As Excel.Worksheet
   Set xlWS = xlWB.Sheets(WorksheetName)
   Set SelectWorksheet = xlWS
End Function
Public Sub FormatWorksheet(Optional RowHeight As Integer = 0, Optional
ColumnWidth As Integer = 0, Optional WrapText As omBool = omBool.omNotUsed)

   xlWS.Cells.Select
   With xlWS.Application.Selection
       '.HorizontalAlignment = xlGeneral
       '.VerticalAlignment = xlBottom
       .WrapText = WrapText
       '.Orientation = 0
       '.AddIndent = False
       '.IndentLevel = 0
       '.ShrinkToFit = False
       '.ReadingOrder = xlContext
       .RowHeight = RowHeight
       .ColumnWidth = ColumnWidth
   End With
End Sub
Public Sub SetValue(Value As String, Optional RowMove As Long = 0, Optional
ColumnMove As Long = 0, Optional RowOffset As Long = 0, Optional ColumnOffset
As Long = 0, Optional Bold As Boolean = False, Optional FontSize As Integer =
0)
   Me.SelectRange RowOffset:=RowOffset, ColumnOffset:=ColumnOffset
   xlWS.Application.ActiveCell.Value = Value
   'xlWS.Cells.Value = Value
   'xlWS.Cells(Row + RowOffset, Column + ColumnOffset) = Value
   'xlWS.Cells(Row + RowOffset, Column + ColumnOffset).Select
   With xlWS.Application.Selection.Font
       .Bold = Bold
       If FontSize <> 0 Then
           .Size = FontSize
       End If
   End With
   Me.Row = Me.Row + RowMove
   Me.Column = Me.Column + ColumnMove
End Sub
Public Function GetValue(Optional RowOffset As Long = 0, Optional
ColumnOffset As Long = 0) As String
   GetValue = Nz(xlWS.Cells(Row + RowOffset, Column + ColumnOffset))
End Function
Public Sub MergeCells(Optional Rows As Long = 0, Optional Columns As Long =
0, Optional RowOffset As Long = 0, Optional ColumnOffset As Long = 0)
   If Rows <> 0 Or Columns <> 0 Then
       xlWS.Range(xlWS.Cells(Row + RowOffset, Column + ColumnOffset),
xlWS.Cells(Row + RowOffset + IIf(Rows > 0, Rows - 1, 0), Column +
ColumnOffset + IIf(Columns > 0, Columns - 1, 0))).MergeCells = True
   End If
End Sub
Public Sub FormatCells(Optional Rows As Long = 0, Optional Columns As Long =
0, Optional RowOffset As Long = 0, Optional ColumnOffset As Long = 0,
Optional SetBorder As Boolean = False, Optional BorderWeight As
XlBorderWeight = XlBorderWeight.xlThick, Optional ClearInsideLines As Boolean
= False, Optional InsideBorderWeight As XlBorderWeight =
XlBorderWeight.xlThin, Optional InsideVerticalLineStyle As XlLineStyle =
XlLineStyle.xlLineStyleNone, Optional InsideHorizontalLineStyle As
XlLineStyle = XlLineStyle.xlLineStyleNone, Optional FillBackGround As Boolean
= False, Optional FillBackGroundColor As XlColorIndex = 15, Optional
HorizontalAlignment As Excel.Constants = Excel.Constants.xlNone, Optional
VerticalAlignment As Excel.Constants = Excel.Constants.xlNone)
   Me.SelectRange Rows:=Rows, RowOffset:=RowOffset, Columns:=Columns,
ColumnOffset:=ColumnOffset
   With xlWS.Application.Selection
       If SetBorder Then
           With .Borders(xlEdgeLeft)
               .LineStyle = xlContinuous
               .Weight = BorderWeight
               .ColorIndex = xlAutomatic
           End With
           With .Borders(xlEdgeTop)
               .LineStyle = xlContinuous
               .Weight = BorderWeight
               .ColorIndex = xlAutomatic
           End With
           With .Borders(xlEdgeBottom)
               .LineStyle = xlContinuous
               .Weight = BorderWeight
               .ColorIndex = xlAutomatic
           End With
           With .Borders(xlEdgeRight)
               .LineStyle = xlContinuous
               .Weight = BorderWeight
               .ColorIndex = xlAutomatic
           End With
           If ClearInsideLines Then
               .Borders(xlInsideVertical).LineStyle = xlNone
           End If
           If InsideVerticalLineStyle <> XlLineStyle.xlLineStyleNone Then
               With .Borders(xlInsideVertical)
                   .LineStyle = InsideVerticalLineStyle
                   .Weight = InsideBorderWeight
                   .ColorIndex = xlAutomatic
               End With
           End If
           If InsideHorizontalLineStyle <> XlLineStyle.xlLineStyleNone Then
               With .Borders(xlInsideHorizontal)
                   .LineStyle = InsideHorizontalLineStyle
                   .Weight = InsideBorderWeight
                   .ColorIndex = xlAutomatic
               End With
           End If
       End If
       If FillBackGround Then
           With .Interior
               .ColorIndex = FillBackGroundColor
               .Pattern = xlSolid
           End With
       End If
       If HorizontalAlignment <> xlNone Then
           .HorizontalAlignment = HorizontalAlignment
       End If
       If VerticalAlignment <> xlNone Then
           .VerticalAlignment = VerticalAlignment
       End If
   End With
End Sub
Public Function GetLastActiveRow() As Long
   xlWS.Application.ActiveCell.SpecialCells(xlLastCell).Select
   If xlWS.Application.ActiveCell.MergeCells Then
       GetLastActiveRow = xlWS.Application.ActiveCell.Row +
xlWS.Application.ActiveCell.MergeArea.Rows.Count - 1
   Else
       GetLastActiveRow = xlWS.Application.ActiveCell.Row
   End If
End Function
Public Function GetLastActiveColumn() As Long
   xlWS.Application.ActiveCell.SpecialCells(xlLastCell).Select
   If xlWS.Application.ActiveCell.MergeCells Then
       GetLastActiveColumn = xlWS.Application.ActiveCell.Column +
xlWS.Application.ActiveCell.MergeArea.Columns.Count - 1
   Else
       GetLastActiveColumn = xlWS.Application.ActiveCell.Column
   End If
End Function
Public Sub InsertRows(Rows As Long, Optional Shift As XlDirection =
XlDirection.xlDown)
   With xlWB.Application
       .Rows(Me.Row & ":" & Me.Row + Rows - 1).Select
       .Selection.Insert Shift:=Shift
   End With
End Sub
Public Sub SelectRange(Optional Row As Long = 0, Optional Rows As Long = 0,
Optional RowOffset As Long = 0, Optional Column As Long = 0, Optional Columns
As Long = 0, Optional ColumnOffset As Long = 0)
   If Row <> 0 Then
       Me.Row = Row
   End If
   If Column <> 0 Then
       Me.Column = Column
   End If
   xlWS.Range(xlWS.Cells(Me.Row + RowOffset, Me.Column + ColumnOffset),
xlWS.Cells(Me.Row + RowOffset + IIf(Rows > 0, Rows - 1, 0), Me.Column +
ColumnOffset + IIf(Columns > 0, Columns - 1, 0))).Select
End Sub
Public Sub PageSetup(Optional Orientation As XlPageOrientation =
XlPageOrientation.xlPortrait, Optional Order As XlOrder =
XlOrder.xlOverThenDown, Optional LeftMargin As Double = 1, Optional
RightMargin As Double = 1, Optional TopMargin As Double = 1, Optional
BottomMargin As Double = 1, Optional HeaderMargin As Double = 0.5, Optional
FooterMargin As Double = 0.5, Optional Zoom As Double = False, Optional
PrintTitleRows As String = "", Optional PrintTitleColumns As String = "")
   With xlWB.ActiveSheet.PageSetup
       .PrintTitleRows = PrintTitleRows
       .PrintTitleColumns = PrintTitleColumns
   End With
   'xlWB.ActiveSheet.PageSetup.PrintArea = ""
   With xlWB.ActiveSheet.PageSetup
       .Orientation = Orientation
       .PaperSize = xlPaperA4
       .Order = Order
       .LeftMargin = xlWB.Application.CentimetersToPoints(LeftMargin)
       .RightMargin = xlWB.Application.CentimetersToPoints(RightMargin)
       .TopMargin = xlWB.Application.CentimetersToPoints(TopMargin)
       .BottomMargin = xlWB.Application.CentimetersToPoints(BottomMargin)
       .HeaderMargin = xlWB.Application.CentimetersToPoints(HeaderMargin)
       .FooterMargin = xlWB.Application.CentimetersToPoints(FooterMargin)
       .Zoom = Zoom
       
       
       '.LeftHeader = ""
       '.CenterHeader = ""
       '.RightHeader = ""
       '.LeftFooter = ""
       '.CenterFooter = ""
       '.RightFooter = ""
       '.PrintHeadings = False
       '.PrintGridlines = False
       '.PrintComments = xlPrintNoComments
       '.PrintQuality = -3
       '.CenterHorizontally = False
       '.CenterVertically = False
       
       '.Draft = False
       '.FirstPageNumber = xlAutomatic
       '.BlackAndWhite = False
       '.FitToPagesWide = 4
       '.FitToPagesTall = 1
       '.PrintErrors = xlPrintErrorsDisplayed
   End With
End Sub
Public Sub FormatSelection(Optional HorizontalAlignment As Excel.Constants =
Excel.Constants.xlNone, Optional VerticalAlignment As Excel.Constants =
Excel.Constants.xlNone, Optional WrapText As omBool = omBool.omNotUsed,
Optional Orientation As Integer = 0, Optional AddIndent As omBool =
omBool.omNotUsed, Optional IndentLevel As Integer = 0, Optional ShrinkToFit
As omBool = omBool.omNotUsed, Optional ReadingOrder As XlReadingOrder =
XlReadingOrder.xlContext, Optional MergeCells As omBool = omBool.omNotUsed,
Optional RowHeight As Integer = 0, Optional ColumnWidth As Integer = 0)
   With xlWS.Application.Selection
       If HorizontalAlignment <> xlNone Then
           .HorizontalAlignment = HorizontalAlignment
       End If
       If VerticalAlignment <> xlNone Then
           .VerticalAlignment = VerticalAlignment
       End If
       If WrapText <> omNotUsed Then
           .WrapText = WrapText
       End If
       .Orientation = Orientation
       If AddIndent <> omNotUsed Then
           .AddIndent = AddIndent
           .IndentLevel = IndentLevel
       End If
       If ShrinkToFit <> omNotUsed Then
           .ShrinkToFit = ShrinkToFit
       End If
       .ReadingOrder = ReadingOrder
       If MergeCells <> omNotUsed Then
           .MergeCells = MergeCells
       End If
       If RowHeight <> 0 Then
           .RowHeight = RowHeight
       End If
       If ColumnWidth <> 0 Then
           .ColumnWidth = ColumnWidth
       End If
   End With
End Sub
Public Sub RemoveEqualValues(Optional Row As Long = 0, Optional Column As
Long = 0, Optional Direction As Excel.XlDirection = XlDirection.xlDown,
Optional InsertAbove As Boolean = True)
Dim strTemp As String
Dim i As Long
Dim LastActiveColumn As Long
Dim LastActiveRow As Long

   If Row > 0 Then
       Me.Row = Row
   End If
   If Column > 0 Then
       Me.Column = Column
   End If
   strTemp = xlWS.Cells(Me.Row, Me.Column)
   If Direction = xlDown Then
       i = Me.Row + 1
       LastActiveRow = Me.GetLastActiveRow
       While i <= LastActiveRow
           If xlWS.Cells(i, Me.Column) <> "" Then
               If strTemp = xlWS.Cells(i, Me.Column) Then
                   xlWS.Cells(i, Me.Column) = ""
               Else
                   strTemp = xlWS.Cells(i, Me.Column)
                   If InsertAbove Then
                       xlWS.Rows(i & ":" & i).Select
                       xlWS.Application.Selection.Insert Shift:=xlDown
                       xlWS.Application.Selection.Interior.ColorIndex =
xlNone
                       i = i + 1
                       LastActiveRow = LastActiveRow + 1
                   End If
               End If
           End If
           i = i + 1
       Wend
   ElseIf Direction = xlToRight Then
       i = Me.Column + 1
       LastActiveColumn = Me.GetLastActiveColumn
       While i <= LastActiveColumn
           If xlWS.Cells(Me.Row, i) <> "" Then
               If strTemp = xlWS.Cells(Me.Row, i) Then
                   xlWS.Cells(Me.Row, i) = ""
               Else
                   strTemp = xlWS.Cells(Me.Row, i)
               End If
           End If
           i = i + 1
       Wend
   End If
End Sub
Public Sub MoveActiveSheetToEnd()
   xlWS.Move
After:=xlWS.Application.ActiveWorkbook.Sheets(xlWS.Application.ActiveWorkbook.Sheets.Count)
End Sub

Public Sub RemoveEmptySheets()
Dim i As Long

   For i = xlWB.Sheets.Count To 1 Step -1
       If xlWB.Sheets(i).UsedRange.Rows.Count = 1 And
xlWB.Sheets(i).UsedRange.Columns.Count = 1 And xlWB.Sheets(i).Cells(1, 1) =
"" Then
           xlWB.Sheets(i).Delete
       End If
   Next i
End Sub
Private Sub Class_Initialize()
   Set xlApp = New Excel.Application
   xlApp.Application.DisplayAlerts = False
End Sub
Private Sub Class_Terminate()
   If Not IsNothing(xlWB) Then
       xlWB.Close False
   End If
   If Not IsNothing(xlApp) Then
       xlApp.Quit
   End If
   xlApp.Application.DisplayAlerts = True
   Set xlApp = Nothing
   Set xlWB = Nothing
   Set xlWS = Nothing
End Sub

> Hey folks - I'm looking for a sample code snippet on
> writing to an Excel spreadsheet one cell at a time from a
[quoted text clipped - 5 lines]
>
> Bob
Bob Bonta - 14 Mar 2005 17:01 GMT
JaRa,

Thanx for the class.  I copy/pasted it all into a class
module within my access database.  There were carriage
return breaks I had to correct to satisfy those syntax
errors resulting from the copy/paste.

However, when I attempted to compile the module, I got a
compile error "Variable not defined" on omBool.  

For example ...
Public Sub FormatWorksheet(Optional RowHeight As Integer
= , Optional ColumnWidth As Integer = 0, Optional WrapText
As omBool = omBool.omNotUsed)

It didn't like the omBool in omBool.omNotUsed.

Suggestions?

Bob
JaRa - 14 Mar 2005 17:39 GMT
Sorry simple enum, don't forget to set the references.

Public Enum omBool
   omTrue = -1
   omFalse = 0
   omNotUsed = 1
End Enum

- Raoul

> JaRa,
>
[quoted text clipped - 16 lines]
>
> Bob
Bob Bonta - 14 Mar 2005 17:51 GMT
Thanx!  I copy/pasted that and attempted to compile again
with the following error:

Variable not defined ... XlReadingOrder ... in the
following declaration:

Public Sub FormatSelection(Optional HorizontalAlignment As
Excel.Constants = Excel.Constants.xlNone, Optional
VerticalAlignment As Excel.Constants =
Excel.Constants.xlNone, Optional WrapText As omBool =
omBool.omNotUsed, Optional Orientation As Integer = 0,
Optional AddIndent As omBool = omBool.omNotUsed, Optional
IndentLevel As Integer = 0, Optional ShrinkToFit As omBool
= omBool.omNotUsed, Optional ReadingOrder As
XlReadingOrder = XlReadingOrder.xlContext, Optional
MergeCells As omBool = omBool.omNotUsed, Optional
RowHeight As Integer = 0, Optional ColumnWidth As Integer
= 0)

It didn't like "XlReadingOrder" in
Optional ReadingOrder As XlReadingOrder =
XlReadingOrder.xlContext

I didn't forget the references but thanx for the
reminder.  The reference selected is:
 Microsoft Excel 9.0 Object Library.

v/r

Bob ...

P.S.
Perhaps we could continue this off-line via email rather
than these posts - just a thought.
JaRa - 14 Mar 2005 18:11 GMT
Hi basically these are defaults which are I use to decide whether the format
should be changed yes or no.
Now most probably the excel 9.0 (i used excel.10) object didn’t support
these so you will have to amend the defaults to make it work.

- Raoul

> Thanx!  I copy/pasted that and attempted to compile again
> with the following error:
[quoted text clipped - 30 lines]
> Perhaps we could continue this off-line via email rather
> than these posts - just a thought.
anonymous@discussions.microsoft.com - 15 Mar 2005 14:43 GMT
Hey Folks!  What JaRa provided to me works great.  I had
to clean up the syntax from the copy/paste - here's the
final product that works within Access2K with "Microsoft
Excel 9.0 Object Library" reference selected:

Option Compare Database
Option Explicit

'**********************************************************
***********************
'This class module was contributed by Raoul Jacobs
'       via MS Access Developer's Forum 3/14/2005
'**********************************************************
***********************
'Raoul Jacobs
'Jacob Jordaensstraat 118
'2018 Antwerpen
'Belgium
'T. +32 (0)475 31 41 93
'E.jara@ opmaat.be
'U. http://www.opmaat.be
'**********************************************************
***********************
'Code modified and customized 3/14/2005 for local use by:
'Robert s.Bonta
'Database Developer, JTIRA Lead
'Scientific Research Corporation
'OSD/JMACA
'7025 Harbour View Blvd, Ste 105
'Suffolk, VA  23435
'bob.bonta@jte.osd.mil
'757-638-6044 (voice)
'757-638-6170 (facsimile)
'**********************************************************
***********************

Public Filename As String

Public Row As Long
Public Column As Long

Public xlWB As Excel.Workbook
Dim xlWS As Excel.Worksheet
Dim xlApp As Excel.Application

Public Enum omBool
   omTrue = -1
   omFalse = 0
   omNotUsed = 1
End Enum

Public Sub CreateFile(Filename As String, _
                     Optional OpenFile As Boolean =
False, _
                     Optional Visible As Boolean = False)
   Me.Filename = Filename
   Set xlWB = xlApp.Workbooks.Add
   If Not OpenFile Then
       xlWB.Close True, Me.Filename
       Set xlWB = Nothing
   Else
       xlWB.SaveAs Me.Filename
       xlApp.Visible = Visible
   End If
End Sub
Public Sub OpenFile(Optional Filename As String = "",
Optional Visible As Boolean = False)
   If Len(Filename) > 0 Then
       Me.Filename = Filename
   End If
   Set xlWB = xlApp.Workbooks.Open(Me.Filename)
   xlApp.Visible = Visible
End Sub
Public Sub CloseFile(Optional Save As Boolean = True)
   If Not (xlWB Is Nothing) Then
       xlWB.Close Save
   End If
   Set xlWB = Nothing
End Sub
Public Function CreateWorksheet(WorksheetName As String)
As Excel.Worksheet
   Set xlWS = xlWB.Worksheets.Add
   xlWS.Name = WorksheetName
   Set CreateWorksheet = xlWS
End Function
Public Sub RemoveWorksheets()
Dim i As Integer

   Set xlWS = Nothing
   For i = xlWB.Sheets.Count To 2 Step -1
       xlWB.Sheets(i).Delete
   Next
End Sub
Public Function RenameWorkSheet(OldName As String, _
                               ByVal NewName As String, _
                               Optional AutoNumber As
Boolean = True) As Excel.Worksheet
Dim bFound As Boolean
Dim iSheetId As Integer
Dim strSheet As String
Dim xlSheet As Excel.Worksheet
Dim lPosId As Long

   strSheet = NewName
   If AutoNumber Then
       bFound = True
       iSheetId = 0
       While bFound
           bFound = False
           For Each xlSheet In xlWB.Sheets
                If xlSheet.Name = strSheet Then
                   lPosId = 0
                   If Right(strSheet, 1) = ")" Then
                       lPosId = InStrRev(strSheet, "(")
                   End If
                   If lPosId > 0 Then
                       iSheetId = Val(Mid(strSheet,
lPosId + 1)) + 1
                       strSheet = Left(strSheet, lPosId)
& iSheetId & ")"
                   Else
                       iSheetId = 1
                       strSheet = strSheet & "(1)"
                   End If
                   bFound = True
                End If
           Next
       Wend
       If iSheetId = 0 Then
           strSheet = NewName
       Else
           lPosId = 0
           If Right(NewName, 1) = ")" Then
               lPosId = InStrRev(NewName, "(")
           End If
           If lPosId > 0 Then
               strSheet = Left(NewName, lPosId - 1) & Chr
(40) & iSheetId & Chr(41)
           Else
               strSheet = NewName & Chr(40) & iSheetId &
Chr(41)
           End If
       End If
   End If
   Me.SelectWorksheet OldName
   xlWS.Name = strSheet
   Set RenameWorkSheet = xlWS
End Function
Public Function SelectWorksheet(WorksheetName As String)
As Excel.Worksheet
   Set xlWS = xlWB.Sheets(WorksheetName)
   Set SelectWorksheet = xlWS
End Function
Public Sub FormatWorksheet(Optional RowHeight As Integer =
0, _
                          Optional ColumnWidth As Integer
= 0, _
                          Optional WrapText As omBool =
omBool.omNotUsed)

   xlWS.Cells.Select
   With xlWS.Application.Selection
       '.HorizontalAlignment = xlGeneral
       '.VerticalAlignment = xlBottom
       .WrapText = WrapText
       '.Orientation = 0
       '.AddIndent = False
       '.IndentLevel = 0
       '.ShrinkToFit = False
       '.ReadingOrder = xlContext
       .RowHeight = RowHeight
       .ColumnWidth = ColumnWidth
   End With
End Sub
Public Sub SetValue(Value As String, _
                   Optional RowMove As Long = 0, _
                   Optional ColumnMove As Long = 0, _
                   Optional RowOffset As Long = 0, _
                   Optional ColumnOffset As Long = 0, _
                   Optional Bold As Boolean = False, _
                   Optional FontSize As Integer = 0)
   Me.SelectRange RowOffset:=RowOffset,
ColumnOffset:=ColumnOffset
   xlWS.Application.ActiveCell.Value = Value
   'xlWS.Cells.Value = Value
   'xlWS.Cells(Row + RowOffset, Column + ColumnOffset) =
Value
   'xlWS.Cells(Row + RowOffset, Column +
ColumnOffset).Select
   With xlWS.Application.Selection.Font
       .Bold = Bold
       If FontSize <> 0 Then
           .Size = FontSize
       End If
   End With
   Me.Row = Me.Row + RowMove
   Me.Column = Me.Column + ColumnMove
End Sub
Public Function GetValue(Optional RowOffset As Long = 0, _
                        Optional ColumnOffset As Long =
0) As String
   GetValue = Nz(xlWS.Cells(Row + RowOffset, Column +
ColumnOffset))
End Function
Public Sub MergeCells(Optional Rows As Long = 0, _
                     Optional Columns As Long = 0, _
                     Optional RowOffset As Long = 0, _
                     Optional ColumnOffset As Long = 0)
   If Rows <> 0 Or Columns <> 0 Then
       xlWS.Range(xlWS.Cells(Row + RowOffset, Column +
ColumnOffset), _
                  xlWS.Cells(Row + RowOffset + IIf(Rows >
0, Rows - 1, 0), _
                  Column + ColumnOffset + IIf(Columns >
0, Columns - 1, 0))).MergeCells = True
   End If
End Sub
Public Sub FormatCells(Optional Rows As Long = 0, _
                      Optional Columns As Long = 0, _
                      Optional RowOffset As Long = 0, _
                      Optional ColumnOffset As Long = 0, _
                      Optional SetBorder As Boolean =
False, _
                      Optional BorderWeight As
XlBorderWeight = XlBorderWeight.xlThick, _
                      Optional ClearInsideLines As
Boolean = False, _
                      Optional InsideBorderWeight As
XlBorderWeight = XlBorderWeight.xlThin, _
                      Optional InsideVerticalLineStyle As
XlLineStyle = XlLineStyle.xlLineStyleNone, _
                      Optional InsideHorizontalLineStyle
As XlLineStyle = XlLineStyle.xlLineStyleNone, _
                      Optional FillBackGround As Boolean
= False, _
                      Optional FillBackGroundColor As
XlColorIndex = 15, _
                      Optional HorizontalAlignment As
Excel.Constants = Excel.Constants.xlNone, _
                      Optional VerticalAlignment As
Excel.Constants = Excel.Constants.xlNone)
   Me.SelectRange Rows:=Rows, _
             RowOffset:=RowOffset, _
               Columns:=Columns, _
          ColumnOffset:=ColumnOffset
   With xlWS.Application.Selection
       If SetBorder Then
           With .Borders(xlEdgeLeft)
               .LineStyle = xlContinuous
               .Weight = BorderWeight
               .ColorIndex = xlAutomatic
           End With
           With .Borders(xlEdgeTop)
               .LineStyle = xlContinuous
               .Weight = BorderWeight
               .ColorIndex = xlAutomatic
           End With
           With .Borders(xlEdgeBottom)
               .LineStyle = xlContinuous
               .Weight = BorderWeight
               .ColorIndex = xlAutomatic
           End With
           With .Borders(xlEdgeRight)
               .LineStyle = xlContinuous
               .Weight = BorderWeight
               .ColorIndex = xlAutomatic
           End With
           If ClearInsideLines Then
               .Borders(xlInsideVertical).LineStyle =
xlNone
           End If
           If InsideVerticalLineStyle <>
XlLineStyle.xlLineStyleNone Then
               With .Borders(xlInsideVertical)
                   .LineStyle = InsideVerticalLineStyle
                   .Weight = InsideBorderWeight
                   .ColorIndex = xlAutomatic
               End With
           End If
           If InsideHorizontalLineStyle <>
XlLineStyle.xlLineStyleNone Then
               With .Borders(xlInsideHorizontal)
                   .LineStyle = InsideHorizontalLineStyle
                   .Weight = InsideBorderWeight
                   .ColorIndex = xlAutomatic
               End With
           End If
       End If
       If FillBackGround Then
           With .Interior
               .ColorIndex = FillBackGroundColor
               .Pattern = xlSolid
           End With
       End If
       If HorizontalAlignment <> xlNone Then
           .HorizontalAlignment = HorizontalAlignment
       End If
       If VerticalAlignment <> xlNone Then
           .VerticalAlignment = VerticalAlignment
       End If
   End With
End Sub
Public Function GetLastActiveRow() As Long
   xlWS.Application.ActiveCell.SpecialCells
(xlLastCell).Select
   If xlWS.Application.ActiveCell.MergeCells Then
       GetLastActiveRow = xlWS.Application.ActiveCell.Row
+ xlWS.Application.ActiveCell.MergeArea.Rows.Count - 1
   Else
       GetLastActiveRow = xlWS.Application.ActiveCell.Row
   End If
End Function
Public Function GetLastActiveColumn() As Long
   xlWS.Application.ActiveCell.SpecialCells
(xlLastCell).Select
   If xlWS.Application.ActiveCell.MergeCells Then
       GetLastActiveColumn =
xlWS.Application.ActiveCell.Column +
xlWS.Application.ActiveCell.MergeArea.Columns.Count - 1
   Else
       GetLastActiveColumn =
xlWS.Application.ActiveCell.Column
   End If
End Function
Public Sub InsertRows(Rows As Long, Optional Shift As
XlDirection = XlDirection.xlDown)
   With xlWB.Application
       .Rows(Me.Row & ":" & Me.Row + Rows - 1).Select
       .Selection.Insert Shift:=Shift
   End With
End Sub
Public Sub SelectRange(Optional Row As Long = 0, _
                      Optional Rows As Long = 0, _
                      Optional RowOffset As Long = 0, _
                      Optional Column As Long = 0, _
                      Optional Columns As Long = 0, _
                      Optional ColumnOffset As Long = 0)
   If Row <> 0 Then
       Me.Row = Row
   End If
   If Column <> 0 Then
       Me.Column = Column
   End If
   xlWS.Range(xlWS.Cells(Me.Row + RowOffset, Me.Column +
ColumnOffset), _
              xlWS.Cells(Me.Row + RowOffset + IIf(Rows >
0, Rows - 1, 0), _
              Me.Column + ColumnOffset + IIf(Columns > 0,
Columns - 1, 0))).Select
End Sub
Public Sub PageSetup(Optional Orientation As
XlPageOrientation = XlPageOrientation.xlPortrait, _
                    Optional Order As XlOrder =
XlOrder.xlOverThenDown, _
                    Optional LeftMargin As Double = 1, _
                    Optional RightMargin As Double = 1, _
                    Optional TopMargin As Double = 1, _
                    Optional BottomMargin As Double = 1, _
                    Optional HeaderMargin As Double =
0.5, _
                    Optional FooterMargin As Double =
0.5, _
                    Optional Zoom As Double = False, _
                    Optional PrintTitleRows As String
= "", _
                    Optional PrintTitleColumns As String
= "")
   With xlWB.ActiveSheet.PageSetup
       .PrintTitleRows = PrintTitleRows
       .PrintTitleColumns = PrintTitleColumns
   End With
   'xlWB.ActiveSheet.PageSetup.PrintArea = ""
   With xlWB.ActiveSheet.PageSetup
       .Orientation = Orientation
       .PaperSize = xlPaperA4
       .Order = Order
       .LeftMargin = xlWB.Application.CentimetersToPoints
(LeftMargin)
       .RightMargin = xlWB.Application.CentimetersToPoints
(RightMargin)
       .TopMargin = xlWB.Application.CentimetersToPoints
(TopMargin)
       .BottomMargin =
xlWB.Application.CentimetersToPoints(BottomMargin)
       .HeaderMargin =
xlWB.Application.CentimetersToPoints(HeaderMargin)
       .FooterMargin =
xlWB.Application.CentimetersToPoints(FooterMargin)
       .Zoom = Zoom
       
       
       '.LeftHeader = ""
       '.CenterHeader = ""
       '.RightHeader = ""
       '.LeftFooter = ""
       '.CenterFooter = ""
       '.RightFooter = ""
       '.PrintHeadings = False
       '.PrintGridlines = False
       '.PrintComments = xlPrintNoComments
       '.PrintQuality = -3
       '.CenterHorizontally = False
       '.CenterVertically = False
       
       '.Draft = False
       '.FirstPageNumber = xlAutomatic
       '.BlackAndWhite = False
       '.FitToPagesWide = 4
       '.FitToPagesTall = 1
       '.PrintErrors = xlPrintErrorsDisplayed
   End With
End Sub
Public Sub FormatSelection(Optional HorizontalAlignment As
Excel.Constants = Excel.Constants.xlNone, _
                          Optional VerticalAlignment As
Excel.Constants = Excel.Constants.xlNone, _
                          Optional WrapText As omBool =
omBool.omNotUsed, _
                          Optional Orientation As Integer
= 0, _
                          Optional AddIndent As omBool =
omBool.omNotUsed, _
                          Optional IndentLevel As Integer
= 0, _
                          Optional ShrinkToFit As omBool
= omBool.omNotUsed, _
                          Optional ReadingOrder As
Integer = 0, _
                          Optional MergeCells As omBool =
omBool.omNotUsed, _
                          Optional RowHeight As Integer =
0, _
                          Optional ColumnWidth As Integer
= 0)

   With xlWS.Application.Selection
       If HorizontalAlignment <> xlNone Then
           .HorizontalAlignment = HorizontalAlignment
       End If
       If VerticalAlignment <> xlNone Then
           .VerticalAlignment = VerticalAlignment
       End If
       If WrapText <> omNotUsed Then
           .WrapText = WrapText
       End If
       .Orientation = Orientation
       If AddIndent <> omNotUsed Then
           .AddIndent = AddIndent
           .IndentLevel = IndentLevel
       End If
       If ShrinkToFit <> omNotUsed Then
           .ShrinkToFit = ShrinkToFit
       End If
       .ReadingOrder = ReadingOrder
       If MergeCells <> omNotUsed Then
           .MergeCells = MergeCells
       End If
       If RowHeight <> 0 Then
           .RowHeight = RowHeight
       End If
       If ColumnWidth <> 0 Then
           .ColumnWidth = ColumnWidth
       End If
   End With
End Sub
Public Sub RemoveEqualValues(Optional Row As Long = 0, _
                            Optional Column As Long = 0, _
                            Optional Direction As
Excel.XlDirection = XlDirection.xlDown, _
                            Optional InsertAbove As
Boolean = True)
Dim strTemp As String
Dim i As Long
Dim LastActiveColumn As Long
Dim LastActiveRow As Long

   If Row > 0 Then
       Me.Row = Row
   End If
   If Column > 0 Then
       Me.Column = Column
   End If
   strTemp = xlWS.Cells(Me.Row, Me.Column)
   If Direction = xlDown Then
       i = Me.Row + 1
       LastActiveRow = Me.GetLastActiveRow
       While i <= LastActiveRow
           If xlWS.Cells(i, Me.Column) <> "" Then
               If strTemp = xlWS.Cells(i, Me.Column) Then
                   xlWS.Cells(i, Me.Column) = ""
               Else
                   strTemp = xlWS.Cells(i, Me.Column)
                   If InsertAbove Then
                       xlWS.Rows(i & ":" & i).Select
                       xlWS.Application.Selection.Insert
Shift:=xlDown
                       
xlWS.Application.Selection.Interior.ColorIndex = xlNone
                       i = i + 1
                       LastActiveRow = LastActiveRow + 1
                   End If
               End If
           End If
           i = i + 1
       Wend
   ElseIf Direction = xlToRight Then
       i = Me.Column + 1
       LastActiveColumn = Me.GetLastActiveColumn
       While i <= LastActiveColumn
           If xlWS.Cells(Me.Row, i) <> "" Then
               If strTemp = xlWS.Cells(Me.Row, i) Then
                   xlWS.Cells(Me.Row, i) = ""
               Else
                   strTemp = xlWS.Cells(Me.Row, i)
               End If
           End If
           i = i + 1
       Wend
   End If
End Sub
Public Sub MoveActiveSheetToEnd()
   xlWS.Move After:=xlWS.Application.ActiveWorkbook.Sheets
(xlWS.Application.ActiveWorkbook.Sheets.Count)
End Sub

Public Sub RemoveEmptySheets()
Dim i As Long

   For i = xlWB.Sheets.Count To 1 Step -1
       If xlWB.Sheets(i).UsedRange.Rows.Count = 1 And _
          xlWB.Sheets(i).UsedRange.Columns.Count = 1 And _
          xlWB.Sheets(i).Cells(1, 1) = "" Then
               xlWB.Sheets(i).Delete
       End If
   Next i
End Sub
Private Sub Class_Initialize()
   Set xlApp = New Excel.Application
   xlApp.Application.DisplayAlerts = False
End Sub
Private Sub Class_Terminate()
   If Not (xlWB Is Nothing) Then
       xlWB.Close False
   End If
   If Not (xlApp Is Nothing) Then
       xlApp.Quit
   End If
   xlApp.Application.DisplayAlerts = True
   Set xlApp = Nothing
   Set xlWB = Nothing
   Set xlWS = Nothing
End Sub
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.