Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Excel VBA (часть 3)

Автор: aidomars
Дата сообщения: 29.10.2012 14:14
Перебор всех файлов с занесением в массив, поиск в нем фамилии (при условии, что фамилии уже известны, т.е. есть их список).
А вообще желательно приложить архив со структурой папок/файлов.
Автор: sas1984
Дата сообщения: 29.10.2012 15:39
картинка двух вордовских документов


Проблема в том что в документе есть фамилия сдавшего и принявшего дежурство. Поэтому поиск из массива данных мне кажется не подходит.
Фамилии все известны.

Картинка экселевского файла


Может быть есть способ определить что в вордовском файле есть таблица и ее в буфер и чистовик. Интересно в VB есть возможность обнаружить такой объект как таблицу.
Автор: Zloy_Gelud
Дата сообщения: 29.10.2012 18:40
Есть XLS-файл - отчет сделанный обработкой в 1C 7.7. Открываю его в Office 2003, выполняю макрос, изменяющий цвет ячеек (Interior Color). Так вот, макрос должен устанавливать цвет равный ColorIndex 55. Вот он:

А на самом деле получается такое:

Выполняю затем макрос для проверки цвета ячейки - говорит, что цвет 55. Ну видно же, что это другой цвет. Как победить?
Автор: AndVGri
Дата сообщения: 30.10.2012 04:32
Zloy_Gelud
Не совсем понял, что устанавливается?

Код:
Interior Color = 55
Автор: sas1984
Дата сообщения: 30.10.2012 06:31

Цитата:
Не пробовали в редакторе VBA Word в Immediate выполнить?
?ThisDocument.Tables.Count


Нет не пробывал. Потому что не знаю как. Может кто-нибудь подскажет?

вот файл
Список.doc
Автор: AndVGri
Дата сообщения: 30.10.2012 08:36
sas1984
Вы уверены, что здесь именно та ветка? Есть отдельная ветка Word VBA. Подглядывать в объектную модель Word вам всё равно придётся.

Код:
Public Sub TestDoc()
On Error GoTo errHandle
Dim pWord As Object, pDoc As Object
Dim pTable As Object
Set pWord = CreateObject("Word.Application")
Set pDoc = pWord.Documents.Open("d:\path\docname.doc")
If pDoc.Tables.Count > 0 Then
Set pTable = pDoc.Tables(1)
MsgBox pTable.Cell(pTable.Rows.Count, pTable.Columns.Count)
End If
pDoc.Close
pWord.Quit
Set pWord = Nothing
Exit Sub
errHandle:
If Not pWord Is Nothing Then pWord.Quit: Set pWord = Nothing
End Sub
Автор: Zloy_Gelud
Дата сообщения: 30.10.2012 11:50
AndVGri -- выполняется код

Код: Cells(i, 1).Interior.ColorIndex = 55
Автор: AndVGri
Дата сообщения: 31.10.2012 04:28
Zloy_Gelud
Возможно в этой книге задавались цвета ячеек через Interior.Color. Так как число цветов в Excel до 2007 было ограничено, то происходила замена цветов, связанных с индексами. По крайней мере, как-то нужно было раскрасить ячейки в типовую палитру CorelDraw, после заметил, что цвета в выпадающем меню заливки цвета перекосило. Видимо, Excel запоминал для книги, подобно форматам ячеек, цвета. Может попробовать скопировать листы в новую книгу и наблюдаемый эффект пропадёт? Проверить не могу, сейчас на работе 2010.
Автор: Zloy_Gelud
Дата сообщения: 31.10.2012 08:52

Цитата:
Может попробовать скопировать листы в новую книгу и наблюдаемый эффект пропадёт?

Это помогло. Спасибо.
Автор: komputeryuzer
Дата сообщения: 31.10.2012 10:06
v вба есть коментарии подобные /*.....*/ ?

надо соорудить нечто такое
дим аа as string
aa = "dd" _
+ ",fff" _ 'ffffffffffffffffffffffffff
+ ",hh" _
'+ ",mm" _ 'ddddddddddddddddd
'+ ",pp" _
+ ",ss"

то есть штоп каждый елеменет мог иметь свое примечание
и штоп его можно было отключать простым коментарием
возможно такое?
Автор: dos330
Дата сообщения: 31.10.2012 10:19
komputeryuzer
Нет такого.
Строки конкатенировать лчше через "&", а не "+"
Автор: andrewkard1980
Дата сообщения: 01.11.2012 11:50

Цитата:
Строки конкатенировать лчше через "&", а не "+"

Вы имеле виду соиденять, навирна
Автор: dos330
Дата сообщения: 02.11.2012 10:09
andrewkard1980
Цитата:
Цитата:
Строки конкатенировать лчше через "&", а не "+"

Вы имеле виду соиденять, навирна


Это какбэ шютка?
Я имел. Введу.

Вот "соединять" - пофиг как, а конкатенировать - через "&"
Автор: komputeryuzer
Дата сообщения: 12.11.2012 10:15
не могу ни в инете ни в хелпе найти как определить десятичные разяды чисел? везде так подробно объясняют инт().. так подробно по самое не могу... блин зла не хватает..
в 21 веке уже не моде что ли такие вещи.. раньше пользовался либо % либо мод()...
как определить два знака или три после запятой в вба ексел2010 (например 12,12 или 12,123)
Автор: vlth
Дата сообщения: 12.11.2012 20:42
komputeryuzer
Round(...)
Автор: jollyboy
Дата сообщения: 12.11.2012 20:45
komputeryuzer
Не понятно - в чем проблема?
Что значит:

Цитата:
как определить десятичные разяды чисел?
как определить два знака или три после запятой

Как я понял - вот, три (степень десятки) разряда после запятой:
? Int((1.23456 - Int(1.23456)) * 10^3)
Автор: AndVGri
Дата сообщения: 13.11.2012 01:09
komputeryuzer

Цитата:
раньше пользовался либо % либо мод().

Подскажите, где вы использовали это для чисел вида

Цитата:
апример 12,12 или 12,123

Для чисел с плавающей запятой двойной точности, используемых в Excel, не всё так просто в плане определения числа знаков после запятой, почитайте, для разнообразия
Подумайте, сколько знаков после запятой у числа 1/3?
Как вариант для подсчёта числа знаков после запятой могу предложить

Код:
Public Function DigitAfter(ByVal this As Double) As Long
Dim sText As String, posD As Long, posE As Long
sText = Replace(CStr(this), ",", ".")
posD = InStr(sText, "."): posE = InStr(sText, "E")
If posD = 0 Then
DigitAfter = 0
ElseIf posE = 0 Then
DigitAfter = Len(sText) - posD
Else
If Mid$(sText, posE + 1, 1) = "-" Then
DigitAfter = CLng(Mid$(sText, posE + 2)) + posE - posD - 1
Else
DigitAfter = 0
End If
End If
End Function
Автор: komputeryuzer
Дата сообщения: 13.11.2012 10:05
AndVGri
Цитата:
Подумайте, сколько знаков после запятой у числа 1/3?
спасибо
необходимо в пределах разумного.. для производства.. нарпимер как узнать сколько знаков после запятой 0 или 1 или 2 или 3 или 4 или больше
это денежные суммы которые указаны в поступающих документах.. и надо из обрабатывать по разному...
я пошол по другому пути... сварганил нечто такое
IIf(InStr(StrReverse(Str( селс( ров, сол) )), ".") > 3, ....
дешевоисердито
Автор: jollyboy
Дата сообщения: 13.11.2012 10:52
komputeryuzer
Цитата:
это денежные суммы которые указаны в поступающих документах.. и надо из обрабатывать по разному...

У бухов не может быть таких сумм (чисел). И для бухов есть соответствующий тип данных - currency. И есть принятые правила округления. В смысле - все это должно быть :)


Цитата:
я пошол по другому пути... сварганил нечто такое
IIf(InStr(StrReverse(Str( селс( ров, сол) )), ".") > 3, ....
дешевоисердито

Впечатляет. Сердито, но не дешево :)

Попробуй:
(Len(CStr(x - Int(x))) - 2) > 3 ' для локали с лидирующим нулем

И завязывай с этим олбанским: "селс( ров, сол) " - пиши по-людски.
Автор: komputeryuzer
Дата сообщения: 13.11.2012 11:19
jollyboy
Цитата:
1.23456 - Int(1.23456)
да остроумно.. я не подумал об этом.. вот почему выкинули отдельную функцию?!..

Автор: jollyboy
Дата сообщения: 13.11.2012 11:36
komputeryuzer
Цитата:
вот почему выкинули отдельную функцию?!..

Я, честно говоря, не поню, чтобы она была...
Автор: komputeryuzer
Дата сообщения: 13.11.2012 14:30
не в вба.. в других языках.. я думал что инт, лен и мод итд должны быть..
Автор: panda3
Дата сообщения: 15.11.2012 07:41
При представлении числа в формате IEEE 754 (которое использует Excel в общем случае для дробных чисел) количество цифр после запятой будет иметь конечное значение только для дробей, у которых знаменатель является степенью двойки, например 0,673828125 = 345/512. Для всех остальных чисел количество цифр после запятой по определению бесконечно. Поэтому определять количество цифр нужно не для числа, а для его строкового представления, полученного при предварительном округлении до нужного числа знаков. Скажем, число 0.1 при предварительном округлении до 5 знаков, даст строку "0.1", т.е. один знак после запятой, это же число при предварительном округлении до 18 знаков даст строку "0.100000000000000006" - будет уже 18 знаков после запятой.
Автор: me4me
Дата сообщения: 16.11.2012 02:23
panda3
Это, конечно, все хорошо. Только, вот, надо ли?
Если человек в ответ на
? 10 / 3
сознательно, здраво аргументировано говорит: "Мне мало", то тогда он, кончено, должен погрузиться в описанное тобой.

А когда это чисто обывательский интерес, надо сразу сказать ему - "Забудь, не думай!" Ну, постараться не обидеть при этом :)

Надо вообще взять за правило все буховские задачи для планктона принудительно решать в целочисленном контексте. Тогда всем будет щазтье :) Они не будут забивать мозг ни себе, ни другим.
Автор: komputeryuzer
Дата сообщения: 16.11.2012 08:24
как проверить открыт ли такой то ексел?
как проверить есть ли лист в таком то открытом екселе?
Автор: Maximus777
Дата сообщения: 16.11.2012 12:37
У кого-нибудь есть пример парсера HTML-кода на VBA?
Автор: andrewkard1980
Дата сообщения: 16.11.2012 13:21

Цитата:
как проверить открыт ли такой то ексел?

Dim wbk As Workbook


Set wbk = Workbooks("ХХХ.xls")
If Not IsEmpty(wbk) Then
'your code here
else
Msgbox ("Workbook is not open")
End if

Добавлено:

Цитата:
как проверить есть ли лист в таком то открытом екселе?


Наверное можно аналогично предыдущему сообщению.

Добавлено:

Цитата:
У кого-нибудь есть пример парсера HTML-кода на VBA?


Код:
Dim oHTTP as object, sURL$
sURL = "http://ya.ru"
Set oHTTP = CreateObject("MSXML2.XMLHTTP")
With oHTTP
.Open "GET", sURL, False
.Send
sHTML = .responseText
End With
Set oHTTP = Nothing
Автор: komputeryuzer
Дата сообщения: 16.11.2012 13:43
andrewkard1980спасибо.. они не тяжеловесные команды? думал есть какой нибудь лёгкий оператор типа ексист("ееее")...
дело в том что когда файл не открыт вба выдает ошибку и мы открываем файл и запускаем скрипт поновой.. может оставить так? овчинка выделки стоит?
Автор: Maximus777
Дата сообщения: 16.11.2012 15:10
andrewkard1980
благодарю. Дальше уже разберусь.
Автор: andrewkard1980
Дата сообщения: 17.11.2012 12:40

Цитата:
дело в том что когда файл не открыт вба выдает ошибку

поставьте обработчик ошибок либо просто перебором:

Код: For Each Workbook In Application.Workbooks
If Workbook.Name = "ХХХ" Then MsgBox ("Workbook is open")
Next

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127

Предыдущая тема: VS 2010


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.