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

Страницы: 1
Обращение к Excel из Word
 
Всем доброго, не могу понять, почему не выходит получить доступ к функции Cells из Word, и узнать номер последней занятой строки, в первом столбце?
Код
Sub Test ()
Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True
objExcel.Workbooks.Add (1)
For i = 1 To 5
objExcel.Cells(i, 1).Select
objExcel.Cells(i, 1) = 12
objExcel.ActiveCell.Offset(i, 1).Select
Next i
rs = objExcel.Cells(Rows.Count, 1).End(xlUp).Row
objExcel.Quit
Set objExcel = Nothing
End Sub
Сложение элементов массива по условию
 
Всем доброго. Имеется массив с данными такого типа ДлинаКабеля-ЖильностьКабеля, пытаюсь найти и вывести в msgbox все суммы одинаковых по жильности кабелей. Какие условия нужно добавить для цикла, чтобы он работал, пока не будут найдены все одинаковые значения?

Мои потуги:
Код
Sub Summ()
Dim ДК, ДК0, Сумма As Long
Dim ЖК, ЖК0 As String

ReDim Arr(0 To 3) As String
Arr(0) = "500-1x2"
Arr(1) = "100-1x2"
Arr(2) = "200-7x2"
Arr(3) = "300-7x2"

For i = LBound(Arr) To UBound(Arr)
s = s + 1
If S = 1 Then
        ДК = Left(Arr(i), InStr(1, Arr(i), "-") - 1) 'получаем длину
        ЖК = Right(Arr(i), InStr(1, Arr(i), "-") - 1) 'получаем жильность
        Сумма = Сумма + ДК
Else
        ДК0 = Left(Arr(i), InStr(1, Arr(i), "-") - 1)
        ЖК0 = Right(Arr(i), InStr(1, Arr(i), "-") - 1)
            If ЖК0 = ЖК Then
            Сумма = Сумма + ДК0
            End If
End If
Next i
MsgBox "Сумма кабеля жильностью" & ЖК & " - " & Сумма
End Sub
Сохранить в PDF на vbs
 
Написал небольшой макрос сохранения файла в pdf формате
Код
Sub r()
Dim PathX, PDFname
On Error Resume Next
PathX = ActiveWorkbook.Path
SetXXX = CreateObject("Scripting.FileSystemObject")
PDFname = XXX.GetBaseName(ActiveWorkbook.Name)
ChDir PathX
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=PDFname, Quality:=xlQualityStandard, _
IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=True
End Sub

Затем решил прибегнуть к приему, который на форуме мне показывали ранее, перевести код на vbs и добавить скрипт в меню правой кнопки мыши, получилось так
Код
Dim XL
Set XL = GetObject(, "Excel.Application" )
XL.ActiveSheet.ExportAsFixedFormat 0, , 0, True, False,,,True

Данный скрипт отрабатывает, но только при открытом файле, т.е. я запускаю файл, который нужно пересохранить и потом перетаскиваю его на иконку скрипта и он срабатывает.

Как модифицировать код, чтобы скрипт воспринимал группу файлов, без открытия последних? и можно ли средствами vbs пересохранять в pdf - картинки?

пробовал так, но у данного объекта нет таких свойств
Код
With CreateObject("Scripting.FileSystemObject")
    For Each X In wscript.arguments
      .ExportAsFixedFormat 0, , 0, True, False,,,True
    Next
  End With
При выгрузке в Excel содержимое ячейки обрезается на 255-м символе
 
Всем доброго, есть ли у кого догадки, с чем связан такой баг: использую сметную программу ПК РИК, при выгрузке сметы в Excel, в него вшит огромный макрос, который формирует и создаёт всю начинку сметы, так вот текстовое наименование расценки помещается в одну ячейку и, на 255-м символе обрезается(см.файл). Примечательно, что в 2010 Excel подобный баг отсутствует, но использовать 2010 офис не имеем возможности. Обращение в техподдержку РИК ни к чему не привело, сначала врали, что первый раз об этом слышат, а потом выяснилось, что проблема старая, но как её лечить они не знают и вообще переходите на более новый офис. Я уверен, что решение есть, просто им лень, и,вероятно большее количество пользователей всё же на новых версиях офиса(живут без проблем).
Изменено: Дмитрий_DimAs - 13.09.2019 11:00:45
Удаление последнего символа (перевод строкаи) в многостроковом TextBox
 
Всем доброго! Как удалить символ перевода строки - Chr(13), в multiline Textbox, при условии, что данный символ один в строке(ситуация когда нечаянно сделали перевод строки и кроме этого символа в строке нет больше информации).
Изменено: Дмитрий_DimAs - 10.06.2019 00:00:39
Как получить значение поля Описание
 
Всем доброго! Пытаюсь получить значение поля Описание(см.скриншот). Объясню зачем, может кто знает другой путь. Имеется рабочая сеть на несколько сотен машин, все учетные записи имеют вид -  фамилия.имя, но на латинице! В поле Описание - также присутствует фамилия, уже на кириллице, вот она то мне и нужна - кириллическая форма фамилии юзера. Забавно, что все остальные поля легко добываются таким кодом:
Код
CreateObject("WScript.Network").UserName
CreateObject("WScript.Network").ComputerName
CreateObject("WScript.Network").UserDomain
Изменено: Дмитрий_DimAs - 27.04.2019 21:21:44
Подсчет количества строк в TextBox
 
Всем доброго! На форме есть TextBox, в него планируется вносить данные построчно, и по условию если количество строк больше 8, уменьшать размер шрифта на шаг в меньшую сторону. Нашёл код для VB, крутил его, но так и не осилил, выдаёт ошибку на переменной hwnd. Для начала попытался по нажатию кнопки вывести в Label1 кол-во строк и символов - получилось! А вот количество линий - не выходит посчитать. Причем количество строк считает корректно, только при переводе на новую строку посредством Ctrl+Enter(поэтому посчитать надо количество линий, а не строк)
Код
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Integer, ByVal lParam As Any) As Long
Const EM_GETLINECOUNT = 186
 
' Подсчет строк
Public Function Strok() As Long
Strok = UBound(Split(TextBox1.Text, vbNewLine)) + 1
End Function
 
' Подсчет символов
Public Function Simvols() As Long
Simvols = Len(TextBox1.Text)
End Function
 
Private Sub CommandButton1_Click()
Lin = SendMessage(TextBox1.hwnd, EM_GETLINECOUNT, 0&, 0&)
'Вывод происходит в Label:
Label1.Caption = "Кол-во строк:" & " " & Strok & " " & "Кол-во символов: " & Simvols & " " & "Кол-во линий: " & Lin
End Sub
Как объединить 27000 файлов для поиска по содержимому
 

Всем привет

Возникла несколько месяцев назад задача, периодически пытался решить её различными подходами, на данный момент ни одна из попыток не дала желаемого результат, решил-таки обратится к сообществу.
Итак по-порядку.

По работе(сметное дело) постоянно обращаюсь к старым сметам в поисках нужной расценки, хорошая новость - все сметы имеют формат .xls либо .xslx, плохая - файлов смет очень много ≈ 27000 шт(все в одной директории). Что я перепробовал: встроенный поиск в папке(Windows 8, Ctrl+F), встроенный поиск через Win+F, Total Commander, макросы поиска (макрос).
Все вышеописанные варианты итогом выдают список файлов(кроме макроса, но у него и скорость ниже всех), или работают некорректно, и это минус, так как таких запросов приходится делать очень много, а списки результатов исчисляются десятками.
В общем идеальный поиск по базе, я видел как встроенный поиск в книге Excel. поэтому попробовал объединить хотя бы 300 файлов в книгу, макросом конечно, всё шло хорошо, заняло не так много времени, сохранил-закрыл, а открыть уже не получилось, хотя компьютер не слабый. Смотрел в сторону формата .csv, но там теряется форматирование, а мне важно его сохранить так как есть свой нюанс, во многих файлах выпускаемых сметной программой тысячи скрытых строк(пытался удалять макросом, очень долгий процесс даже для одной сметы).

В общем у меня больше нет вариантов, как организовать быстрый поиск по 27000 файлов. Если у кого-нибудь есть идеи - подскажите.

Файл сметы для примера
Изменено: Дмитрий_DimAs - 02.02.2019 20:08:28 (Добавил ссылку на файл)
Закрыть с сохранением все копии приложения Excel
 
Всем доброго! Имеется программа(Гранд Смета), которая выгружает файлы в формате xls, запуская для каждого документа свою копию приложения. Как можно реализовать закрытие с сохранением, всех копий приложения в единожды выбранный каталог/папку, без подтверждения каждый раз на отдельном файле?

Пробовал такой найденный на просторах вариант, убивает всё напрочь без сохранения:
Код
Dim objWMIService, objProcess, colProcess
Dim strComputer, strProcessKill, strFilePath
strComputer = "."
strProcessKill = "'excel.exe'"
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" _
& strComputer & "\root\cimv2")
Set colProcess = objWMIService.ExecQuery _
("Select * from Win32_Process Where Name = " & strProcessKill)
For Each objProcess In colProcess
     objProcess.Terminate
Next
Wscript.Quit

Такой вариант сохраняет и закрывает только тот экземпляр из которого вызывается:
Код
Sub SaveAndClose()
With Application
     .EnableEvents = False
     .DisplayAlerts = False
     Dim iBook As Workbook '
     For Each iBook In .Workbooks
         iBook.Save
     Next
     .Quit  
End With
End Sub
Сбрасываются параметры страницы в формате .xls (MS Excel 2007)
 
Работаю в сметной программе РИК, у неё есть шаблон вывода в формат .xls, в котором задаются параметры страницы. Не всегда данное решение гибко, и до нужного вида файл доводится руками, средствами MS Excel. Проблема в том, что параметры страницы не сохраняются после изменения в excel, и после повторного открытия всё сбрасывается на параметры заданные в РИК. Нашёл один выход, после задания нужных параметров, пересохраняю файл в формат .xlsx, но это ещё один лишний шаг в длинной цепочке, хотелось бы его исключить. Файл прилагаю.
Изменено: abricos29 - 02.02.2018 05:55:55
Перевод в латиницу значения переменной
 
Всем доброго! Имеется код, переименовывающий имя файла в латиницу, части кода надерганы по форумам. Вопрос №1: Как реализовать перевод множества файлов(не про мультиселект в GetOpenFilename, а именно сам перевод)? Вопрос №2: как уйти от использования ячейки листа, и переводить непосредственно в переменной Filename(выбивает с ошибкой "несоответствие типов")?
Код
Sub Переименовать()

Dim FTR As Variant
Dim Filename As Variant

FTR = Application.GetOpenFilename()
Set FSO = CreateObject("Scripting.FileSystemObject")
Ext = "." & FSO.GetExtensionName(FTR) ' расширение файла
Filename = FSO.GetBaseName(FTR) ' имя файла без расширения
FilePath = FSO.GetParentFolderName(FTR) & "\" ' путь к папке в которой находится файл

Range("A1") = Filename
Range("A1").Activate

        Dim Txt As Variant
        Dim i As Integer
        Dim J As Integer
        Dim c As String
        Dim flag As Integer
        Dim outchr As String
        Dim outstr As String

         Dim Rus As Variant
         Rus = Array("а", "б", "в", "г", "д", "е", "ё", "ж", "з", "и", "й", "к", _
         "л", "м", "н", "о", "п", "р", "с", "т", "у", "ф", "х", "ц", "ч", "ш", _
         "щ", "ъ", "ы", "ь", "э", "ю", "я", "А", "Б", "В", "Г", "Д", "Е", _
         "Ё", "Ж", "З", "И", "Й", "К", "Л", "М", "Н", "О", "П", "Р", _
         "С", "Т", "У", "Ф", "Х", "Ц", "Ч", "Ш", "Щ", "Ъ", "Ы", "Ь", "Э", "Ю", "Я")

         Dim Eng As Variant
         Eng = Array("a", "b", "v", "g", "d", "e", "jo", "zh", "z", "i", "j", _
         "k", "l", "m", "n", "o", "p", "r", "s", "t", "u", "f", "kh", "ts", "ch", _
         "sh", "sch", "''", "y", "'", "e", "yu", "ya", "A", "B", "V", "G", "D", _
         "E", "JO", "ZH", "Z", "I", "J", "K", "L", "M", "N", "O", "P", "R", _
         "S", "T", "U", "F", "KH", "TS", "CH", "SH", "SCH", "''", "Y", "'", "E", "YU", "YA")

         For Each Txt In ActiveCell
         outstr = Empty
         For i = 1 To Len(Txt)
         с = Mid(Txt, i, 1)

         flag = 0
         For J = 0 To 65
         If Rus(J) = с Then
         outchr = Eng(J)
         flag = 1
         Exit For
         End If
         Next J
         If flag Then outstr = outstr & outchr Else outstr = outstr & с
         Next i
         Txt.Value = outstr
         Next Txt

Filename = Range("A1")
X = FilePath & Filename & Ext
If Dir(FTR, 16) = "" Then MsgBox "Нет такого файла", vbCritical, "Ошибка": Exit Sub
Name FTR As X 'переименовываем файл
MsgBox "Файл переименован", vbInformation


End Sub
Разбиение полного пути на составляющие
 
Всем доброго. Столкнулся с такой задачей, полный путь файла нужно раздробить на три составляющих: Путь к файлу, Имя файла, Расширение файла. С первыми двумя составляющими справился, уперся в Расширение. В коде ниже, функция InStrRev хоть и считает справа налево(в отличие от InStr), порядковый номер символа в строке всё равно выдает Слева направо, и как следствие далее происходит неверная обрезка расширения от всего остального. Подскажите как быть?
Код
Sub Ext()

    Dim S As String
    Dim Ext As String
    Dim temp As Variant

    S = "."
    temp = InStrRev("D:\А.БВ.pdf", S, -1, vbTextCompare)
    Ext = Right("D:\А.БВ.pdf", temp)
    
End Sub
Форма поиска по группе файлов
 
Всем доброго, какое то время назад возникла необходимость сделать поиск по группе файлов, с последующим формированием списка гиперссылок на файлы, содержащие предмет поиска. С миру по нитке собрал код, работает, но медленно! База, в которой ищу, насчитывает порядка 9000 файлов, разбил Базу на 2 части, время поиска сократилось, но оно по-прежнему большое. Подскажите, есть ли способы сократить время поиска?
Код
Option Explicit
Dim objFSO As Object, objFolder As Object, objFile As Object
Sub ПОИСК()
Dim folder_ As String
With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show = False Then Exit Sub
        folder_ = .SelectedItems(1)
    End With
    folder_ = folder_ & IIf(Right(folder_, 1) = Application.PathSeparator, "", Application.PathSeparator)
    Application.ScreenUpdating = False
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    GetSubFolders folder_
    Set objFolder = Nothing
    Set objFSO = Nothing
    Application.ScreenUpdating = True
End Sub
Sub GetSubFolders(sPath)
 On Error Resume Next ' пропустить все ошибки
    Dim folder_$, file_$, s$
    Dim rw$
    Dim sh
    Dim c
     rw = 5
     Range("A5").Activate
    ActiveCell.EntireRow.Insert
    With Workbooks("Поиск.xlsm").Sheets(1)
        s = .Cells(2, 3).Value
    End With
    If s = "" Then
        MsgBox "Не заполненно поле поиска!"
        Exit Sub
    End If
    folder_ = sPath
    Dim sPathSeparator As String, sObjName As String
    Set objFolder = objFSO.GetFolder(sPath)
    For Each objFile In objFolder.Files
        If Replace(objFile.Name, objFSO.GetBaseName(objFile), "") Like ".xls*" Then
         file_ = Dir(folder_ & "*.xls*")
            DoEvents
            Workbooks.Open sPath & objFile.Name 'открываем книгу
                    With ActiveWorkbook
                        For Each sh In .Sheets
                            Set c = sh.Cells.Find(What:=s, After:=sh.Cells(1, 1), LookIn:=xlValues, LookAt:=xlPart)
                            If Not c Is Nothing Then
                                With Workbooks("Поиск.xlsm").Sheets(1)
                                    .Cells(rw, 1) = folder_ & ActiveWorkbook.Name
                                    .Hyperlinks.Add Anchor:=.Cells(rw, 1), Address:=folder_ & ActiveWorkbook.Name, SubAddress:=c.Address
                                End With
                                rw = rw + 1
                                Exit For
                            
                            End If
                        Next
                        .Close False
                    End With
                file_ = Dir
        End If
    Next
    For Each objFolder In objFolder.SubFolders
        GetSubFolders objFolder.Path & Application.PathSeparator
    Next
    
End Sub

Изменено: abricos29 - 23.12.2017 11:53:17
Поиск отдельной части значения
 
Всем доброго, помогите с такой задачей. Хотелось бы упросить муторный процесс небольшим макросом, но ума не хватает. Присваиваем файлам, названия по условиям заказчика, в исходном виде старое Имя файла может выглядеть по-разному, за исключением такой часть из трёх символов ".081", после этой незыблемой части идёт уникальный номер Объекта, вот его мне и нужно вычленить из старого имени файла, записать в переменную, и применить эту переменную в формировании Нового имени файла.
Для примера: старое имя файла 100.081.412-СС-ЛС-001
Новое имя файла должно выглядеть так: 40475-R-120.081.412-CC-LS-001
Обращение к ячейке таблицы в колонтитуле из Excel
 

Пишу макрос, который берёт данные из Excel-файлов и заполняет ими Содержание в Word. На определённом этапе уже решал проблему с обращением к ячейкам таблицы, получилось!

Код
objWrdDoc.Tables(1).Cell(i + 1, 3).Range.Text = Лист

objWrdApp.Activate
With objWrdDoc.Tables(1).Rows(2).Range
     .Font.Bold = 2
     .Font.Size = 12
     .ParagraphFormat.Alignment = 1
End With

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

Поиск одного значения в нескольких файлах
 
Всем привет, пытался реализовать поиск одного  значения сразу в нескольких файлах с выводом результатов на Лист в виде гиперссылок. Наткнулся в сети на такое решение, оно ищет и находит корректно, но при переходе по гиперссылкам почти на всё выдаёт ошибку "не удаётся открыть указанный файл"! В итоге я создал новый файл с именем "1.xlsx" и вписал в него всего одно слово для поиска - Тест, вот почему то по ссылке на этот файл пройти получается, но опять же с глюком, при переходе в файл искомое слово исчезает! Попытки понять чем другие файлы отличаются от вновьсозданного не увенчались успехом.
Обращение к свойствам Строк/Ячеек таблицы Word из Excel
 
Полный код не стал выкладывать, суть такая: есть шаблон в ворде, в шаблоне таблица у которой есть только шапка. Процедура открывает этот шаблон и эксель файл,  добавляет новую строку в таблице вордовского шаблона и из эксель, через цикл информация копируется в соответствующие ячейки добавленной строки. Проблема в том что вновь добавленные строки копируют формат из предыдущей, т.е. из шапки, а мне нужно по-другому, пытался это дело по-всякому решить, не получается, подскажите товарищи в чём загвоздка? Ошибку выдаёт на строке с .Font.Size = 10
Код
Sub Содержание()

   Dim objWrdApp As Object, objWrdDoc As Object
   Set objWrdApp = CreateObject("Word.Application")
   objWrdApp.Visible = True
   Set objWrdDoc = objWrdApp.Documents.Open("L:\Шаблон.docx")
   
   objWrdDoc.Tables(1).Rows(1).Select
   With objWrdDoc.Tables(1).Rows(1)
         .Font.Size = 10
         .Font.Bold = wdToggle
         .ParagraphFormat.Alignment = wdAlignParagraphLeft
    End With
                    
    objWrdDoc.Close True
    'закрываем приложение Word
    objWrdApp.Quit
    'очищаем переменные Word - обязательно!
    Set objWrdDoc = Nothing: Set objWrdApp = Nothing

End Sub
Изменено: abricos29 - 16.05.2017 09:20:59
Проверка функции на завершение через Exit Function
 
Как проверить cherry в Sub test() на предмет завершения функции через Exit Function и если она действительно завершена так, то завершить сам Sub test() через Exit Sub
Код
Sub test()
     cherry
     Range("a1").Select
End Sub

Function cherry()
    If MsgBox("Тест", vbYesNo) = vbYes Then
        Else
        Exit Function
    End If
End Function
Изменено: abricos29 - 06.05.2017 06:15:43
Подсчёт количества использований макросов надстройки
 
Cоздал по работе надстройку для Excel, в надстройку входят 12 модулей,  каждый из которых выполняет свою задачу и посажен на кнопку. Надстройку  я делал в программе RibbonXMLEditor. Лежит она сетевом диске и  используется 15-ю пользователями. Вопрос в том, можно ли реализовать  подсчёт количества использований всех макросов с выводом этой суммы на  панель Надстройки, или в какое другое меню. То есть в итоге необходимо просуммировать все использования всеми пользователями всех модулей и вывести это одним числом! Если можно такое реализовать, то куда копать?
Страницы: 1
Наверх