Leanna, 23 это сумма xlErrors (16), xlLogical (4), xlNumbers (1), xlTextValues(2), т.е. если нужны только числа и текст то будет 3, цикл с r.Areas я просто пропустил, хотел его убрать, сначала чего-то в голову ударило, потом одумался, исправил свой пост
Leanna, 23 это сумма xlErrors (16), xlLogical (4), xlNumbers (1), xlTextValues(2), т.е. если нужны только числа и текст то будет 3, цикл с r.Areas я просто пропустил, хотел его убрать, сначала чего-то в голову ударило, потом одумался, исправил свой постkrosav4ig
Sub qwe() Dim r As Range, c As Range Set r = [E:E].SpecialCells(2, 23).SpecialCells(12) Application.ScreenUpdating = 0 [I:P].EntireColumn.Hidden = True For Each c In [I2:P2] If Not r.Find(c, , xlValues, xlWhole) Is Nothing Then c.EntireColumn.Hidden = 0 Next End Sub
[/vba]
Вдруг правильно? [vba]
Код
Sub qwe() Dim r As Range, c As Range Set r = [E:E].SpecialCells(2, 23).SpecialCells(12) Application.ScreenUpdating = 0 [I:P].EntireColumn.Hidden = True For Each c In [I2:P2] If Not r.Find(c, , xlValues, xlWhole) Is Nothing Then c.EntireColumn.Hidden = 0 Next End Sub
Sub qwe() With Application: .ScreenUpdating = 0: .EnableEvents = 0: .DisplayAlerts = 0 With ActiveWorkbook.Worksheets("Лист1").Sort With .SortFields .Clear .Add Intersect([A1].CurrentRegion, [E:E]), 0, 1, 0 .Add Intersect([A1].CurrentRegion, [F:F]), 0, 1, 0 .Add Intersect([A1].CurrentRegion, [D:D]), 0, 1, 0 End With .SetRange [A1].CurrentRegion .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With Dim col As Range, rcnt&, rnum&: rnum = 2 With Intersect([A2].CurrentRegion, [E:G], ActiveSheet.UsedRange.Offset(1)) .Select Do On Error Resume Next Selection.ColumnDifferences(ActiveCell).Select rcnt = Selection.Row - rnum: rnum = Selection.Row If rcnt > 1 Then For Each col In .Rows(rnum).Offset(-rcnt - 1).Resize(rcnt).Columns col.Merge Next End If Loop Until Err.Number If Selection.Rows.Count > 1 Then For Each col In Selection.Columns col.Merge Next End If End With Intersect([A1].CurrentRegion, [D:D]).Cut Intersect([A1].CurrentRegion.EntireRow, [H:H]).Insert Shift:=xlToRight Intersect([A1].CurrentRegion, [D:G]).Cut Intersect([A1].CurrentRegion, [A:A]).Insert Shift:=xlToRight .ScreenUpdating = 1: .EnableEvents = 1: .DisplayAlerts = 1: End With End Sub
[/vba]
[vba]
Код
Sub qwe() With Application: .ScreenUpdating = 0: .EnableEvents = 0: .DisplayAlerts = 0 With ActiveWorkbook.Worksheets("Лист1").Sort With .SortFields .Clear .Add Intersect([A1].CurrentRegion, [E:E]), 0, 1, 0 .Add Intersect([A1].CurrentRegion, [F:F]), 0, 1, 0 .Add Intersect([A1].CurrentRegion, [D:D]), 0, 1, 0 End With .SetRange [A1].CurrentRegion .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With Dim col As Range, rcnt&, rnum&: rnum = 2 With Intersect([A2].CurrentRegion, [E:G], ActiveSheet.UsedRange.Offset(1)) .Select Do On Error Resume Next Selection.ColumnDifferences(ActiveCell).Select rcnt = Selection.Row - rnum: rnum = Selection.Row If rcnt > 1 Then For Each col In .Rows(rnum).Offset(-rcnt - 1).Resize(rcnt).Columns col.Merge Next End If Loop Until Err.Number If Selection.Rows.Count > 1 Then For Each col In Selection.Columns col.Merge Next End If End With Intersect([A1].CurrentRegion, [D:D]).Cut Intersect([A1].CurrentRegion.EntireRow, [H:H]).Insert Shift:=xlToRight Intersect([A1].CurrentRegion, [D:G]).Cut Intersect([A1].CurrentRegion, [A:A]).Insert Shift:=xlToRight .ScreenUpdating = 1: .EnableEvents = 1: .DisplayAlerts = 1: End With End Sub
Private Function GetPrinter$(PrinterName$) Dim StrKey$: StrKey = "HKCU\Software\Microsoft\Windows NT\CurrentVersion\Devices\" With CreateObject("WScript.Shell") GetPrinter = PrinterName & " (" & Split(.RegRead(StrKey & PrinterName), ",")(1) & ")" End With End Function Sub DefinePrinters() On Error Resume Next Me.CustomDocumentProperties.Add "книга", 0, 4, "Принтер" 'задаем принтер для этой книги CustomDocumentProperties("книга") = "Принтер" 'если принтер для этой книги был задан раньше Me.CustomDocumentProperties.Add "Лист1", 0, 4, "Canon Inkjet iP4600 series" 'задаем принтер для Листа1 CustomDocumentProperties("Лист1") = "Canon Inkjet iP4600 series" 'если принтер для Листа1 был задан раньше Me.CustomDocumentProperties.Add "Лист2", 0, 4, "Принтер2" CustomDocumentProperties("Лист2") = "Принтер2" Me.CustomDocumentProperties.Add "Лист3", 0, 4, "Принтер3" CustomDocumentProperties("Лист3") = "Принтер3" End Sub Private Sub Workbook_BeforePrint(Cancel As Boolean) With ActiveWindow.SelectedSheets Application.ActivePrinter = GetPrinter(CustomDocumentProperties(IIf(.Count > 1, "книга", .Item(1).Name))) End With End Sub
[/vba] если нужны названия принтеров, вот функция, возвращающая массив названий всех установленных принтеров [vba]
Код
Function GetPrinters() As Variant Dim coll As Collection: Set coll = New Collection Dim StrKey$: StrKey = "HKCU\Software\Microsoft\Windows NT\CurrentVersion\Devices\" Dim n&, arr() With GetObject("winmgmts://./root/CIMV2") For Each Printer In .ExecQuery("SELECT * FROM Win32_Printer", , 48) ReDim Preserve arr(n): arr(n) = Printer.Name n = n + 1 Next End With GetPrinters = arr End Function
[/vba]
В модуль ЭтаКнига [vba]
Код
Private Function GetPrinter$(PrinterName$) Dim StrKey$: StrKey = "HKCU\Software\Microsoft\Windows NT\CurrentVersion\Devices\" With CreateObject("WScript.Shell") GetPrinter = PrinterName & " (" & Split(.RegRead(StrKey & PrinterName), ",")(1) & ")" End With End Function Sub DefinePrinters() On Error Resume Next Me.CustomDocumentProperties.Add "книга", 0, 4, "Принтер" 'задаем принтер для этой книги CustomDocumentProperties("книга") = "Принтер" 'если принтер для этой книги был задан раньше Me.CustomDocumentProperties.Add "Лист1", 0, 4, "Canon Inkjet iP4600 series" 'задаем принтер для Листа1 CustomDocumentProperties("Лист1") = "Canon Inkjet iP4600 series" 'если принтер для Листа1 был задан раньше Me.CustomDocumentProperties.Add "Лист2", 0, 4, "Принтер2" CustomDocumentProperties("Лист2") = "Принтер2" Me.CustomDocumentProperties.Add "Лист3", 0, 4, "Принтер3" CustomDocumentProperties("Лист3") = "Принтер3" End Sub Private Sub Workbook_BeforePrint(Cancel As Boolean) With ActiveWindow.SelectedSheets Application.ActivePrinter = GetPrinter(CustomDocumentProperties(IIf(.Count > 1, "книга", .Item(1).Name))) End With End Sub
[/vba] если нужны названия принтеров, вот функция, возвращающая массив названий всех установленных принтеров [vba]
Код
Function GetPrinters() As Variant Dim coll As Collection: Set coll = New Collection Dim StrKey$: StrKey = "HKCU\Software\Microsoft\Windows NT\CurrentVersion\Devices\" Dim n&, arr() With GetObject("winmgmts://./root/CIMV2") For Each Printer In .ExecQuery("SELECT * FROM Win32_Printer", , 48) ReDim Preserve arr(n): arr(n) = Printer.Name n = n + 1 Next End With GetPrinters = arr End Function
Private Function GetPrinter$(PrinterName$) Dim StrKey$: StrKey = "HKCU\Software\Microsoft\Windows NT\CurrentVersion\Devices\" With CreateObject("WScript.Shell") GetPrinter = PrinterName & " (" & Split(.RegRead(StrKey & PrinterName), ",")(1) & ")" End With End Function Private Sub Workbook_Activate() On Error Resume Next Me.CustomDocumentProperties.Add "printer", 0, 4, "имя принтера" CustomDocumentProperties("printer") = "имя принтера" Parent.ActivePrinter = GetPrinter(CustomDocumentProperties("printer")) End Sub
Private Function GetPrinter$(PrinterName$) Dim StrKey$: StrKey = "HKCU\Software\Microsoft\Windows NT\CurrentVersion\Devices\" With CreateObject("WScript.Shell") GetPrinter = PrinterName & " (" & Split(.RegRead(StrKey & PrinterName), ",")(1) & ")" End With End Function Private Sub Workbook_Activate() On Error Resume Next Me.CustomDocumentProperties.Add "printer", 0, 4, "имя принтера" CustomDocumentProperties("printer") = "имя принтера" Parent.ActivePrinter = GetPrinter(CustomDocumentProperties("printer")) End Sub
koyaanisqatsi, держите еще вот такую простенькую процедуру, вдруг пригодится [vba]
Код
Sub PrintPages(StrPages$) For Each rr In Split(StrPages$, ",") ActiveWindow.SelectedSheets.PrintOut Split(rr, "-")(0), Split(rr, "-")(IIf(InStr(rr, "-"), 1, 0)), 1 Next End Sub Sub пример_использования() PrintPages "1-3,10-15,20-60" End Sub
[/vba]
upd ошибочка вышла, исправил код
koyaanisqatsi, держите еще вот такую простенькую процедуру, вдруг пригодится [vba]
Код
Sub PrintPages(StrPages$) For Each rr In Split(StrPages$, ",") ActiveWindow.SelectedSheets.PrintOut Split(rr, "-")(0), Split(rr, "-")(IIf(InStr(rr, "-"), 1, 0)), 1 Next End Sub Sub пример_использования() PrintPages "1-3,10-15,20-60" End Sub