2014-09-17 3 views
0

У меня есть следующий код, который создает ссылки на лист сводки на нескольких листах CS. Количество листов CS генерируется на одном главном листе CS с использованием другого модуля кода. Код работает, но очень медленно при создании нескольких листов CS. Как я могу сделать его более эффективным?Более эффективная подпрограмма

Sub CSrefs() 
' 
' Adds links from Summary Sheet to CS Sheets: 

Dim i As Integer 
Dim iOffset As Integer 

    intCount = ActiveWorkbook.Sheets.Count  'Find total number of workbook sheets 
    intCS1_Index = Sheets("CS1").Index   'CS1 Sheet index 
    intCSCount = intCount - (intCS1_Index - 1) 'Find total number of CS sheets 
    NonCSSheets = intCount - intCSCount   'Find total number of Non-CS sheets 

For i = 1 To intCSCount 'number of sheets 

    iOffset = i + NonCSSheets 
    Sheets("CS" & i).Select 
    Range("B3").Select 
     ActiveCell.Formula = "=SUMMARY!E" & iOffset 
    Range("A6").Select 'Adds hyperlink to Summery Sheet 
     ActiveCell.Hyperlinks.Add Anchor:=Selection, Address:="", SubAddress:="Summary!A" & iOffset, TextToDisplay:="Go to Summary Sheet" 
    Range("F8").Select 
     ActiveCell.Formula = "=SUMMARY!F" & iOffset 
    Range("D8").Select 
     ActiveCell.Formula = "=SUMMARY!G" & iOffset 
    Range("B12").Select 
     ActiveCell.Formula = "=SUMMARY!H" & iOffset 
    Range("K19").Select 
     ActiveCell.Formula = "=SUMMARY!S" & iOffset 
    Range("K49").Select 
     ActiveCell.Formula = "=SUMMARY!T" & iOffset 
    Range("K79").Select 
     ActiveCell.Formula = "=SUMMARY!U" & iOffset 
    Range("K109").Select 
     ActiveCell.Formula = "=SUMMARY!V" & iOffset 
    Range("K139").Select 
     ActiveCell.Formula = "=SUMMARY!W" & iOffset 
    Range("K169").Select 
     ActiveCell.Formula = "=SUMMARY!X" & iOffset 
    Range("B8").Select 

Next i 

Sheets("Summary").Select 

End Sub 
+0

Создание листов - это медленный процесс, но вам не нужны все избранные там, что поможет. Вы просто должны использовать Range («X #»). Formula = «SUMMARY! X» & iOffset. Это может немного сократить обработку. Кроме того, если вы не отключите обновление экрана, это сильно замедлит работу. Подумайте о завершении кода с помощью 'Application.ScreenUpdating = false ... Application.ScreenUpdating = true', чтобы сократить частоту обновления, что может помочь совсем немного. – tmoore82

+0

Поскольку таблицы Excel 2007 имеют емкость для 1 048 576 строк, поэтому я бы добавил, что хорошей практикой является объявление ваших числовых переменных как 'Long', а не' Integer'. Целое число, присвоенное 'Rows.Count', будет генерировать переполнение. – Jeeped

ответ

1

прекращая вещи - нет никакой необходимости в УВА

вместо

iOffset = i + NonCSSheets 
Sheets("CS" & i).Select 
Range("B3").Select 
    ActiveCell.Formula = "=SUMMARY!E" & iOffset 
Range("A6").Select 'Adds hyperlink to Summery Sheet 
    ActiveCell.Hyperlinks.Add Anchor:=Selection, Address:="", SubAddress:="Summary!A" & iOffset, TextToDisplay:="Go to Summary Sheet" 
Range("F8").Select 
    ActiveCell.Formula = "=SUMMARY!F" & iOffset 

попробовать

iOffset = i + NonCSSheets 
    with sheets("CS" & i) 
     range("b3").formula = "=SUMMARY!E" & iOffset 
     range("a6").hyperlinks.add Anchor:=Selection, Address:="", SubAddress:="Summary!A" & iOffset, TextToDisplay:="Go to Summary Sheet" 
     range("f8").formula = "=SUMMARY!F" & iOffset 
    end with 

и т.д.

+0

может отсутствовать префикс. в объектах «Range» внутри этого 'With ... End With' и' Selection' как 'anchor' в' hyperlink' должны быть изменены. – Jeeped

+0

Спасибо всем. Извлеченные уроки о том, что вы не используете Select –

2
Sub CSrefs() 
' 
' Adds links from Summary Sheet to CS Sheets: 

Dim i As Integer, iOffset As Integer, intCount as Integer 
Dim intCS1_Index As Integer, intCSCount as Integer, nonCSSheets as Integer 

On Error Goto ErrHandler 

Application.ScreenUpdating = False 

intCount = ActiveWorkbook.Sheets.Count  'Find total number of workbook sheets 
intCS1_Index = Sheets("CS1").Index   'CS1 Sheet index 
intCSCount = intCount - (intCS1_Index - 1) 'Find total number of CS sheets 
NonCSSheets = intCount - intCSCount   'Find total number of Non-CS sheets 

For i = 1 To intCSCount 'number of sheets 
    iOffset = i + NonCSSheets 
    With Sheets("CS" & i) 
     .Range("B3").Formula = "=SUMMARY!E" & iOffset 
     .Range("A6").Hyperlinks.Add Anchor:=.Range("A6"), Address:="", SubAddress:="Summary!A" & iOffset, TextToDisplay:="Go to Summary Sheet" 
     .Range("F8").Formula = "=SUMMARY!F" & iOffset 
     .Range("D8").Formula = "=SUMMARY!G" & iOffset 
     .Range("B12").Formula = "=SUMMARY!H" & iOffset 
     .Range("K19").Formula = "=SUMMARY!S" & iOffset 
     .Range("K49").Formula = "=SUMMARY!T" & iOffset 
     .Range("K79").Formula = "=SUMMARY!U" & iOffset 
     .Range("K109").Formula = "=SUMMARY!V" & iOffset 
     .Range("K139").Formula = "=SUMMARY!W" & iOffset 
     .Range("K169").Formula = "=SUMMARY!X" & iOffset 
    End With 
Next i 

Sheets("Summary").Select 

ExitHere: 
    Application.ScreenUpdating = True 
    Exit Sub 

ErrHandler: 
    ' take care of errors here if needed 
    GoTo ExitHere 

End Sub 

Непрошеным. Я изменил несколько вещей:

  • декларировать все переменные Спереди (используйте Option Explicit, установите его в настройках VBE)
  • не Select материала, вы можете работать с клетками непосредственно
  • если ваш код много взаимодействует с выключенными ячейками. Screenupdating
+0

Хороший вопрос о 'Select'. Мне всегда нравится ссылаться на эту тему (http://stackoverflow.com/questions/10714251/how-to-avoid-using-select-in-excel-vba-macros), которая объясняет, как и почему :) –

+0

I что 'iOffset = i + NonCSSheets' должен находиться в цикле' For ... Next'. – Jeeped

+0

@ Jeeped: очень верно, спасибо, я исправил его. – xificurC

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