[AccessD] Setting Column Widths on Excel Spreadsheet

Rocky Smolin rockysmolin2 at gmail.com
Wed Mar 22 18:59:19 CDT 2023


OK - got it.   I thought the column width was twips. so it was generating a
number out of range for the column width. Now, since I have your attention,
since this app will be used by users whose Excel may have a different ruler
units, how do I know what it is, or better, how can I change it?

TIA

Rocky


On Wed, Mar 22, 2023 at 4:38 PM Rocky Smolin <rockysmolin2 at gmail.com> wrote:

> Tried this: objXLBook.ActiveSheet.Range("A:A").EntireColumn.ColumnWidth =
> 1000 but no cigar. same message: Unable to set the ColumnWidth property of
> the range.
>
> Tried this: objXLWS.Columns("A").ColumnWidth = 1000 - same message
>
> Couple of other WAGs. No cigar.
>
> Anybody?
>
> MTIA
>
> Rocky
>
>
> On Wed, Mar 22, 2023 at 10:31 AM Rocky Smolin <rockysmolin2 at gmail.com>
> wrote:
>
>> Dear List(s):
>>
>> I have a requirement to create an Excel spreadsheet from a dataset.
>> Setting the column widths is the problem.
>>
>> In this same app I create an empty spreadsheet (which is later imported
>> into the Access app) and put in the column heading and set the widths.
>> This is working well but the column widths are predefined (by me) so the
>> code is pretty simple:
>>
>> ' Setup
>>     Set objXLApp = New Excel.Application
>>     Set objXLBook = objXLApp.Workbooks.Add
>>     Set objXLWS = objXLBook.Sheets(1)
>>
>>     objXLWS.Cells(1, 2) = "CRS:"
>>     objXLWS.Cells(1, 3) = Me.fldCourseNumber
>>
>>
>> ' Column Heads
>>
>>     ' A
>>     objXLWS.Cells(4, 1) = "Course"
>>     objXLWS.Columns("A").ColumnWidth = 52
>>
>>     ' B
>>     objXLWS.Cells(3, 2) = "Part"
>>     objXLWS.Cells(4, 2) = "No"
>>     objXLWS.Columns("B").ColumnWidth = 7
>> .
>> .
>> .
>> Etc. through column X.
>>
>> However, in the case I'm having a problem with the column widths are
>> defined by the user along with being able to specify which columns they
>> want to appear. This is working well for the datasheet format on the form
>> showing data to be exported using this code when the form opens iterating
>> through the the Fields table and setting the width:
>>
>> ' set column widths of fields to be displayed
>>
>>     Set db = CurrentDb
>>     Set rs = db.OpenRecordset("Select * FROM tblParticipantListFields
>> ORDER BY fldPLOrderNumber")
>>     Do While rs.EOF = False
>>
>>         If rs!fldPLFieldVisible = False Then
>>
>> Forms!frmParticipantList!sfrmParticipantList(rs!fldPLFieldName).ColumnWidth
>> = 1
>>         Else
>>
>> Forms!frmParticipantList!sfrmParticipantList(rs!fldPLFieldName).ColumnWidth
>> = rs!fldPLFieldWidth * 1440
>>         End If
>>
>> NextField:
>>         rs.MoveNext
>>     Loop
>>
>> Now to the code that tries the same trick pushing the column headings out
>> to the spreadsheet and setting the width of the column in the spreadsheet.
>>
>> ' Open Fields and Participant Tables
>>     Set db = CurrentDb
>>     Set rsPLFields = db.OpenRecordset("Select * FROM
>> tblParticipantListFields")
>>     Set rsPLData = db.OpenRecordset(Me.txtRecordSource)
>>
>> ' Create XL Spreadsheet
>>     Set objXLApp = New Excel.Application
>>     Set objXLBook = objXLApp.Workbooks.Add
>>     objXLBook.Activate
>>     Set objXLWS = objXLBook.ActiveSheet
>>
>> ' Make Column Headings - start on row 3
>>     Do While rsPLFields.EOF = False
>>         If rsPLFields!fldPLFieldVisible = False Then GoTo GetNextField:
>>
>>     objXLWS.Cells(3, intCol) = rsPLFields!fldPLFieldLabel
>>     strColumn = XLColumn
>>
>>     objXLBook.ActiveSheet.Range(strColumn).ColumnWidth =
>> rsPLFields!fldPLFieldWidth * 1440
>>
>>     intCol = intCol + 1
>>
>> GetNextField:
>>         rsPLFields.MoveNext
>>     Loop
>>
>> The Private Function XLColumn returns the column letter correctly. In
>> column 1 for example it returns A:A.
>>
>> Private Function XLColumn()
>>     If intCol <= 26 Then
>>         XLColumn = Chr(64 + intCol) & ":" & Chr(64 + intCol)
>>     Else
>>         XLColumn = "A" & Chr(64 + intCol - 26) & ":" & "A" & Chr(64 +
>> intCol - 26)
>>     End If
>>
>> End Function
>>
>> Just to get this Function out of the loop I tried hard coding the first
>> couple of columns ("A:A", etc.) but got the same error.  So I 'think' the
>> problem is not in the column returned by the function. (Can I use column
>> numbers instead? That would be a nice simplification. I tried that but it
>> throws the same error as the letters.)
>>
>> The problem is in the line:
>>
>> objXLBook.ActiveSheet.Range(strColumn).ColumnWidth =
>> rsPLFields!fldPLFieldWidth * 1440
>>
>> which throws the error: Unable to set the ColumnWidth property of the
>> range.
>>
>> I don't really grok Office Automation, but I've used it a lot - by trial
>> and error and cribbing from code that works.  I've tried twelve ways from
>> Sunday to make this work but am stumped.  But it's probably something
>> obvious to someone who understands Office Automation.
>>
>> MTIA
>>
>> Rocky
>>
>>
>>


More information about the AccessD mailing list