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

Страницы: 1 2 След.
Как заставить функцию выводить значения в массив?
 
Цитата
AAF написал:
Платный раздел - просто и быстро!
Давали бы мне деньги на платные решения, я бы так и делал, всегда. Но что имею, то имею. Потому и обращаюсь на форумы, что есть люди знающие то, чего не знаю я, и которые заходят на форум именно для того, чтобы помочь тем, кто о помощи просит.  
Как заставить функцию выводить значения в массив?
 
Если повезёт, найду там, где оно будет бесплатным, вы только поделитесь  ;)  
Как заставить функцию выводить значения в массив?
 
Цитата
kuklp написал:
Вам уже советовали книжку почитать.
Укажите из какой главы какой книги можно об этом узнать, и я прочитаю, а пальцем в небо тыкать, и читать всё под ряд времени не хватит, увы, да и целесообразность сомнительна, для решения одной прикладной задачи.
Как выбрать активный принтер, используя маску или макрос?
 
Цитата
The_Prist написал:
Смотря что должно делать решение.
Функция должна выдать массив, в который записаны имена всех принтеров компьютера, чтобы уже в другом макросе его перебрать, и найти имя, подходящее по критериям. Трудность у меня именно в том, чтобы всё то, что выдаётся в Debug перенаправить в массив.
Как заставить функцию выводить значения в массив?
 
Цитата
kuklp написал:
Это Вы трусы через голову пытаетесь одеть.
:D  катаюсь...

Что-то всё равно идёт не так. Не верно задан тип переменной, как я понимаю.
Задал тип String, ругается теперь на другую строку.
Как заставить функцию выводить значения в массив?
 
Есть функция, которая по замыслу должна на каждой итерации получать имена принтеров, и сохранять их в массив, чтобы можно было потом этот массив использовать в другой функции или макросе.
Но получилось лишь одно: выводится последнее значение в переменную, а при попытке вывести в массив 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
Как выбрать активный принтер, используя маску или макрос?
 
Цитата
The_Prist написал:
в то время как в Function возвращается лишь один принтер один раз в конце функции(ВНЕ ЦИКЛА):
Значит решением может быть вывод значений в массив внутри цикла?
Что-то вроде:    
Код
For Each vDevice In aDevices
regobj.GetStringValue HKEY_CURRENT_USER, "Software\Microsoft\Windows NT\CurrentVersion\Devices", vDevice, sValue
Printers() = vDevice & " " & Split(sValue, ",")(1)
Next
Как выбрать активный принтер, используя маску или макрос?
 
Цитата
panix1111 написал:
если цель была получить и порт и имя - то можна этот вариант.
Нет, меня интересует, почему один и тот же код заключённый между SUB/END SUB и заключенный между FUNCTION/END FUNCTION даёт разный результат?
Как выбрать активный принтер, используя маску или макрос?
 
Итак, вариант от коллег, это то, что нужно.

Возьму приведённый вами фрагмент, и попробую использовать Split и Like для поиска нужного варианта.
Скрытый текст

Сделал функцию:
Код
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
    
    ' 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 vDevice In aDevices
        ' get port of device
        regobj.GetStringValue HKEY_CURRENT_USER, _
        "Software\Microsoft\Windows NT\CurrentVersion\Devices", vDevice, sValue
    Next
    AllPrinters = vDevice & " " & Split(sValue, ",")(1)
End Function

Решил проверить, что она выдаёт:
Код
Sub SeePRN()
    Dim Printer As Variant
    Printer = AllPrinters()
    Debug.Print Printer
End Sub
И получил: Ne05:

Для сравнения, макрос под спойлером выдаёт:
Цитата
Microsoft XPS Document Writer Ne01:
HP ePrint LPT1:
Fax Ne03:
Microsoft Print to PDF Ne02:
Adobe PDF Ne04:
Отправить в OneNote 16 nul:
NPI8E5E17 (HP Color LaserJet CM6030 MFP) Ne00:
2Sided CM6030 [8E5E17] Ne05:
Где я не прав?
Изменено: Ярослав Чикал - 29.07.2017 23:07:44
Как создать метод, для применения в других проектах?
 
Sanja, там, кстати, слишком много написано о том, что мне не было нужно. Мне-то требовалось лишь в коде использовать функцию, хранимую в другом модуле.
А для этого достаточно лишь взять рабочий код, упаковать в Function / End Function, и сохранить этот код в новом модуле (или старом). И всё.
Изменено: Ярослав Чикал - 29.07.2017 18:08:01
Как отобразить результат работы пользовательской функции
 
Цитата
Андрей VG написал:
А чем код, по ссылке в одной теме, приведённый в этой теме не устроил?
Не разглядел я там, где массив создаётся. По тому выводу, который я получал от функции, я решил, что она лишь получает текущий активный принтер. Не заметил For Each.

Вообще, похоже, что обсуждение вышло далеко за рамки этой темы. Возвращаюсь в профильную тему http://www.planetaexcel.ru/forum/index.php?PAGE_NAME=message&FID=1&TID=93984&amp...
Как отобразить результат работы пользовательской функции
 
Цитата
Андрей VG написал:
(и почему не отписались
Не отписался, потому что там ещё решение не найдено. Я почитал описание автора кода, и понял (возможно ошибочно), что тот код трансформирует немецкие имена принтеров в английский. Во всяком случае, результатом работы той функции становится ровно то же, что и просто ActivePrinter.
Единственное, что там мне кажется полезным - это выгрузка принтеров в массив allprinters.
Вот это я и хочу сделать. Приведённый выше фрагмент как раз от туда. Этот кусок должен был, как я понял, вернуть имя порта.
Как отобразить результат работы пользовательской функции
 
Что-то не так.
Вроде я должен увидеть значение переменной port
Код
Private Sub ListPrinters()    
    Dim obprinter As Object
    Dim allprinters As Object
    Dim i As Byte
    Dim port As String
    Set allprinters = GetObject("winmgmts://./root/CIMV2") _
    .ExecQuery("SELECT * FROM Win32_Printer", , 48)
    For Each obprinter In allprinters
        i = i + 1
        If ActivePrinter Like " * " & obprinter.Name & " * " Then
            port = Replace(ActivePrinter, obprinter.Name, "")
    Exit For
        End If
    Debug.Print port
End Sub
Но вывода нет. Ошибки тоже.
Как отобразить результат работы пользовательской функции
 
Цитата
panix1111 написал:
Вот такой код получает имена всех сетевых принтеров:
Не понятно, для чего в коде вводятся переменные: oDrives, sCurrentprinter т.к. они далее нигде не применяются. Они, видимо, для отображения сетевых дисков и активного принтера.
Результат выполнения, в данном случае, не меняется, если их убрать:
Код
Private Sub ListPrinters()
    Dim wshNetwork As Object
    Dim oPrinters As Object
    Dim iCount As Integer
    Set wshNetwork = CreateObject("WScript.Network")
    Set oPrinters = wshNetwork.EnumPrinterConnections
    For iCount = 0 To oPrinters.Count - 1 Step 2
    Debug.Print oPrinters.Item(iCount + 1)
    Next
End Sub

Однако, для работы требуется также и порт принтера, например: (Ne05:)
Попробую включить сюда поиск порта
Как отобразить результат работы пользовательской функции
 
Хочу увидеть результат работы пользовательской функции. И что-то идёт не так...
Код
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
Автоматическая двусторонняя печать двух листов таблицы средствами VBA
 
ЗАРАБОТАЛО!
Оказалось, что в следствие чего-то (не знаю чего) сменилось то имя принтера, (Ne04:) сменилось на (Ne05:) из-за чего все мои махинации с настройками целевой копии принтера не могли увенчаться успехом в принципе. Кстати, и вывод на выбранный принтер стал проходить без выбора этого принтера по-умолчанию в следствие распечатки из под нового документа. Теперь этот код можно успешно применять для двусторонней печати, при двух условиях:
1) Необходимо создать копию принтера с драйверами поддерживающими двустороннюю печать (и поменять название принтера в коде);
2) В настройках печати этого принтера указать по умолчанию вывод на двустороннюю печать, и не забыть поставить правильную ориентацию.

ИТОГ:
Макрос создаёт новый документ, копирует туда выбранные листы, отправляет листы этого документа на двустороннюю печать, и сразу закрывает этот документ, и удаляет его.
Спасибо всем, кто помогал!  :D
Код
Private Sub PRN_BTN_Click()
   ThisWorkbook.Sheets(Array(2, 3)).Copy
   With ActiveWorkbook
      .SaveAs Filename:=ThisWorkbook.Path & "\New.xlsx"
      Workbooks("New.xlsx").Sheets(Array(1, 2)).PrintOut _
      Collate:=True, Copies:=2, ActivePrinter:=FindPrinterByPattern("(?:^| )2Sided(?: |$)")
      .Close True
   End With
   Kill ThisWorkbook.Path & "\New.xlsx"
End Sub


FindPrinterByPattern
Изменено: Ярослав Чикал - 02.08.2017 13:18:36
Автоматическая двусторонняя печать двух листов таблицы средствами VBA
 
Андрей VG,
Попытался задать альбомную ориентацию, и вот что вышло
Что я не так сделал опять?
Код
Sub io()    
    ThisWorkbook.Sheets(Array(2, 3)).Copy    
    With ActiveWorkbook       
        .SaveAs Filename:=ThisWorkbook.Path & "\New.xlsx"       
        Workbooks("New.xlsx").Sheets("ТТН_1").Orientation = xlLandscape       
        Workbooks("New.xlsx").Sheets("ТТН_2").Orientation = xlLandscape       
        Workbooks("New.xlsx").Sheets(Array(1, 2)).PrintOut _       
        Copies:=1, ActivePrinter:="HP Color LaserJet CM6030 MFP [8E5E17] (Ne04:)"       
        .Close True    
    End With    
    Kill ThisWorkbook.Path & "\New.xlsx" 
End Sub 

А, нашёл, пропустил я PageSetup:

Код
With Workbooks("New.xlsx")
          .Sheets(1).PageSetup.Orientation = xlLandscape
          .Sheets(2).PageSetup.Orientation = xlLandscape
      End With
Только установка альбомной ориентации не помогла - печатает по прежнему, как книжную (переворачивает по большему краю). Игрался с настройкой на принтере, Альбомную ставил с поворотом и с переворотом, Книжную ставил с поворотом и с переворотом - ничего не помогает

Какие есть идеи, как заставить переворачивать по меньшему краю? (кроме настройки принтера)
Изменено: Ярослав Чикал - 24.07.2017 14:35:09
Автоматическая двусторонняя печать двух листов таблицы средствами VBA
 
Цитата
Андрей VG написал:
У Application нет коллекции Workbook, только Workbooks
Благодарю!
Моя идея оправдалась, теперь нормально документ выводится на двустороннюю печать, за одним исключением - второй лист перевернут (правильно для книжной ориентации). Думаю, если задать другой способ создания дуплекса (переворачивать по короткому краю), то будет то, что надо.
Удаление временного документа после использования, Сам спросил, сам ответил
 
Цитата
kuklp написал:
ППЦ. Не проще:
Проще, так и оставлю:
Код
Sub io()   
   Sheets(Array(2, 3)).Copy
   With ActiveWorkbook
      .SaveAs Filename:=ThisWorkbook.Path & "\New.xlsx"
      .Close True
   End With
   Kill ThisWorkbook.Path & "\New.xlsx"
End Sub
Изменено: Ярослав Чикал - 24.07.2017 12:17:13
Автоматическая двусторонняя печать двух листов таблицы средствами VBA
 
Сделал рабочий код, который создаёт новую книгу, добавил рабочий код, который отправляет на печать, и на выходе получил ошибку.
Что я не так сделал?
Код
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"
      Workbook("New.xlsx").PrintOut Copies:=1, _
      ActivePrinter:="HP Color LaserJet CM6030 MFP [8E5E17] (Ne04:)"
      .Close True
   End With
   sFileName = ThisWorkbook.Path & "\New.xlsx"
   Set objFSO = CreateObject("Scripting.FileSystemObject")
   Set objFile = objFSO.GetFile(sFileName)
   objFile.Delete
End Sub
Изменено: Ярослав Чикал - 24.07.2017 09:01:35
Как создать метод, для применения в других проектах?
 
Имею код создания файла, и последующего его удаления:
Код
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
Из Листа-Формы скопировать данные в Лист-Реестр
 
RAN, Вы прям интригуете =)
Растолкуйте, пжлста, в подробностях, что там происходит. В общих чертах понимаю, но объяснить не могу =)
Автоматическая двусторонняя печать двух листов таблицы средствами VBA
 
Цитата
Андрей VG написал:
Да, похоже таки гранаты
Возможно позже, когда сделаю форму с применением UserForms получится.

А у меня другая идея. Быть может, проблема у меня из-за сложного устройства документа. Если выводить макросом на печать из нового документа, то быть может будет отправляться на дуплекс. Значит, макрос стоит дополнить копированием листов ТТН_1 и ТТН_2 в новый временный документ, чтобы распечатка выполнялась оттуда.

Вот нашёл пример:
Код
Sub copy()  
    Dim wb As Workbook  
    Set wb = Workbooks.Open("c:\temp\другая книга.xlsm", ReadOnly:=True)  
    wb.Sheets("ТТН_1").Copy before:=ThisWorkbook.Sheets(1)  
    wb.Close False  
End Sub

А вот я попытался прикрутить, но как и следовало ожидать, нужных ключей не оказалось:

Код
Private Sub PRN_BTN_Click()
    Dim wb As Workbook    
    Set wb = Workbooks.Open("c:\temp\neworkbook.xlsm", ReadOnly:=False)
    wb.Sheets(Array(2, 3)).Copy before:=ThisWorkbook.Sheets(1)
    wb.Close False
    Workbooks(wb).Sheets(Array(2, 3)).PrintOut Copies:=1, ActivePrinter:="HP Color LaserJet CM6030 MFP [8E5E17] (Ne04:)"
End Sub

Изменено: Ярослав Чикал - 18.07.2017 08:57:33
Из Листа-Формы скопировать данные в Лист-Реестр
 
Цитата
panix1111 написал:
попробуйте в обоих случаях:
Да, так правильно. Вот щас и думаю, чего сразу-то я не догадался, ведь логично же: последняя строка 1, значение 0.

Теперь, если начать таблицу с нуля - то всё гут. Но и тут есть прикол: если очистить последнюю строку в таблице, чтобы сама строка осталась, но была пуста, то макрос вставляет данные в первую строку таблицы. Это похоже не лечится =)

Итоговый рабочий код:
Код
Private Sub Save_BTN_Click()
    With Sheets("Реестр ТТН")
       lastrow = .Cells(.Rows.Count, 1).End(xlUp).Row
       Var = .Cells(lastrow, 1).Value
       If IsNull(Var) = True Or Var = 0 Then
          lastrow = 1
          Var = 0
       End If
       .Cells(lastrow + 1, 1) = Var + 1
       Sheets("Форма").Cells(5, 2) = Var + 1
       .Cells(lastrow + 1, 2) = Sheets("Форма").Cells(5, 28)
       .Cells(lastrow + 1, 3) = Sheets("ТТН_1").Cells(11, 22)
       .Cells(lastrow + 1, 4) = Sheets("ТТН_1").Cells(9, 22)
       .Cells(lastrow + 1, 5) = Sheets("Форма").Cells(2, 49)
    End With
    With Sheets("Реестр Путевок")
       lastrow = .Cells(.Rows.Count, 1).End(xlUp).Row
       Var = .Cells(lastrow, 1).Value
       If IsNull(Var) = True Or Var = 0 Then
          lastrow = 1
          Var = 0
       End If
       .Cells(lastrow + 1, 1) = Var + 1
       Sheets("Форма").Cells(5, 8) = Var + 1
       .Cells(lastrow + 1, 2) = Sheets("Форма").Cells(2, 49)
       .Cells(lastrow + 1, 3) = Sheets("Форма").Cells(5, 28)
    End With
End Sub
Изменено: Ярослав Чикал - 18.07.2017 08:36:11
Автоматическая двусторонняя печать двух листов таблицы средствами VBA
 
Цитата
Андрей VG написал:
Похоже, коллега, либо гранаты не той системы, либо что-то кому-то мешает
Нет, похоже гранаты другой системы. Сделал копию принтера. Проверил имя принтера, как вы указали:
Код
?Application.ActivePrinter
Прописал в свойства этого принтера дуплекс, пустил на печать ваш образец - он мне выдал листы на дуплекс, да только перевернул не понятно как. Потом отправил мой документ - его по старинке: сперва лист с формой на дуплекс отправил, и на одной строное форму отпечатал, а на второй ничего. Затем второй лист формы отправил,  и тот пошёл без дуплекса. Два листа на одном листе опять не получились.
И если судить по картинке, в моём документе Лист1 - ТТН_1, Лист2 ТТН_2. Я также и указал, первый лист и второй:
Код
Private Sub PRN_BTN_Click()
    ThisWorkbook.Sheets(Array(1, 2)).PrintOut Copies:=1, ActivePrinter:="HP Color LaserJet CM6030 MFP [8E5E17] (Ne04:)"
End Sub
А печатал он по факту Первый лист и третий.
Проверил формулой ЛИСТ: ТТН_1 - лист2, ТТН_2 - лист3. Однако, в дуплекс отправляет по прежнему только первый из листов, и только на одну сторону, а второй без дуплекса.

Кстати, указание здесь конкретного принтера не помогло, пока я этот самый принтер не сделал по-умолчанию, что как бы не правильно.
Изменено: Ярослав Чикал - 17.07.2017 16:11:28
Из Листа-Формы скопировать данные в Лист-Реестр
 
Цитата
panix1111 написал:
начинайте учить Акцесс
Зачаток базы данных уже есть, ждёт, когда я приступлю к нему.
Из Листа-Формы скопировать данные в Лист-Реестр
 
Цитата
panix1111 написал:
Добавьте после  Var = .Cells.... :
Благодарствую, работает, помогло =)

А не подскажете, может где-то можно короче написать?
Код
Private Sub Save_BTN_Click()
    With Sheets("Реестр ТТН")
       lastrow = .Cells(.Rows.Count, 1).End(xlUp).Row
       Var = .Cells(lastrow, 1).Value
       If IsNull(Var) = True Or Var = 0 Then
          lastrow = 1
          Var = 1
       End If
       .Cells(lastrow + 1, 1) = Var + 1
       Sheets("Форма").Cells(5, 2) = Var + 1
       .Cells(lastrow + 1, 2) = Sheets("Форма").Cells(5, 28)
       .Cells(lastrow + 1, 3) = Sheets("ТТН_1").Cells(11, 22)
       .Cells(lastrow + 1, 4) = Sheets("ТТН_1").Cells(9, 22)
       .Cells(lastrow + 1, 5) = Sheets("Форма").Cells(2, 49)
    End With
    With Sheets("Реестр Путевок")
       lastrow = .Cells(.Rows.Count, 1).End(xlUp).Row
       Var = .Cells(lastrow, 1).Value
       If IsNull(Var) = True Or Var = 0 Then
          lastrow = 1
          Var = 1
       End If
       .Cells(lastrow + 1, 1) = Var + 1
       Sheets("Форма").Cells(5, 8) = Var + 1
       .Cells(lastrow + 1, 2) = Sheets("Форма").Cells(2, 49)
       .Cells(lastrow + 1, 3) = Sheets("Форма").Cells(5, 28)
    End With
End Sub

Хотя есть кое-что. Макрос начинает первую строку с двойки. Заменил на нули lastrow и Var

Код
lastrow = 0Var = 0

Нумеровать стал с единицы, однако, первой строкой макрос счёл заголовок таблицы, и прям туда сделал записи.
Изменено: Ярослав Чикал - 17.07.2017 15:36:03 (Новые ошибки)
Из Листа-Формы скопировать данные в Лист-Реестр
 
panix1111, Юрий М, Nordheim, спасибо, благодаря всем вам, я ещё немного продвинулся в цели.

Вот полностью рабочий код на кнопке, начинает новую строку и копирует нужные значения в нужные ячейки.
Код
Private Sub Save_BTN_Click()
    With Sheets("Реестр ТТН")
       lastrow = .Cells(.Rows.Count, 1).End(xlUp).Row
       Var = .Cells(lastrow, 1).Value
       .Cells(lastrow + 1, 1) = Var + 1
       Sheets("Форма").Cells(5, 2) = Var + 1
       .Cells(lastrow + 1, 2) = Sheets("Форма").Cells(5, 28)
       .Cells(lastrow + 1, 3) = Sheets("ТТН_1").Cells(11, 22)
       .Cells(lastrow + 1, 4) = Sheets("ТТН_1").Cells(9, 22)
       .Cells(lastrow + 1, 5) = Sheets("Форма").Cells(2, 49)
    End With
    With Sheets("Реестр Путевок")
       lastrow = .Cells(.Rows.Count, 1).End(xlUp).Row
       Var = .Cells(lastrow, 1).Value
       .Cells(lastrow + 1, 1) = Var + 1
       Sheets("Форма").Cells(5, 8) = Var + 1
       .Cells(lastrow + 1, 2) = Sheets("Форма").Cells(2, 49)
       .Cells(lastrow + 1, 3) = Sheets("Форма").Cells(5, 28)
    End With
End Sub
Однако, с нумерацией возник казус: копировать номер из формы - лишнее, было нужно, когда я ручками в реестре последний номер проверял. Теперь же потребовалось, чтобы номер автоматически выставлялся, плюсуя единицу к номеру выше.
Это я сделал таким фрагментом:
Код
Var = .Cells(lastrow, 1).Value
.Cells(lastrow + 1, 1) = Var + 1
Sheets("Форма").Cells(5, 2) = Var + 1

И тут обнаружилась другая проблема, если первая строка таблицы пуста, данные формы заносятся за пределы диапазона таблицы:


P.S: как тут картинку вставить в текст? Я залил на облако майла, вставил в ссылку в тэг, и чёт никак.
Изменено: Ярослав Чикал - 17.07.2017 12:38:13
Страницы: 1 2 След.
Наверх