Я ничего не знаю о внутренних интерпретаторах Python-интерпретатора (и я тоже не являюсь экспертом в компиляторах и интерпретаторах), поэтому не обвиняйте меня, если я предлагаю что-либо недоступное или невозможное.
При условии, что python объекты меняются. Я думаю, что это следует учитывать при разработке аргументов аргументов по умолчанию. Когда вы создаете экземпляр списка:
a = []
вы ожидаете получить новый список, на который ссылается a .
Почему a = [] в
def x(a=[]):
создать новый список по определению функции, а не по вызову? Это точно так же, как вы спрашиваете: «Если пользователь не предоставляет аргумент, тогда создает экземпляр нового списка и использует его, как если бы он был создан вызывающим». Я думаю, что это неоднозначно:
def x(a=datetime.datetime.now()):
пользователь, вы хотите a по умолчанию использовать дату и время, соответствующее тому, когда вы определяете или выполняете x ? В этом случае, как и в предыдущем, я буду придерживаться такого же поведения, как если бы аргумент по умолчанию «назначение» был первой инструкцией функции (datetime.now (), вызванной вызовом функции). С другой стороны, если пользователь хотел отобразить время отображения, он мог бы написать:
b = datetime.datetime.now()
def x(a=b):
Я знаю, я знаю: это закрытие. В качестве альтернативы Python может предоставить ключевое слово для привязки определения времени:
def x(static a=b):
Так как есть множество разных строк, которые можно скрыть и показать, я сделал первый пример, который вы можете использовать, чтобы сделать все остальное:
Dim wb As Workbook, ws As Worksheet, SheetNames
Application.DisplayAlerts = False 'Prevents general pop-ups
Application.Calculation = xlManual 'Formulas are not calculated
Application.ScreenUpdating = False 'What the user see's on screen will not change
If Intersect(Target, Range("D10")) Is Nothing Then Exit Sub
Set wb = ThisWorkbook
SheetNames = Array("Weekly Report - New", "Cumulative Report - New")
StrValue = Target.Value
Select Case StrValue
'Hides all major city information so just the titles are shown.
Case vbNullString
For i = 0 To 1
Set ws = wb.Sheets(SheetNames(i))
With ws
.Unprotect
Union(.Rows("54:63"), .Rows("68:77"), .Rows("82:91"), .Rows("96:105"), .Rows("23:47")). _
EntireRow.Hidden = True
.Rows("18:31").EntireRow.Hidden = False
End With
Next i
'All the other cases
End Select
То, что я сделал, было цикл для каждого нужного вам листа работать (при условии, что оба имеют одинаковые данные) и использовать то, что urdearboy сказал о объединении для большей читабельности и ускорения процесса.
Надеюсь, это направит вас в правильном направлении. Если вам нужна помощь, просто спросите.