• Проблема с crlf, как конвертировать?

    honor8
    @honor8
    Принципы быстродействия VBA в описании
    .gitattributes, например должно помочь :)
    Ответ написан
    2 комментария
  • Почему в графе изменений на github не отображаются коммиты?

    honor8
    @honor8
    Принципы быстродействия VBA в описании
    Если речь о репозитории "Second-project", то на главной отображаются только коммиты главной ветки. В network все изменения отображаются.
    Ответ написан
    Комментировать
  • Как конвертировать файл .csv в формат .xlsx на VBScript?

    honor8
    @honor8
    Принципы быстродействия VBA в описании
    Берём какой-нибудь скрипт с заменой символов и изменяем под задачу.
    Option Explicit
    
    Const VERSION = "rev100"
    Const VERSIONDATE = "17/10/2016"
    
    Sub ProcessDir(folder)
    	Dim fname, file, subfolder, i
    	Const ForReading = 1
    	Const ForWriting = 2
    	Const xlOpenXMLWorkbook = 51
    	
    	For Each file In folder.Files
    	If extold = LCase(fso.GetExtensionName(file)) Then
    		fname = file.Path
    		Set fl = fso.OpenTextFile(fname, ForReading, False)
    		txt = Split(fl.ReadAll(), vbCrLf)
    		For i = 0 To UBound(txt)
    			txt(i) = Replace(txt(i), ";", ",")
    		Next
    		fl.Close
    		file.Name = file.Name & "_bak"
    		Set fl = fso.CreateTextFile(fname, True)
    		fl.Write Join(txt, vbCrLf)
    		fl.Close
    	End If
    	Next
    	For Each file In folder.Files
    	If extold = LCase(fso.GetExtensionName(file)) Then
    		fname = file.Path
    		Set fl = CreateObject("Excel.Application")
    '		fl.Visible = True ' Debug
    		With fl.Workbooks.Open(fname)
    			' Do Something... '
    			.SaveAs Replace(fname, extold, extnew), xlOpenXMLWorkbook: .Close False
    		End With
    		fso.DeleteFile(Replace(fname, extold & "_bak", extold))
    	End If
    	Next
    	For Each file In folder.Files
    	If extold & "_bak"= LCase(fso.GetExtensionName(file)) Then
    		file.Name = Replace(file.Name, extold & "_bak", extold)
    		MsgBox "File " & file.Name & " successfully created.", vbInformation
    	End If
    	Next
    	For Each subfolder In folder.SubFolders
    		ProcessDir (subfolder)
    	Next
    End Sub
    
    Dim fso, folder, fl, txt
    folder = "C:\Users\User\Desktop\"
    ' Change the extension in the program settings
    Const extold = "csv"
    ' This extension can be written after changing semicolon to a comma
    Const extnew = "xlsx"
    
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set folder = fso.GetFolder(folder)
    ProcessDir (folder)
    Set fso = Nothing
    Ответ написан
  • В чем ошибка в создании зависимых списков excel?

    honor8
    @honor8
    Принципы быстродействия VBA в описании
    Всё у вас работает. Выберите значение из списка в ячейке C2, увидите список в ячейке D2.
    Ответ написан
  • Как сравнить два файла с определенных коммитов?

    honor8
    @honor8
    Принципы быстродействия VBA в описании
    Можно на сайте GitHub https://help.github.com/articles/comparing-commits...
    Ответ написан
    Комментировать
  • Как сравнить два коммита GIT?

    honor8
    @honor8
    Принципы быстродействия VBA в описании
    Можно на сайте GitHub https://help.github.com/articles/comparing-commits...
    Ответ написан
    Комментировать
  • Картография при помощи квадрокоптера?

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

    honor8
    @honor8
    Принципы быстродействия VBA в описании
    Функция VLOOKUP ищет в первом столбце диапазона (диапазон указан во 2-м аргументе). Поскольку значения в колонках 2 и 4 не уникальные, то значения этих колонок необходимо соединить формулой (добавить новую колонку перед 2-й колонкой, и вставить формулу =$C5&$E5 по всей колонке). Рабочую формулу заменить на:
    =IF($C5;VLOOKUP($B5;'seznam januar 2016'!$B$5:$AI$2500;3);" ")
    Ответ написан
  • Почему adblock не блокирует рекламу в Yandex'е?

    honor8
    @honor8
    Принципы быстродействия VBA в описании
    Убрал рекламу. Обошёл динамические атрибуты.
    ! Реклама в поиске (старая)
    yandex.ru## li[class*="serp-adv-item"]
    ! Рекламная ссылка-заголовок, описание с телефонами
    yandex.ru## li.serp-item > div[class^="organic"] > h2:not([class$="title"]),h2:not([class$="title"]) ~ div
    ! Прочие ссылки кроме адресов, форумов, картинок, карт, маркета
    yandex.ru## li[class^="serp-item "]:not([class$="adresa"]):not([class$="forum"]):not([class*="image-stats"]):not([class*="z-maps"]):not([class*="z-market"])

    Но это всё равно полумеры. Завтра опять может что-нибудь изменится. Создал на GitHub лист с подписками.
    Без поддержки псевдо-атрибутов нужно писать userscript ((
    ЗЫ: на Я-Главной - изменить cookies через настройки.
    Ответ написан
    2 комментария
  • Как снять пароль с VBA проекта файла XLAM?

    honor8
    @honor8
    Принципы быстродействия VBA в описании
    Статьи описывают другой алгоритм. Здесь помогают. +RAR
    Ответ написан
  • Как на VBA написать массив?

    honor8
    @honor8
    Принципы быстродействия VBA в описании
    Так объявляются статические массивы (границы массива изменять нельзя):
    ' 1 - нижняя граница массива, 5 - верхняя граница массива
    Dim arr(1 To 5) As Integer
    ' Если не объявлять нижнюю границу,
    ' то по умолчанию в Excel нижняя граница массива будут начинаться с 0 до 5

    Динамические массивы объявляются безразмерными, затем для изменения границ массива используется оператор ReDim. Параметр Preserve можно опустить:
    Dim arr() As Integer
    b = 5
    ' Параметр Preserve нужен для сохранения значений в массиве при изменении верхней границы
    ReDim Preserve arr(1 To b)

    ЗЫ: Если всё понятно, внизу ответа нужно нажать кнопку "Отметить решением" :)
    Ответ написан
    Комментировать
  • Как удобнее реализовать проверку наличия вводимого значения в Excel?

    honor8
    @honor8
    Принципы быстродействия VBA в описании
    Для подсветки повторяющихся значений в столбце можно использовать условное форматирование. Если хотите использовать безграничный диапазон (неизвестно конечное число строк), в примере выделите всю колонку "A" и измените в условном форматировании формулу на =ПОИСКПОЗ($A1;$A:$A;0)<>СТРОКА($A1), а диапазон укажите =$A:$A.
    Значение должно быть целиком введено в ячейку. Регистр (для текста) не учитывается.

    Если требуется выбирать только введённые (ранее) значения, то в Excel создаются списки значений.
    Ответ написан
    5 комментариев
  • Как правильно составить запрос с датой в vba access?

    honor8
    @honor8
    Принципы быстродействия VBA в описании
    Создавал дату в виде dt = DateSerial(2015, 12, 31), затем в запросе SQL обращался: "SELECT ... #" & Format(dt, "yyyy-mm-dd") & "#". С другими разделителями эффекта не достиг.
    Ответ написан
    Комментировать
  • Как и возможно ли чтобы, при подписи делений на оси абсцисс, вместо чисел было число Пи с соответствующими коэффициентами?

    honor8
    @honor8
    Принципы быстродействия VBA в описании
    Возможно.
    c66ffb163af34fdc9492eef8859bc72a.png
    Подготавливаем данные для функции синуса.
    1. В колонке A указываем значения по оси абсцисс от -2,5 до 2,5 с шагом 0,125; это минимальная кратность шага. Т.о. можно в ячейку A2 записать формулу =$A1+СТЕПЕНЬ(0,5;3) и протянуть до 41-й строки, а в ячейку A1 записать значение "-2,5"
    2. В колонке B устанавливаем меру для оси абсцисс кратную Пи с помощью формулы: =ОКРУГЛ(ПИ()*$A1;2)
    3. В колонке C записываем формулу синуса: =SIN(ПИ()*$A1)

    Строим график синуса, указывая в "данных диаграммы" колонку C. Настраиваем график:
    1. Конструктор (меню) -> Выбрать данные
    2. Подписи по горизонтальной оси (правая колонка) -> Изменить (кнопка)
    3. Выбираем для "диапазона подписей" колонку B. Нажимаем OK.

    Открываем "Дополнительные параметры основной горизонтальной оси". В Excel 2010: Макет (вкладка) -> Оси (раздел).
    1. Выбираем в "Параметры оси" (меню слева) -> Вертикальная ось пересекает: в категории с номером (переключатель). Вводим номер строки, где в колонке A указано значение "0" (в моём примере "21").
    2. Положение оси выставляем "по делениям" (переключатель). Нажимаем OK.


    Чтобы изменить цену деления кратное Пи/4, теперь достаточно изменить формулу в колонке B.
    Вставить формулу в ячейку B1 и протянуть до конца:

    =ЕСЛИ($A1=0;0;ЕСЛИ(ОСТАТ($A1;0,5)=0;ЕСЛИ(НОД(ABS($A1*2);4)=1;ЕСЛИ(ABS($A1)>1;$A1*2;ЕСЛИ(ЗНАК($A1)=-1;"-";""))&"π/2";ЕСЛИ(ABS($A1)>1;$A1;ЕСЛИ(ЗНАК($A1)=-1;"-";""))&"π");ЕСЛИ(ОСТАТ($A1;0,25)=0;ЕСЛИ(НОД(ABS($A1*4);8)=1;ЕСЛИ(ABS($A1)>=0,75;$A1*4;ЕСЛИ(ЗНАК($A1)=-1;"-";""))&"π/4");"")))

    Остаётся задать идентичный по осям единичный отрезок, но вы с этим справитесь :)
    Ответ написан
    Комментировать
  • Как создать универсальный шаблон письма в Word'е?

    honor8
    @honor8
    Принципы быстродействия VBA в описании
    1. Можно промаркировать жёлтый текст и сделать замену прямо в Word (в примере 1 замена во всём тексте), или использовать закладки (Вставка (меню) -> Ссылки (группа) -> Закладки), или использовать инструмент Слияние и брать данные из файла Excel (без VBA). При слиянии связи могут глючить + конечный документ необходимо Объединить (как текущую запись), чтобы при работе с документом поля не обновлялись (Слияние использовать не советую). К тому же поля не поддерживают неразрывные символы Word'а Chr(160) и Chr(30).
      Примечание к документам слияния

      В таблице Excel есть поле Дата_1 (тип Дата) и поле Дата_2 (тип Дата). Если значение Дата_1 равно 43003 и значение Дата_2 равно 44764, то в формула ниже посчитается с ошибкой (будет значение ИСТИНА):
      { IF { MERGEFIELD Дата_1 \@"DD.MM.YYYY' г.'"  \* MERGEFORMAT } = { MERGEFIELD Дата_2 \@"DD.MM.YYYY' г.'"  \* MERGEFORMAT } "ИСТИНА" "ЛОЖЬ" }

      Option Explicit
      '123456789012345678901234567890123456h8nor@ya567890123456789012345678toster56789
      
      Sub Replacement_tags()
        Dim Content_Find As Find ' Объект Find
        
        Set Content_Find = ActiveDocument.Content.Find
        With Content_Find ' Найти маркер
          .ClearFormatting: .Replacement.ClearFormatting ' Очистить формат
          .MatchWildcards = False ' ВАЖНО! Отключить Подстановочные знаки
          
          .Text = "[Шапка]": .Replacement.Text = "Начальнику управления..."
          .Execute Forward:=True, Replace:=wdReplaceAll ' Заменить все маркеры [Шапка]
          
          ' Хитрость: перемещение курсора в конец заменённого текста
          .Execute FindText:=.Replacement.Text, _
            Forward:=True, Wrap:=wdFindStop, Replace:=wdReplaceNone
          .Parent.Select ' Выделяем текст для управления курсором
          'Selection.Collapse Direction:=wdCollapseEnd ' Курсор в конец найденного
        End With
      End Sub
    2. Можно сразу заменить на дублированный текст:
      .Replacement.Text = "Начальнику управления..." & String(3, Chr(13)) & "Начальнику управления..."
      или вводить количество дублей в переменную Text перед заменой:
      ' Chr(13) - код символа возврата каретки. В других языках более привычная запись "\r"
      
        CapText = "Начальнику управления..."
        CapСount = InputBox("Введите количество 'Шапок'", , 1)
        If Not CInt(Val(CapСount)) = CapСount Then _
          MsgBox "Введите целое число", vbCritical: Exit Sub _
        Else Text = CapText
        
        While CapСount > 1
          Text = Text & String(3, Chr(13)) & CapText
          CapСount = CapСount - 1
        Wend
    3. Таблицу можно также подтягивать через Слияние (точнее там создаётся объект OLE, которой глючит больше чем обычные поля - в основном это удержание файла Excel, откуда берутся данные). Удобнее программно создавать таблицу:
      ' Используем хитрость из п.1, если планируем создать таблицу в месте маркера
        
        Set tblNew = ActiveDocument.Tables.Add(Selection.Range, 3, 2)
        With tblNew
          .Columns(1).PreferredWidth = CentimetersToPoints(4) ' Колонка 1, Ширина 4 см
          .Borders(wdBorderTop).LineStyle = wdLineStyleNone ' Границы таблицы, например
          .Borders(wdBorderHorizontal).LineStyle = wdLineStyleSingle
          .Borders(wdBorderVertical).LineStyle = wdLineStyleDot
          For i = 1 To 2
            .Cell(1, i).Range.Text = "Строка 1; #" & i
          Next i
          .Cell(1, 1).Range.InsertAfter Chr(13) & "Строка 2" ' Добавить текст
          .Cell(tblNew.Rows.count, tblNew.Columns.count).Range.InsertAfter "Последняя ячейка"
        End With
    4. Чтобы основной текст нельзя было отредактировать, проще всего создать шаблон Word с поддержкой макросов, основную процедуру (автозапуск) разместить в модуле ThisDocument:
      Private Sub Document_Open()
        Replacement_tags ' Процедура из п.1
      End Sub
      Данные для заполнения шаблона можно поместить в отдельный файл.

    +
    Как использовать отладчик:
    1. Открыть MS Word, в тексте написать маркер [Шапка]
    2. Открыть VBA в приложении (Alt+F11)
    3. Выбирать в меню Insert -> Module
    4. Вставить процедуру (из п.1)
    5. Нажать F5 (запустится процедура, в которой установлен курсор)
    Ответ написан
    Комментировать
  • Быстрый поиск и замена в Word?

    honor8
    @honor8
    Принципы быстродействия VBA в описании
    Вероятно, проблема в использовании объекта Selection. Код для VBA:
    Option Explicit
    '123456789012345678901234567890123456h8nor@ya567890123456789012345678toster56789
    
    Sub Replacement_tags()
      Dim Content_Find As Find ' Объект Find (в VBScript переменные объявляются без указания типа)
      Const wdFindContinue = 2 ' для VBScript
      Const wdReplaceAll = 1 ' для VBScript
      
      ' Set objWrd = CreateObject("Word.Application") ' В MS Word объявлять не нужно
      ' в VBScript всё равно придётся открывать файл, так что objDoc = objWrd.ActiveDocument
      ' Set objDoc = objWrd.Documents.Open(Filename:="C:\FullName.doc")
      Set Content_Find = ActiveDocument.Content.Find ' в VBScript - objDoc.Content.Find
      
      With Content_Find ' Найти метку
        .ClearFormatting: .Replacement.ClearFormatting ' Очистить формат
        .MatchWildcards = False ' ВАЖНО! Отключить Подстановочные знаки
        .Replacement.Font.Color = wdColorAutomatic ' wdColorAutomatic = -587137025
        
        .Text = "p***p": .Replacement.Text = "newText"
        .Execute2007 Forward:=True, Replace:=wdReplaceAll, Wrap:=wdFindContinue
      End With
    
      ' Подсветить ".Text" в документе Word 2007+ (визуальная отладка)
      With Content_Find ' Отменяется после метода "Execute" или "ClearHitHighlight"
        .Parent.HomeKey wdStory ' wdStory = 6
        .HitHighlight .Text, wdColorTan ' wdColorTan = &H99CCFF
      End With
    End Sub

    Думаю, что метод .Selection.EndKey не нужен, т.к. в вашем примере указана замена по всему тексту (.Replace = 1), а поиск начинается с позиции курсора, т.е. сначала. Цикла поиска по тексту нет, так что .Wrap можно не использовать.

    Вариант проще
    : можно перед заменой отключить обновление экрана приложения objWrd.ScreenUpdating = False.
    Ответ написан
    Комментировать
  • Какими физическими свойствами должны обладать материалы?

    honor8
    @honor8
    Принципы быстродействия VBA в описании
    Посмотрите ГОСТ 8.417-2002
    Настоящий стандарт устанавливает единицы физических величин (далее - единицы), применяемые в стране: наименования, обозначения, определения и правила применения этих единиц.

    5. Единицы Международной системы единиц (СИ)
    6. Единицы, не входящие в СИ
    7. Правила образования наименований и обозначений десятичных кратных и дольных единиц СИ
    8. Правила написания обозначений единиц
    Ответ написан
  • HTML5 Presentation System - какую выбрать?

    honor8
    @honor8
    Принципы быстродействия VBA в описании
    Как будет называться презентация, если картинки должны меняться синхронно с аудио-дорожкой?
    Что-нибудь вроде usefulscript.ru/forum/showthread.php?tid=245
    Ответ написан
  • Как изменить разделители для CSV в Excel?

    honor8
    @honor8
    Принципы быстродействия VBA в описании
    • Изменяется региональными настройками системы: Дополнительные параметры (кнопка) -> Числа (вкладка) -> Разделитель элементов списка. Блинк
    • Написать макрос для сохранения данных с разделителем запятой:
      Sub SaveAComma()
        ActiveWorkbook.SaveAs Filename:="C:\Users\User\Desktop\ActiveSheet.csv", _
          FileFormat:=xlCSV, CreateBackup:=False, Local:=False
      End Sub
    • Чтобы открыть файл c разделителем "запятая" - в первой строке CSV-файла написать sep=,
    Ответ написан
    4 комментария
  • Excel VBA выделяющая ячейку со значением?

    honor8
    @honor8
    Принципы быстродействия VBA в описании
    Вы усложняете задачу. Для этого нужен не VBA, а условное форматирование. Видео смотреть с 2:02. Особенности:
    • В примере указана ссылка на ячейку с текущей датой. Если необходимо привязаться к дате на ПК, то формула в 2:44 будет: =$E5<СЕГОДНЯ()
    • В Excel даты представляются в виде чисел. Поэтому для выделения цветом разницы в 30 дней (и старше) задаём формулу для условного форматирования: =$E5<СЕГОДНЯ()-29
    Ответ написан
    Комментировать