2016-01-20 3 views
0

Я использую Access для циклического преобразования таблицы данных и создания рабочей книги Excel (с тремя листами) для каждой строки в таблице базы данных. Все работает очень хорошо, пока я не вводил код, используя «Range», чтобы скрыть некоторые столбцы и строки. Код будет работать успешно в первой строке, но с ошибкой. Он также потерпит неудачу, если мы снова запустим код. Если мы выйдем из Access, а затем снова запустим, то первая строка снова будет успешной.Доступ vba excel Диапазон

NewFileName = "C:\Paul2016Puzzle\TestNewName" + "Project" + Str(iteration) 
      'MsgBox NewFileName 

     Set XL = New Excel.Application 
     Set WB = XL.Workbooks.Open(NewFileName) 
     WB.Activate 

     Set wks = WB.Worksheets(2) 
     XL.ScreenUpdating = False 
     XL.DisplayAlerts = False 


     wks.Select 
     WB.Sheets(2).Activate 


     StrExcel = Chr(65 + WorkingColumns + 1) 

     StrExcel = StrExcel + ":" + StrExcel 
     MsgBox StrExcel 

      WB.Sheets("Sheet 2").Select 
      WB.Sheets("Sheet 2").Range(StrExcel).Select 
      WB.Sheets("Sheet 2").Activate 



       wks.Range(StrExcel).Activate 
       wks.Columns(StrExcel).Select 
       wks.Range(StrExcel).Select 
       ActiveSheet.Range(Selection, Selection.End(xlToRight)).Select 
       Selection.EntireColumn.Hidden = True 

       Rows("12:12").Select 
       ActiveSheet.Range(Selection, Selection.End(xlDown)).Select 
       Selection.EntireRow.Hidden = True 




     wks.Cells(1, 1).ColumnWidth = 30 '(Set column width) 
     For i = 2 To WorkingColumns + 1 
     wks.Cells(1, i).ColumnWidth = 15 
     Next i 

ответ

0

Вместо того, чтобы пытаться создать букву столбца, просто укажите номер столбца.
Chr(65 + WorkingColumns + 1) не удастся - если WorkingColumns равно 25, он попытается указать столбец [.

Со ссылкой на ваши комментарии. Я использую эту процедуру, чтобы найти последнюю ячейку на листе:

' Purpose : Finds the last cell containing data or a formula within the given worksheet. 
'    If the Optional Col is passed it finds the last row for a specific column. 
'--------------------------------------------------------------------------------------- 

    Public Function LastCell(wrkSht As Worksheet, Optional Col As Long = 0) As Range 

     Dim lLastCol As Long, lLastRow As Long 

     On Error Resume Next 

     With wrkSht 
      If Col = 0 Then 
       lLastCol = .Cells.Find("*", , , , xlByColumns, xlPrevious).Column 
       lLastRow = .Cells.Find("*", , , , xlByRows, xlPrevious).Row 
      Else 
       lLastCol = .Cells.Find("*", , , , xlByColumns, xlPrevious).Column 
       lLastRow = .Columns(Col).Find("*", , , , xlByColumns, xlPrevious).Row 
      End If 

      If lLastCol = 0 Then lLastCol = 1 
      If lLastRow = 0 Then lLastRow = 1 

      Set LastCell = wrkSht.Cells(lLastRow, lLastCol) 
     End With 
     On Error GoTo 0 

    End Function 

Вы можете использовать его, чтобы найти последнюю строку/столбец, содержащий данные и скрыть все после этого:

Public Sub Main() 

    Dim WB As Workbook 
    Dim wks As Worksheet 
    'Dim WorkingColumns As Long 
    'Dim FirstRow As Long, LastRow As Long 
    'Dim FirstCol As Long, LastCol As Long 

    Set WB = ThisWorkbook 
    Set wks = WB.Worksheets(2) 

    'Not sure how you get the WorkingColumns figure, 
    'so have set it to column 5 (column E). 
    'WorkingColumns = 5 

    'FirstCol = 2 
    'LastCol = 8 

    'FirstRow = 4 
    'LastRow = 10 

    'Find the last cell containing data. 
    Dim rLastCell As Range 
    Set rLastCell = LastCell(wks) 

    With wks 

     'This Offsets by 1 column, so looks at the column after the end of data. 
     .Range(rLastCell.Offset(, 1), .Cells(1, Columns.Count)).EntireColumn.Hidden = True 
     .Range(.Cells(13, 1), .Cells(Rows.Count, 1)).EntireRow.Hidden = True 

     '''''''''''''''''''''''''Second Update''''''''''''''''''''''' 
     'A range is written as Range(FirstCellRef, LastCellRef). 
     'Cells references a single cell using row and column numbers (or letters). 
     'You can use either .Cells(3, 1) or .Cells(3,"A") to reference cell A3. 
     '.Range(.Cells(1, FirstCol), .Cells(1, LastCol)).EntireColumn.Hidden = True 
     '.Range(.Cells(FirstRow, 1), .Cells(LastRow, 1)).EntireRow.Hidden = True 

     'Set width of columns I:L 
     '.Range(.Cells(1, 9), .Cells(1, 12)).ColumnWidth = 30 

     'Set width of column N & P (column O is ignored). 
     'Union(.Cells(1, 14), .Cells(1, 16)).ColumnWidth = 2 
     ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 

     '''''''''''''''''''''''''Original Code''''''''''''''''''''''' 
     'Resize the number of columns to 8 wide, including column E. 
     'So E:L. 
     ' .Columns(WorkingColumns).Resize(, 8).Hidden = True 
     ' .Rows(12).Hidden = True 

     ' .Columns(1).ColumnWidth = 30 

     'Resize Column 2 reference by +4. 
     'So B:E 
     ' .Columns(2).Resize(, WorkingColumns - 1).ColumnWidth = 15 
     ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 
    End With 

End Sub 

Edit: я 'обновил код до ссылочных столбцов, используя первые/последние номера столбцов и строк, а не метод Resize.

+0

Я отбросил этот фрагмент кода в свою программу, и он отлично работает. Количество столбцов будет варьироваться от одного листа распространения до другого, и я хочу скрыть все столбцы справа. Количество строк является постоянным, и я хочу скрыть все строки ниже строки 12. Другими словами, будет отображаться только верхний левый угол таблицы. Немного дальнейшая помощь будет оценена. Спасибо. – RyszardJ

+0

Я обновил код, чтобы показать, как скрыть строки/столбцы с учетом первой и последней ссылки на строку/столбец. Вы можете использовать '.Cells (1,1) .End (xlToRight)' или любой другой способ, который вам подходит, чтобы получить требуемые номера строк/столбцов. '.Range (.Cells (1, 1), .Cells (1, 1) .End (xlToRight)). EntireColumn.Hidden = True' также должен работать. –

+0

Благодарим за помощь. Это почти сработало, но мне пришлось ввести константы для последней колонки и последней строки. Но, по крайней мере, я добираюсь туда. Последняя вещь - вы можете рекомендовать хорошее руководство по доступу, поскольку я просто балуюсь и работаю интуитивно. Спасибо RWJ – RyszardJ

Смежные вопросы