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

» Excel VBA (часть 3)

Автор: Kalifaks
Дата сообщения: 06.03.2011 22:01
Если кому интересно, мне помогли таким элегантным решением:

Код:
Dim shF As String, shL As String
shF = Worksheets(2).Name
shL = Worksheets(Worksheets.Count).Name
Лист1.[a1].Formula = "=sum(" & shF & ":" & shL & "!A1)"
Автор: SAS888
Дата сообщения: 07.03.2011 08:46
urodliv
К сожалению, без примера файлов точный ответ дать невозможно.
Предлагаемый пример, извлечет из всех файлов, находящихся в указанной папке значения из ячейки "A5" листа "Лист1" и поместит их последовательно в столбец "A" активного листа.
Доработайте "под себя". Организуйте циклы по требуемым файлам и ячейкам. Также, укажите куда помещать полученные из закрытых файлов значения. Надеюсь, что данного пример будет достаточно. Возникнут трудности - обращайтесь.

Код: Sub Main()
Dim p As String, f As String, s As String, arg As String
Application.ScreenUpdating = False: [A:A].ClearContents
p = "C:\Temp\" 'Путь к папке с файлами
s = "Лист1" 'Имя листа
f = Dir(p & "*xls")
Do While f <> ""
arg = "'" & p & "[" & f & "]" & s & "'!" & [A5].Range("A1").Address(, , xlR1C1)
Cells(Rows.Count, 1).End(xlUp).Offset(1) = ExecuteExcel4Macro(arg): f = Dir
Loop
End Sub
Автор: surgutfred
Дата сообщения: 10.03.2011 11:10
Подскажите такой вопрос.
Выгрузка отчета из Грандсметы в EXCEL. Числа выгружаются в формате "Общий" да еще и с пробелами. Типа этого "232 737,00" . Соответственно дальше эти цифры в расчете не участвуют (из-за пробелов). Я конечно знаю как убрать пробелы replace вопрос не в этом.
Я сделал обработку, когда я могу привязаться к таблице и знаю где эти цифры. Так пользователь теперь хочет универсальную обработку. Что бы открыл файл нажал макрос и все цифры в нужном формате. Т.е. цифры в любом месте файла. Как отделить зерна от плевел? Цифры от текста? Если все ячейки в общем формате, а цифры с пробелами. Я если я напущу просто везде убирать пробелы - текст покоцается. Есть варианты? Или бесполезно?
[more=таблица примерно такая] [/more]


Так, вроде начало получаться с использованием isnumeric, пошел копать....
Автор: SAS888
Дата сообщения: 10.03.2011 12:36
surgutfred
Я, конечно, понимаю, что перебирая и анализируя каждую ячейку UsedRange, можно сделать все, что требуется. Но, это долгий и неблагодарный путь. Можно поступить так:
1. Запомнить весь UsedRange.
2. Убрать все пробелы.
3. Определить ячейки, которые после всего этого будут содержать числовые константы.
4. Восстановить "первоначальный" вид UsedRange.
5. Убрать все пробелы в определенном нами диапазоне.
6. Установить формат всех ячеек как "Общий".

По-моему, так будет существенно быстрее и рациональнее. Макрос не будет содержать ни единого цикла и будет выглядеть примерно так (для активного листа):

Код: Sub Main()
Dim x As Range, y As Range, a(): Application.ScreenUpdating = False
Set x = ActiveSheet.UsedRange: a = x.Value: x.Replace " ", ""
Set y = x.SpecialCells(xlCellTypeConstants, xlNumbers)
x.Value = a: y.Replace " ", "": x.NumberFormat = "General"
End Sub
Автор: surgutfred
Дата сообщения: 10.03.2011 13:06

Цитата:
По-моему, так будет существенно быстрее и рациональнее. Макрос не будет содержать ни единого цикла и будет выглядеть примерно так (для активного листа):

Код:
Sub Main()
Dim x As Range, y As Range, a(): Application.ScreenUpdating = False
Set x = ActiveSheet.UsedRange: a = x.Value: x.Replace " ", ""
Set y = x.SpecialCells(xlCellTypeConstants, xlNumbers)
x.Value = a: y.Replace " ", "": x.NumberFormat = "General"
End Sub

Что то у меня ничего не происходит после применения данного кода, как было все с пробелами так и осталось.
Вот к примеру файл с таблицей
В качестве отслеживания изменений пусть ячейка G40


Цитата:
6. Установить формат всех ячеек как "Общий".

Не надо устанавливать в конце общий, он изначально общий стоит.
Автор: asbo
Дата сообщения: 10.03.2011 14:07
surgutfred
Странно, что часть чисел с пробелами, часть нет...
А что Вы собираетесь делать с ячейками, где по две цифири? Типа E28:J28?
А с такими зверями, как E174? E81?
Тут надо решать вопрос на стадии экспорта из ГС в Excel, если таковое возможно. Т.е. убрать все красивости из форматирования чисел.

Добавлено:
Если бы не поставленные выше вопросы, то простым перебором ячеек по критерию наличия в них символов, отличных от цифирь и разделителей (запятая, точка, апостроф, пробел) отделить зерна от плевел, в зернах убрать пробелы и апострофы, заменив запятую (или что там может быть) на системный десятичный разделитель. А в примере ведь - то запятая, то точка....

Приговор: надо смотреть в сторону настройки экспорта из ГС.
Автор: TuvanMAN
Дата сообщения: 10.03.2011 16:50
Привет всем!!!

Помогите ребята доделать лабу!!! Мозги ваще кипят!!!
Есть исходный пример лабы и есть моя!!!
Осталось всего там половина, вот по части VBA никак не допер (извините за выражение)!
Хотя бы советы!

пример
доработка
Автор: KF121
Дата сообщения: 10.03.2011 17:30
TuvanMAN
Свормулируйте четко что именно не получается. какова задача.
Автор: TuvanMAN
Дата сообщения: 10.03.2011 17:46
KF121

задача сделать точно также как в примере!!!
не получается:
- как кнопочку запуск VBA приложения сделать, ну чтобы выходила юсерформа
- как на юсерформе сделать странички или вкладки! ну на пример все есть!!!
Автор: KF121
Дата сообщения: 10.03.2011 18:13
В обработчике кнопочки написать
Userform1.Show, ну или как у вас там форма называется. чтобы закрыть форму, делаем кнопочку на форме со следующим кодом
Unload Me
Автор: SAS888
Дата сообщения: 11.03.2011 04:42
surgutfred
Предложенный мной макрос, по Вашей просьбе, убирает пробелы во всех ячейках, в которых отсутствуют буквы и возвращает в эти ячейки полученные числовые значения.
На самом же деле, как выяснилось из Вашего примера, задача не в этом.
Сформулируйте точные требования:
1. Что делать с ячейками, содержащими по 2 числа?
2. Что принимать за разделитель целой и дробной части?
3. Что делать с ячейками, которые содержат значения типа
"___________________________345495,786" ?
Автор: surgutfred
Дата сообщения: 11.03.2011 05:33

Цитата:
Приговор: надо смотреть в сторону настройки экспорта из ГС.

Я бы с удовольствием, но там надо просто рисовать свой шаблон выгрузки, разбираться с их формулами и т.д. И этим мне конечно придется заняться, но тут организационные моменты(для работы с ГС нужон ключ, а он денежку хорошую стоить, и асушнику "жирно" отдельный ключ покупать)


Цитата:
Сформулируйте точные требования:

Если бы мне юзер сформулировал что хочет
А так сказал "Хочу нажать кнопку и ляпота! "
Вообще я скажем так хотел просто некий принцип обработки получить, а эти "нюансы" уж потом напильником бы доработал....

Перебором нарисовал(опять же пока без нюансов), хорошо что файлы не большие, но конечно понимаю, что это не есть гуд. Лаконичный вариант от SAS888 меня конечно больше прельщает, осталось его разжевать для себя, и "натянуть" на свои примеры.

Буду ковырять...

Автор: SAS888
Дата сообщения: 11.03.2011 06:23
surgutfred

Цитата:
...осталось его разжевать для себя...

Т.е. Вы все-таки знаете, что Вам нужно, но не хотите говорить?
А мой вариант Вам не подойдет. Во-первых, у Вас в ячейках с цифрами, в отличие от ячеек с текстом не обычный пробел, а неразрывный. Поэтому весь мой макрос можно заменить одной строкой:
Код: ActiveSheet.UsedRange.Replace Chr(160), ""
Автор: asbo
Дата сообщения: 11.03.2011 06:56
SAS888
Было бы вполне комильфо и сенкс за постановочку сказать :)

Суть вопроса была не закодить Replace(это-то на то-то), а отделить зерна от плевел - т.е. формализовав интеллект правильно определить пару "это-то - то-то" и исполнить Replace в нужном месте и не исполнять в ненужном.

Гарантии, что неразрывный пробел в качестве разделителя разрядов не изменится на апостроф или запятую нет. Поэтому надо выделить именно _разделитель_разрядов_, а не Chr(160)...

Добавлено:
surgutfred
"Оргмоменты" - это понятно... Могу ошибаться, давно дело было, но этот функционал был доступен и в через-колено-ломаной ГС :)

Бзв, не забывайте о нетленном Вергилии: Quidquid id est, timeo Danaos et dona ferentes!...
... и когда Вам в очередной раз подскажут сделать "Application.ScreenUpdating = False", не забудьте от себя, в конце кода добавить отбой тревоги.
Автор: surgutfred
Дата сообщения: 11.03.2011 11:03

Цитата:
через-колено-ломаной ГС
максимум 4й версии видел, а боевая 5.1 уже
Да и контора наша не приемлет ломаный софт, тут не жмотятся, вплоть до winrar все куплено.
Автор: asbo
Дата сообщения: 11.03.2011 11:53
[off]

Цитата:
... организационные моменты(для работы с ГС нужон ключ, а он денежку хорошую стоить, и асушнику "жирно" отдельный ключ покупать)...

Трудно было понять по другому :) Пусть уж тады разберутся - или "жирно", или "не жмотятся". Как в Иван Васильиче? "Так покупай!..."
[/off]
Автор: andrewkard1980
Дата сообщения: 12.03.2011 10:21
Добрый день!
Уважаемые программисты. Есть вопрос к Вам. Мне нужно реализовать поиск значений массива в тексте и если находит - то присвоение найденного значения переменной.

Например массив:
arr={"капуста", "морковь","свекла"}

потом с сайта я вытаскиваю объявления

z = Split(htmlcode, "tblAdvert")
For i1 = 1 To UBound(z)
z1 = z(i1)

и в z1 у меня проходят объявления, в них нужен поиск значений из массива arr и если есть, то присвоение найденного значения z2

Например:
i1=1
z1="Продается капуста, 100 руб./кг., тел..."
z2="капуста"
і1=2
z1="Продам морковь...."
z2="морковь"

Cпасибо за помощь.



Автор: asbo
Дата сообщения: 12.03.2011 11:47
В общем случае:

Код:
For i = 1 to m ' around all of adverts z1$()
For k = 1 to n ' around all of keywords arr$()
If InStr(1, arr(k), z1(i)) > 0 Then z2 = arr(k)
Next ' k
Next ' i
Автор: andrewkard1980
Дата сообщения: 12.03.2011 14:41
Спасибо за быстрый ответ.
Логично.



Автор: w01f14
Дата сообщения: 13.03.2011 12:21
Привет , Помогите сделать скрипт который проверит ячейку таблицы на пустоту и если она пустая записать в нее данные , вот что я "понаделал "



Код:
...
SUM=2

Do Until objExcel.Cells(SUM,1).Value = 0

SUM = SUM +1
MsgBox "Helo"
Loop

objExcel.Cells(SUM,1).Value = Date
objExcel.Cells(SUM,2).Value = Time
objExcel.Cells(SUM,3).Value = computer
objExcel.Cells(SUM,4).Value = "logon"

...


Автор: asbo
Дата сообщения: 13.03.2011 13:23
"...на пустоту и если она пустая ..." - ключевые слова
0 (Zero) и Empty - разные вещи
SUM - зарезервированное слово, так переменную лучше не именовать

Код:
'...
iSum = 2
Do
Select Case IsEmpty(objExcel.Cells(iSum, 1).Value)
Case True
MsgBox "Hello"
objExcel.Cells(iSum, 1).Value = Date
objExcel.Cells(iSum, 2).Value = Time
objExcel.Cells(iSum, 3).Value = computer
objExcel.Cells(iSum, 4).Value = "logon"
Exit Do
Case False
iSum = iSum + 1
End Select
Loop While iSum < 289097856
'...
Автор: w01f14
Дата сообщения: 13.03.2011 14:10
asbo
Спс огромное !!!
Кинь в личку номер мобилки денег в знак благодарности кину немножко =) !!
Автор: asbo
Дата сообщения: 13.03.2011 14:31
w01f14, :))

Полно, голубь, не греши,
Убери свои гроши.
Я ведь енто не для денех,
Я ведь енто для души...

Будет новая беда -
Прямиком спеши сюда
Чай, и мы в лесу не звери
Чай, поможем завсегда...



Добавлено:
Да, и "While iSum < 289097856" замени на что-нибудь разумное, соответствующее обстановке :)
Автор: andrewkard1980
Дата сообщения: 15.03.2011 16:54
Добрый день.
Коллеги, подскажите, не могу добить, нужно из строки вытянуть первый номер телефона. Строки разные.
Им'я: Вячеслав Телефон: 0979122381
раб. 587-72-43 ; (063)-266-68-00
Роман т.3837006 м.0935688864м.0964165605м.0994356448
Иван 0672992940
0677088425 Олег; 093-404-55-50 Оксана
Вера Николаевна т.221-14-39, 0958723695, 0673079412.
067 605 56 27 221 63 17
221 63 17 067 605 56 27


Как быть? Спасибо.
Автор: asbo
Дата сообщения: 15.03.2011 17:22
Хе-х... Первый! Да хоть какой-нибудь, получилось бы :( Системы-то нет.

Я бы в Ворд закинул и первым делом автоматом удалил бы явные разделители между цифрами "цифра-тире-цифра". Также автоматом удалил чтото "цифра-правая скобка - чтото - цифра". Затем заменил "точка-непробел" на "точка-пробел". Затем вручную с просмотром удалил бы пробел "цифра-пробел-цифра". Потом блоки, начинающиеся с нуля - вычленить три первые цифры и заключить в скобки (бэз пробела после скобки правой!). Ну еще можно пофантазировать. Когда все будет причесано по единому стандарту - удалил бы избыточные двойные пробелы. А дальше уже - дело техники.

Если исходник в Экселе - то использовать какой-нибудь суперуникальный разделитель полей, чтобы окончательно не запутать уже запутанное, и, наоборот, использовать этот разделитель с пользой.
Автор: andrewkard1980
Дата сообщения: 15.03.2011 17:37
Да я тоже так думал, но тут надо сделать максимально возможно, и все в vba excel. Понимаете, таких данных программа тащит из интернета уйму, и задача найти первый входящий телефон.
А система тут есть, просто очень жесткая. Replace ом я почищу, но у меня сложность найти в строке порядковый номер цифры. Дальше буду думать. Спасибо.
Автор: asbo
Дата сообщения: 15.03.2011 17:45
Если задача сводится к "найти в строке порядковый номер цифры", то уточняем - первой встретившейся цифры?
Если да, то:
Добавлено:

Код: Function gg(pStr$) As Integer
Dim sSym$
Dim i%
Dim tAsc As Byte
For i = 1 To Len(pStr)
tAsc = Asc(Mid(pStr, i, 1))
'If tAsc > 47 And tAsc < 58 Then Exit For
If tAsc >= Asc(0) And tAsc <= Asc(9) Then Exit For
Next
gg = i
End Function
Автор: andrewkard1980
Дата сообщения: 15.03.2011 19:51
Спасибо.
А нет встроенной функции - убить все текст, оставить цифры? Например Val убивает, если с самого начала идет цифра, а если текст - то убивает все.
Автор: asbo
Дата сообщения: 15.03.2011 20:54
andrewkard1980
Нет. Надо руками делать.
Автор: dneprcomp
Дата сообщения: 16.03.2011 00:11
andrewkard1980

Цитата:
А нет встроенной функции - убить все текст, оставить цифры?

Около 30 раз сделать Replace в цикле

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127

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


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