Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Как заставить функцию выводить значения в массив?
 
Есть функция, которая по замыслу должна на каждой итерации получать имена принтеров, и сохранять их в массив, чтобы можно было потом этот массив использовать в другой функции или макросе.
Но получилось лишь одно: выводится последнее значение в переменную, а при попытке вывести в массив AllPrinters() выходит ошибка.

Код
Public Function AllPrinters() As String
    ' Used: Frans Bus, 2015. See http://pixcels.nl/set-activeprinter-excel
    Const HKEY_CURRENT_USER = &H80000001
    Dim regobj As Object
    Dim aTypes As Variant
    Dim aDevices As Variant
    Dim vDevice As Variant
    Dim sValue As String
    Dim Printer As String
        
    ' connect to WMI registry provider on current machine with current user
    Set regobj = GetObject("WINMGMTS:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
       
    ' get the Devices from the registry
    regobj.EnumValues HKEY_CURRENT_USER, _
    "Software\Microsoft\Windows NT\CurrentVersion\Devices", aDevices, aTypes
       
    ' find Printer and create full name
    For Each Printer In AllPrinters
        For Each vDevice In aDevices
            ' get port of device
            regobj.GetStringValue HKEY_CURRENT_USER, _
            "Software\Microsoft\Windows NT\CurrentVersion\Devices", vDevice, sValue
        Next
        Printer = vDevice & " " & Split(sValue, ",")(1)
    Next
End Function
Как отобразить результат работы пользовательской функции
 
Хочу увидеть результат работы пользовательской функции. И что-то идёт не так...
Код
Private Sub test_GetPrinterFullName()
    Dim sPrinter As String
    sPrinter = GetPrinterFullName
    MsgBox sPrinter
End Sub

Где я косячу?

Скрытый текст
Как выбрать активный принтер, используя маску или макрос?
 
Идея в том, чтобы заставить макрос либо выбирать тот принтер, имя которого соответствует маске, например, как у меня: принтер с именем 2Sided CM6030 MFP  найти маской "2Sided *", либо найти соответствующее имя макросом, и затем передать это имя методу печати. Это нужно для того, чтобы определённый документ, форма, мог одинаково распечатываться на любом компьютере, где проведены соответствующие настройки (создана копия принтера, которому дано имя в соответствии с маской, например, как в примере выше).
Можно ли в данном коде:
Код
Workbooks("New.xlsx").Sheets(Array(1, 2)).PrintOut _
Collate:=True, Copies:=2, ActivePrinter:="2Sided CM6030 [8E5E17] (Ne05:)"
активный принтер указать с маской? Например:
Код
Workbooks("New.xlsx").Sheets(Array(1, 2)).PrintOut _
Collate:=True, Copies:=2, ActivePrinter:="2Sided"&"?????????????????????????????"
 
Изменено: Ярослав Чикал - 25.07.2017 06:44:19
Как создать метод, для применения в других проектах?
 
Имею код создания файла, и последующего его удаления:
Код
Sub io()
   Dim objFSO As Object, objFile As Object
   Dim sFileName As String
   Sheets(Array(2, 3)).Copy
   With ActiveWorkbook
      .SaveAs Filename:=ThisWorkbook.Path & "\New.xlsx"
      .Close True
   End With
   sFileName = ThisWorkbook.Path & "\New.xlsx"
   Set objFSO = CreateObject("Scripting.FileSystemObject")
   Set objFile = objFSO.GetFile(sFileName)
   objFile.Delete
End Sub
Этот фрагмент требуется для отправки на печать листов документа из под нового документа.
Если этот код запилить в код для распечатки, то получится довольно неприглядная конструкция. Поэтому, я решил создать два метода: Копирования листов в новый документ и Удаления этого нового документа. При этом должна быть возможность эти методы вызывать из любого проекта, например через проект PLEX.

Вопрос знатокам:
Как это сделать?
Удаление временного документа после использования, Сам спросил, сам ответил
 
Как создать новый документ ясно:
Код
Sub io()
Sheets(Array(2, 3)).Copy
With ActiveWorkbook
   .SaveAs Filename:=ThisWorkbook.Path & "\New.xlsx"   
End With
End Sub

После выполнения каких-то действий в нём, он нам не нужен больше, и его следует удалить.
Как это выполнить?

Нашёл такой вариант:
Код
Sub Delete_File()
    Dim objFSO As Object, objFile As Object
    Dim sFileName As String
 
    sFileName = "C:\WWW.xls"    'имя файла для удаления
 
    If Dir(sFileName, 16) = "" Then MsgBox "Нет такого файла", vbCritical, "Ошибка": Exit Sub
 
    'удаляем файл
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objFile = objFSO.GetFile(sFileName)
    objFile.Delete
    MsgBox "Файл удален", vbInformation, "www.excel-vba.ru"
End Sub
Однако, здесь требуется заранее указать файл и его расположение:
Код
sFileName = "C:\WWW.xls"
А в данном случае требуется удалить файл, который на момент объявления переменных ещё не существует.
Тогда можно объявить переменную после создания файла, вот так:
Код
Sub io()
   Dim objFSO As Object, objFile As Object
   Dim sFileName As String
   Sheets(Array(2, 3)).Copy
   With ActiveWorkbook
      .SaveAs Filename:=ThisWorkbook.Path & "\New.xlsx"
      .Close True
   End With
   sFileName = ThisWorkbook.Path & "\New.xlsx"
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.GetFile(sFileName)
objFile.Delete
End Sub
И этот код отрабатывается. Во всяком случае, ошибок не возникает, и файл в папке после выполнения не наблюдается. Попытка отследить изменения в папке визуально ни к чему не привели. Тогда я вставил задержку выполнения:
Код
Application.Wait Now + TimeSerial(0, 0, 5)
и увидел то, что хотел - файл создался, а через 5 секунд исчез. Макрос работает!
Полный код с задержкой:
Код
Sub io()
   Dim objFSO As Object, objFile As Object
   Dim sFileName As String
   Sheets(Array(2, 3)).Copy
   With ActiveWorkbook
      .SaveAs Filename:=ThisWorkbook.Path & "\New.xlsx"
      .Close True
   End With
   Application.Wait Now + TimeSerial(0, 0, 5)
   sFileName = ThisWorkbook.Path & "\New.xlsx"
   Set objFSO = CreateObject("Scripting.FileSystemObject")
   Set objFile = objFSO.GetFile(sFileName)
   objFile.Delete
End Sub
Из Листа-Формы скопировать данные в Лист-Реестр
 
Я могу делать этот процесс путём нудного copy/paste из ячейки А в ячейку Б, из ячейки В в ячейку Г и т.д. Строк 20 кода будет. Причём даже With / End With не используешь, потому как копирование и вставка должны проходить друг за другом. Трудоёмко, но просто. Единственное, что смущает, эт как задавать координаты сохранения: каким кодом можно найти последнюю строку в таблице? и затем, как использовать координаты этой строки?, если у меня во всех случаях будут диапазоны из объединённых как по вертикали так и по горизонтали ячеек. Если ячейку А1 можно представить, как R1C1, а вместо числа к R приставить переменную, которая получает координаты последней строки, то получится то, что мне и надо. Однако, у меня координаты ячеек такие: AB13:AG14, и это уже представлять как RnCn:Rn+nCn+n. А тут я уже теряюсь. Слишком сложной задача представляется.
Другой вариант, присваивать значения диапазонов переменным, и затем присваивать значения переменных ячейкам в другом листе - проще, но слабо представляю, как сделать. Обычно, когда люди получают ответ на форумах, они просто закрывают вкладку, и забывают. Рабочий проект крайне редко можно найти. Мне не удалось.
Буду благодарен, если кто-нибудь напишет хотябы для одного диапазона Формы макрос сохранения на новую строку таблицы.

Вот уже сейчас я подозреваю, что надо было делать это всё в UserForms.

А ещё лучше не на VBA а на C#

P.S. не могу вложить файл, т.к. весит он более 150КБ
Автоматическая двусторонняя печать двух листов таблицы средствами VBA
 
Нашёл код для печати. Адаптировал под себя.
По отдельности листы печатаются отлично.
Но, как двустороннюю печать сделать - не представляю.
Одна моя идея: назначить двум переменным Page1 и Page2 листы, а затем присвоить их сумму третьей переменной, которую уже распечатать. Успехом она пока не увенчалась.

И теперь два вопроса:
1) Если идея с присвоением третьей переменной суммы первых двух верна, то как правильно эту сумму указать переменной?
2) Если идея не верна, то как правильно реализовать двустороннюю печать?

Принципиально важно, чтобы оба листа уходили распечатываться в дуплексе принтера.

Код
Sub PRINT_0()
    Dim i As Integer
    i = Cells(Rows.Count, "B").End(xlUp).Row
    Dim Page1, Page2, TwoPage As Object
    Set Page1 = ThisWorkbook.Sheets("ТТН_1")
    Set Page2 = ThisWorkbook.Sheets("ТТН_2")
    Set TwoPage = Page1 + Page2
    With TwoPage
        .PageSetup.Orientation = xlLandscape
        .PrintOut Copies:=2, Collate:=True, ManualDuplexPrint:=False
    End With
End Sub
Как макросом копировать диапазон объединённых ячеек, и затем вставить в другой диапазон объединённых ячеек?
 
Макросом копировать один диапазон объединённых ячеек в другой такой же проблемы не составляет:
Код
Private Sub Tests()
    With ThisWorkbook.Sheets("Лист1")
        .Range("A1:C3").Copy
        .Range("A5:C7").PasteSpecial Paste:=xlPasteValues
    End With
End Sub
А вот копировать две и более объединённые ячейки в столько же объединённых ячеек уже не получается:
Код
Private Sub Tests2()
    With ThisWorkbook.Sheets("Лист1")
        .Range("A1:C3,D1:F3,G1:H3").Copy
        .Range("A5:C7,D5:F7,G5:H7").PasteSpecial Paste:=xlPasteValues
    End With
End Sub
Я знаю, что можно сделать в несколько строк, оно у меня именно так сейчас и работает:
Код
With ThisWorkbook.Sheets("Форма")
    Application.CutCopyMode = False
        .Range("AY11:BA12").Copy
        .Range("AF11:AH12").PasteSpecial Paste:=xlPasteFormulas
        .Range("AY13:BA14").Copy
        .Range("AF13:AH14").PasteSpecial Paste:=xlPasteFormulas
        .Range("AY15:BA16").Copy
        .Range("AF15:AH16").PasteSpecial Paste:=xlPasteFormulas
        .Range("AY17:BA18").Copy
        .Range("AF17:AH18").PasteSpecial Paste:=xlPasteFormulas
        .Range("AY19:BA20").Copy
        .Range("AF19:AH20").PasteSpecial Paste:=xlPasteFormulas
        .Range("AY21:BA22").Copy
        .Range("AF21:AH22").PasteSpecial Paste:=xlPasteFormulas
        .Range("AY23:BA24").Copy
        .Range("AF23:AH24").PasteSpecial Paste:=xlPasteFormulas
        .Range("AY25:BA26").Copy
        .Range("AF25:AH26").PasteSpecial Paste:=xlPasteFormulas
    End With
Но меня напрягает довольно длительное последование перескакивание фокуса с ячейки на ячейку всякий раз при открытии документа (макрос на открытие стоит).
Решил, что можно просто весь этот диапазон копировать кодом в одну строку, и таким же вставить.
Можно же, да?
Как правильно указать перечисление диапазонов?
 
Работаю над автоматизированной формой составления ТТН.
Возникла проблема, и не вижу, откуда у неё ноги растут.
Когда начинал работать с этой формой вставил макрос, чтобы при открытии документа форма очищалась.
Теперь же, мне потребовалось отредактировать диапазон, очищаемый макросом, и я внёс соответствующую правку:
Код:
Код
With ThisWorkbook.Sheets("Форма")
     .Range("E11:AH26").Value = ""
     .RB_IN.Value = True
End With

Заменил на:
Код
With ThisWorkbook.Sheets("Форма")
     .Range("E11:V26", "AF11:AH26").Value = ""
     .RB_IN.Value = True
End With

Однако, действия это не возымело: при открытии по прежнему очищается весь прежний диапазон.
Я просмотрел все модули, нигде не нашёл. Где этот код засесть мог?

P.S.: документ скину в личку.
Вернуть номер последней заполненной строки
 
Суть проблемы в том, что формула считает в правильном диапазоне, но с другого листа! Невзирая на явно указанную ссылку на нужный лист. Не могу понять: глюк или я туплю?
Как сделать "Автозаполнение" из диапазона
 
Добрый день, хочу сделать так, чтобы при введении повторяющихся выше данных автозаполнением не только данная ячейка заполнялась, но я все остальные ячейки справа, аналогично ячейкам выше. Это же силами экселя нельзя сделать, чтобы автоматом обрабатывалось. А как можно, кто знает?
Страницы: 1
Наверх