• Книги, методички для изучения VBA с нуля?

    honor8
    @honor8
    Принципы быстродействия VBA в описании
    Очень помогла разобраться со структурой Excel книга ISBN 5-8459-0921-Х (печатная версия досталась от друга). В главе 11 написано как подключаться к БД через ADO. Примеры из книги.
    Пишу для версии офиса 2007+ (от которого многие плюются, чтобы ковыряться в структуре файла необходимо разбираться в xml), но если требуется использовать возможности нового офиса, например ribbоn-меню, то тут только английская литература ISBN 978-0-470-04643-2. Примеры из книги.
    ЗЫ: Ещё советуют Уокенбаха, но лично я его не читал.
    ЗЫЫ: Для прочих приложений (Word, Outlook) толковых книг не искал, - было достаточно и-нета.
    Ответ написан
    Комментировать
  • Как разделить .xlsx по строкам?

    honor8
    @honor8
    Принципы быстродействия VBA в описании
    Если файл сохранён на диске, можно так:
    1. Открываете книгу с данными на нужном листе
    2. Заходите в VBA (Alt+F11)
    3. Выбираете в меню Insert -> Module
    4. Вставляете нижеприведённый код
    5. Нажимаете F5 (не сохраняете исходный файл)

    Option Explicit ' Обязательное объявление переменных
    Option Base 1 ' Нижняя граница массива (по умолчанию)
    '123456789012345678901234567890123456h8nor@ya567890123456789012345678toster56789
    
    Sub Border_Limit()
      Dim Limit As Integer, Count As Integer, SaveDir As String, SetTitle As Boolean
      
      Count = 1: Limit = 1000 ' Счётчик файлов; Количество строк
      SetTitle = False ' Если есть заголовок, заменить False на True
      
      SaveDir = ThisWorkbook.Path ' Или вписать полный путь для сохранения "C:\"
      ' Предполагается, что в колонке A нет пустых ячеек
      While Not IsEmpty(Cells(IIf(SetTitle, 2, 1), 1))
        Rows("1:" & Limit).Copy
        Workbooks.Add xlWBATWorksheet ' Создать новую книгу: шаблон с 1 листом
        ActiveSheet.Paste: Cells(1, 1).Select
        ActiveWorkbook.SaveAs Filename:=SaveDir & "\Массив_" & Count & ".xlsx", _
          FileFormat:=xlOpenXMLWorkbook
        ActiveWindow.Close
        Rows(IIf(SetTitle, 2, 1) & ":" & Limit).Delete Shift:=xlUp
        Count = Count + 1
      Wend: MsgBox "Файл разбит на " & Count - 1 & " файл(ов). "
    End Sub

    Никакие C++ запускать не надо.

    Для пытливых умов: Отказ от Слияния в пользу шаблонов https://toster.ru/q/320942
    Ответ написан
    5 комментариев
  • В чем моделируют здания\помещения в изометрической проекции?

    honor8
    @honor8
    Принципы быстродействия VBA в описании
    Америку не открою, выбрал бы SketchUp. Обучиться ей довольно просто за коротко время, можно использовать скрипторую анимацию. Готовые плагины стоят денег (тени отражения, детализация, гладкость) - по словам автора блога.
    Ответ написан
    Комментировать
  • Какую купить мышь для черчения, чтобы ползала без глюков?

    honor8
    @honor8 Автор вопроса
    Принципы быстродействия VBA в описании
    Выбор мыши индивидуален и субъективен, видимо поэтому и предложений не поступило. Сервисных центров Logitech в России нет, поэтому я решил не переплачивать за бренд.

    HP Wireless Laser Comfort Mouse Black (XA965AA), лазерная оптическая
    + Ход без рывков
    + Лазерный сенсор расположен посередине
    + Свободный ход колеса (колесо с подсветкой), есть горизонтальная прокрутка
    + В довесок боковые клавиши для сёрфинга и-нета
    ± Беспроводная (центр тяжести смещён назад)
    ± Вес с батарейками (AAx2) 132 г

    Не мог обойти мышь, очень похожую по форме на Logitech M705, но с кнопкой выключения сверху.
    GIGABYTE AIRE M73 (GM-AIRE 73), светодиодная оптическая
    - Ход без рывков, но немного буксует на старте
    - Светодиодный сенсор расположен между большим и указательными пальцами
    + Средний по жёсткости ход колеса (по 15 градусов)
    + В довесок боковые клавиши для сёрфинга и-нета
    ± Беспроводная (центр тяжести смещён назад)
    ± Вес с батарейками (AAAx2) 115 г
    Ответ написан
    Комментировать
  • Какой способ защиты от ботов (публикаторов для доски объявлений) лучший?

    honor8
    @honor8
    Принципы быстродействия VBA в описании
    На Авито сидят модераторы, которые круглые сутки ищут дубликаты, затем звонят публикаторам (правила читать и соблюдать не любят).

    Любая антиспам-защита будет мешать обычному пользователю выполнять действия на сайте. Обычно заказчику наплевать на такие тонкости, но раз спросили... вижу такой концепт.
    1. Группа доверенных зарегистрированных пользователей, которым не нужно вводить капчи и другие дополнительные поля (тут понадобится только 1 модератор, а куда без него. Надеюсь, графа "обслуживание" у вас в прайсе есть?).
    2. Для всех остальных вместо капчи использовать текстовые вопросы "Какой цвет у травы?", или с динамической обработкой "Назовите текущее время года" (всё зависит от бюджета заказчика). Причём данное поле с ответом должно быть перед полем ответа, чтобы пользователь смог сосредоточится на теме ответе.
    3. Все вопросы держать в БД и там же контролировать, если бот смог найти ответ (для блокирования неэффективного вопроса).
    4. СМС - номер телефона просто способ сбора личной информации, можно отпугнуть потенциальных клиентов.
    5. Банально: при регистрации дать прочитать большой текст, затем заставить ответить на вопросы (но нужно потратить время на составление теста и вопросов, чтобы нельзя было сходу нащёлкать верные ответы, как на хабаре).

    ЗЫ: Клиент у вас не капризный, а особенный. Для особенных клиентов нужен особенный прайс ;)
    Ответ написан
    2 комментария
  • Как преобразовать OpenStreetMap в DWG или SVG?

    honor8
    @honor8
    Принципы быстродействия VBA в описании
    Сам не пробовал. Зверик что-то объяснял: forum.openstreetmap.org/viewtopic.php?pid=402364#p...
    Ответ написан
    Комментировать
  • Какую книгу выбрать для быстрого изучения английского (1 месяц)?

    honor8
    @honor8
    Принципы быстродействия VBA в описании
    Считаются эффективными ассоциативные методики (не книга).
    Прежде чем оценивать, просмотрите первый урок.
    ЗЫ: Раз, Два, Три месяца не хватит на освоение 2-го языка. Четыре.
    Ответ написан
    1 комментарий
  • Как отправить email с вложение из Outlook с помощью VBA?

    honor8
    @honor8
    Принципы быстродействия VBA в описании
    Макрос отправляет письмо на "Место события" при появлении оповещения о событии.

    ' Процедуру разместить в модуле ThisOutlookSession.
    ' Уровень безопасности макросов (без цифровой подписи) - низкая.
    Option Explicit
    '123456789012345678901234567890123456h8nor@ya567890123456789012345678toster56789
    
    Private Sub Application_Reminder(ByVal Item As Object)
      Dim objMsg As MailItem, sAttachment As String
      Set objMsg = Application.CreateItem(olMailItem)
      
      ' Путь к файлу вложения (Указанный файл "Текст.txt" находится на Рабочем столе)
      sAttachment = CreateObject("Wscript.Shell").SpecialFolders.Item("Desktop") & "\Текст.txt"
      
      If Item.MessageClass <> "IPM.Appointment" Then
        Exit Sub
      End If
      If Item.Categories <> "Automated Email Sender" Then
        Exit Sub ' Закомментировать, если у события не указана категория
      End If
      
      With objMsg
        .To = Item.Location ' Место события
        .Subject = Item.Subject
        .Body = Item.Body
        ' Если файл вложения существует, то добавить в письмо
        If Len(sAttachment) > 0 Then .Attachments.Add sAttachment
        '.Display '' Показать письмо (для отправки вручную; вместо '.Send)
        .Send
      End With: Set objMsg = Nothing
    End Sub

    Заметка: Могут быть проблемы при создании писем по просроченным событиям.
    Ответ написан
    2 комментария
  • Как записать и использовать такой макрос в Excel?

    honor8
    @honor8
    Принципы быстродействия VBA в описании
    Очевидно, формула, которую надо размножить, записана во "второй строчке", т.е. диапазоне H3:K3.
    Вставьте нижеприведённый код в Module1 (который указан на скриншоте).

    ' Не самый оптимальный, но наглядный способ. Ctrl+Break - экстренная остановка.
    Option Explicit
    '123456789012345678901234567890123456h8nor@ya567890123456789012345678toster56789
    
    Sub Макрос1()
      Dim i As Long
      
      i = 3 ' Формулу будем копировать с 3-й строки
      With ThisWorkbook.ActiveSheet
        Do
          i = i + 1
          .Range("H" & i & ":K" & i) = .Range("H" & i - 1 & ":K" & i - 1).FormulaR1C1
        Loop Until i = .UsedRange.Rows.Count ' Цикл ДО последней строки с данными
      End With
    End Sub
    Ответ написан
    Комментировать
  • Как раскидать строки по листам?

    honor8
    @honor8
    Принципы быстродействия VBA в описании
    ' Таблица с данными должна начинаться с ячейки A1, лист активен. Старые данные не очищаются.
    Option Explicit
    Option Base 1
    '123456789012345678901234567890123456h8nor@ya567890123456789012345678toster56789
    
    Sub Создать_листы_по_последнему_столбцу()
      Dim a As Integer, k As Byte, m As Variant
      
      With ThisWorkbook
        With .ActiveSheet
          m = .Cells(1, 1).Resize(.UsedRange.Rows.Count, .UsedRange.Columns.Count)
        End With
        For a = LBound(m, 1) + 1 To UBound(m, 1)
          k = FindSheet(m(a, UBound(m, 2)))
          If k = 0 Then
            .Sheets.Add After:=.Sheets(.Sheets.Count): k = .Sheets.Count
            With .Sheets(k)
              .Name = m(a, UBound(m, 2))
              .Cells(1, 1) = m(LBound(m, 1), 1): .Cells(1, 2) = m(LBound(m, 1), 2)
            End With
          End If
          With .Sheets(k)
            .Cells(.UsedRange.Rows.Count + 1, 1) = m(a, LBound(m, 2)) ' Нижняя граница "m"
            .Cells(.UsedRange.Rows.Count + IIf(Val(Application.Version) >= 12, 0, 1), _
              2) = m(a, UBound(m, 2)) ' Верхняя граница "m"
          End With
        Next a
      End With
    End Sub
    
    Function FindSheet(ByVal SheetName As String) As Byte
      Dim GetBook As Workbook, GetSheet As Worksheet
      
      Set GetBook = ThisWorkbook
      For Each GetSheet In GetBook.Worksheets
        If GetSheet.Name = SheetName Then FindSheet = GetSheet.Index: Exit For
      Next GetSheet: Set GetSheet = Nothing: Set GetBook = Nothing
    End Function
    Ответ написан
    Комментировать
  • Какие варианты развития карьеры мне доступны?

    honor8
    @honor8
    Принципы быстродействия VBA в описании
    макросы в basic

    VBA - довольно узкая специализация. Как программист я довольно долго искал место.
    Макросы нужны для выполнения рутинных задач. Для серьёзного проекта нужна система, работающая с БД, но далеко не все компании готовы тратить время на разработку собственных систем учёта (чаще используют готовую CRM).
    На фрилансе далеко не уедешь, так что постоянная работа нужна в любом случае.
    SQL + VB(A) = обслуживающий программист 1C (вполне возможно)
    Ответ написан
    Комментировать
  • Как писать формулы в Excel?

    honor8
    @honor8
    Принципы быстродействия VBA в описании
    S=a*b - площадь прямоугольника
    V=a*b*c - объем прямоугольного параллелепипеда
    Формулы в Excel начинаются со знака "=" (равно).
    Ответ написан
    1 комментарий