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

» Excel VBA (часть 2)

Автор: soulthiefer
Дата сообщения: 16.02.2009 14:38
так в том то и дело нужно чтоб это было внутри макроса т к это только часть макроса .....дальше будут другие операции с этими числами (
Автор: 5tas
Дата сообщения: 16.02.2009 18:44
Доброго времени суток,
скажите пожалуйста, возможно ли через VBA каким-то образом открыть pdf - документ, найти в нём нужную информацию и скопировать в excel? Если возможно, то как? Что можно почитать на эту тему?
Автор: dakaskus
Дата сообщения: 16.02.2009 22:04
Возвращаясь к своему вопросу, подскажите, пожалуйста, если выделен один массив, как дополнительно выделить еще одну строку к нему.
Например, если выделено D2:F3 [командой Range(Selection, Selection.End(xlDown)).Select]- нужно чтобы было выделено D2:F4, но не привязываясь к абс ссылкам, так как постоянно будет менятся исходный выделеный массив.

Спасибо
Автор: j0yb1tyr
Дата сообщения: 17.02.2009 05:39
Здравствуйте,

Помогите, пожалуйста, в написании макроса для выполнения операции проверки в Экселе.

Существует две таблицы (на разных страницах):
- Одна со столбцами 1, 2, 3, 4, 5. в столбце 1 - время регистрации (в виде 16/02/09 10:32 - текстовой формат), в столбце 2 фамилия, в столбце 3 значение отделения; в столбце 4 - зарегистрированное значение.
- Вторая из столбцов 1, 2, 3 и тд., где в столбце 1 (время в формате 10:32 - текстовой формат), а столбцах 2, 3 и т.д. стоят значение отделений. А в ячейках этой таблицы значения, которые привязаны определенному времени и отделению.

Надо проверить, чтобы значение в ячейке в столбце 4 первой таблицы соответствовало времени, когда это значение должно было быть зарегистрировано определенным отделением (из второй таблицы). Если оно не соответствует, то в столбце 5 первой таблицы делается пометка. Есть так же условие возможности не соответствия до n-минут. И чтобы проверка шла по всем строкам первой таблицы.

Буду очень благодарен за помощь. Спасибо
Автор: SAS888
Дата сообщения: 17.02.2009 06:11
dakaskus
Выдели произвольный диапазон и запусти макрос:

Код: Sub qq()
Dim x As Range
Set x = Selection
Set x = Range(Cells(x.Row, x.Column), Cells(x.Row + x.Rows.Count, x.Column + x.Columns.Count - 1))
x.Select 'Это для примера
End Sub
Автор: Mantisby
Дата сообщения: 17.02.2009 12:55
SAS888

Цитата:
Пожалуйста, с сортировочкой.


огромнейшее спасибо! очень полезный инструмент получился, сэкономит кучу времени и сил.
Автор: soulthiefer
Дата сообщения: 17.02.2009 13:16

Цитата:
но какая команда макросом делает то что я делаю руками нажимая на восклиц знак и преобразовать в число ?! столбики из таких данных и руками нереально! цифр меньше 15


подскажите пожалуйста (( немогу дальше макрос писать (
Автор: SERGE_BLIZNUK
Дата сообщения: 17.02.2009 14:40
soulthiefer, ответ на Ваш вопрос абсолютно неоднозначен. Excel может выдавать такой "вопросительный знак" в разных случаях. Например, апостроф в начале строки, или строка имеет формат "Текстовый" или ... (ещё варианты..)
Вы бы лучше выложили примерчик своего "неправильного файла"!

как вариант, попробуйте код (к примеру, для ячейки B3) :

Код: Range("B3").Value = CDbl(Range("B3").Value)
Автор: soulthiefer
Дата сообщения: 17.02.2009 15:03

Цитата:
Range("B3").Value = CDbl(Range("B3").Value)

спасибо делает то что нужно но если указать например Range("E2:F17") вылетает с ошибкой (( а у мну 3 столбца с такими записями (((

Добавлено:

Цитата:
Вы бы лучше выложили примерчик своего "неправильного файла"!

вот примерчик http://www.rapidshare.ru/930964
помогите пожалуйста очень нужно ((
Автор: Pravoved90
Дата сообщения: 17.02.2009 17:15
Добрый день. Помогите написать простой макрос. Есть общий столбик A1:А50. В него постоянно забиваются данные. Задача следующая: Необходимо, чтобы каждая ячейка, где ничего не записано была окрашена, к примеру, в красный цвет. Когда же в нее забиваются данные она становилась бесцветной. Это нужно для того, чтобы не пропустить какую-то ячейку при заполнении, т.к. их достаточно много. Спасибо.
Автор: SERGE_BLIZNUK
Дата сообщения: 17.02.2009 23:19
soulthiefer
ну, разумеется, нельзя куче ячеек присвоить числовое значение этой же кучи ячеек!
только в цикле по одной...
Кроме того, в примере "проблеммные" ячейки в диапазоне A1:C18

попробуйте такой код:

Код:
Sub ChangeRange()
Dim RR As Range
For Each RR In Range("A1:C18")
If (Not IsEmpty(RR.Value)) And (RR.Value <> "-") Then
RR.Value = CDbl(RR.Value)
End If
Next
End Sub
Автор: Pravoved90
Дата сообщения: 18.02.2009 02:30

Цитата:
а точно это надо решать через макросы?! Это просто классическая задача для условного форматирования!!!!! (меню "Формат" - "Условное форматирование..." далее задать формулу и цвет заливки... и всё!

Знал, что может возникнуть такой вопрос..Но надо через макрос:
1. В некоторых ячейках уже есть условное форматирование
2. Ячеек очень много - записать в каждую условный формат - неделя уйдет...

Знаю, что макрос должен быть простой..Просто с цветами не писал..Думаю, должно быть что-то вроде "если ячейка и диапазона = 0 закрасить ее в красный цвет, а если не равен - в белый"..

Добавлено:
Благодарю за ответ. Разобрался)
Автор: SAS888
Дата сообщения: 18.02.2009 05:07
soulthiefer
SERGE_BLIZNUK

Цитата:
нельзя куче ячеек присвоить числовое значение этой же кучи ячеек!

Можно. Например, так:

Код: Sub ConvNum()

With ActiveSheet.UsedRange
arr = .Value
'.NumberFormat = "General"
.Value = arr
End With

End Sub
Автор: SERGE_BLIZNUK
Дата сообщения: 18.02.2009 06:14

Цитата:
With ActiveSheet.UsedRange
arr = .Value

SAS888, великолепно!!! Снимаю шляпу, маэстро!
Автор: SAS888
Дата сообщения: 18.02.2009 07:34
Pravoved90

Цитата:
Думаю, должно быть что-то вроде "если ячейка и диапазона = 0 закрасить ее в красный цвет, а если не равен - в белый"

Можно чуть проще. Опять же без цикла. Вставьте в модуль нужного листа код:

Код: Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Column = 1 Then
Application.ScreenUpdating = False: Application.EnableEvents = False
[A1:A50].Interior.ColorIndex = xlNone
[A1:A50].Cells.SpecialCells(xlCellTypeBlanks).Interior.ColorIndex = 3
Application.ScreenUpdating = True: Application.EnableEvents = True
End If

End Sub
Автор: Mantisby
Дата сообщения: 18.02.2009 09:13
SAS888

Цитата:
огромнейшее спасибо! очень полезный инструмент получился, сэкономит кучу времени и сил.

ан, нет, что-то не получается. Когда в ячейках появляется большой объем данных, макрос начинает вываливаться Пример файла
Автор: dakaskus
Дата сообщения: 18.02.2009 09:15
SAS888

Цитата:
dakaskus
Выдели произвольный диапазон и запусти макрос:


Класс! То что нужно!
Спасибо большое тебе!
Автор: soulthiefer
Дата сообщения: 18.02.2009 10:14
SERGE_BLIZNUK

Цитата:
Код:
Sub ChangeRange()
Dim RR As Range
For Each RR In Range("A1:C18")
If (Not IsEmpty(RR.Value)) And (RR.Value <> "-") Then
RR.Value = CDbl(RR.Value)
End If
Next
End Sub


СПАСИБО огромное !!!! то что нужно

Автор: SAS888
Дата сообщения: 18.02.2009 11:26
Mantisby
Да уж. Вот это строки!!! Excel ограничивает объем элементов массива. Поэтому выход один - работать с ячейками листа (от чего я и пытался уйти), что несколько медленнее. Посмотрите Этот вариант.
Автор: Mantisby
Дата сообщения: 18.02.2009 12:37
SAS888
что поделаешь... потом они ещё несколькими скриптами обрабатываются, чтобы привести их в нормальный вид.

Вариант посмотрел, к сожалению,
- при границе количества записей > 3 вылазит ошибка уже в примере,
- на всем объеме данных ошибка вылазит на строке " Cells(i, j) = Application.CountIf(Columns("B"), Cells(i, "B"))". То есть сортировку он успевает выполнить, потом сваливается.
Автор: SAS888
Дата сообщения: 18.02.2009 12:49
Mantisby

Цитата:
- при границе количества записей > 3 вылазит ошибка

Я не стал вставлять проверку на наличие строк, удовлетворяющих введенному значению. Если "вылазит" ошибка, значит записей > 3 не существует. Попробуйте добавить записи и проверьте. Если нужно, давайте вставлю. Только скажите, что в этом случае делать?

Цитата:
- на всем объеме данных ошибка вылазит на строке " Cells(i, j) = Application.CountIf(Columns("B"), Cells(i, "B"))". То есть сортировку он успевает выполнить, потом сваливается.

А здесь я Вас не понимаю. Прикрепите пример с "проблемным" файлом.
Автор: Mantisby
Дата сообщения: 18.02.2009 13:19
SAS888
ага, по первому понятно, спасибо. проверка не нужна, это уже рюшечки

по второму - правильный файл
Автор: SAS888
Дата сообщения: 18.02.2009 13:34
Mantisby
Ссылка неправильная.
Автор: SAS888
Дата сообщения: 19.02.2009 05:40
Mantisby
Скачал Ваш файл. Вставил написанный ранее макрос. Все работает. В чем у Вс проблема?
Вот Ваш файл с макросом, в который я все-таки добавил проверку. Теперь, при вводе количества записей, допустим ввод от 2 и более, т.к. вводить 1 во-первых, бессмысленно, во-вторых, исключается ошибка выполнения процедуры. При вводе значения превышающего существующее максимальное количество, будет выведено соответствующее предупреждение и макрос корректно завершит свою работу. Поэкспериментируйте.
Автор: dakaskus
Дата сообщения: 19.02.2009 10:18
Предисловие:
Виста, ексель2007, макросом добавлено одно меню, с подменю-набором необходимых макросов, которое отображается на вкладке "Add-ins". После запуска какого-то макроса (гарячими клавишами) - активной остается вкладка "Add-ins".

Вопрос:
Какую команду дописать в конце каждого макроса, чтобы в конце работы активировалась вкладка "Home" например?

Спасибо большое за помощь!
Автор: Mantisby
Дата сообщения: 19.02.2009 10:26
SAS888
час мучал макрос, прежде чем нашел в чем дело. самое неприятное в том, что достаточно ошибке появиться один раз - и макрос перестает работать на любом количестве записей, даже на 2-3х

Похоже, что он может обработать только 255 строк. На 256 уже сваливается.

Чтобы не продолжать дальше проверять на обрезках файлов, я выгрузил все данные и выложил самый полный вариант файла - http://slil.ru/26786314
Автор: SAS888
Дата сообщения: 19.02.2009 11:25
Mantisby
На этот раз Вы изменили назначение столбцов. Вы уж определитесь, потому что макрос к ним привязан. Посмотрите Здесь.
Автор: Mantisby
Дата сообщения: 19.02.2009 12:47
SAS888
это при выгрузке был глюк проверяю я всегда на одном и том же - Название/Режиссер/год.

Теперь всё работает! Спасибо, и прошу прощения за некий сумбур, который получился

Автор: V4mp
Дата сообщения: 19.02.2009 16:12
Повторяю свой пост -
Уважаемые, появилась парочка вопросов.
Надеюсь, кто-нибудь знает.

1 - нужно при включенной защите книги (защита ТОЛЬКО на изменение структуры) скрывать и отображать листы Excel.
2 - как запретить обработку сочетания ctrl-break при выполнении макросов.
3 - может ли excel взаимодействовать с word'ом напрямую - т.е. брать данные с ячейки и забивать их автоматом в ворд и нооборот. Или без внешних файлов не обойтись? (т.е. например excel - файл.TXT - word)
4 - дурацкий вопрос, но все же... может как-нибудь можно организовать прокрутку в ЯЧЕЙКЕ. т.к. периодически в одну ячейку нужно ввести оч. много данных, которые даже на экран не всегда влезают. Может у кого какие идеи есть, как это организовать?
5 - и последний. На сколько хватит бедного эксэля при использовании vba? т.е. какой памятью он располагает и не ограничено ли использование глобальных переменных, функций и т.д. Может где-нибудь эту инфу можно почитать?

И еще один вопрос -
как из vba получать письма с почты? Возможно ли это напрямую из кода и как? Или лучше всего подключать какие-нибудь сторонние библиотеки? Тогда посоветуйте, какую выбрать.
С отправкой разобрался - оптимальный вариант - использовать CDO.MESSAGE А вот что делать с получением?
Автор: SERGE_BLIZNUK
Дата сообщения: 19.02.2009 18:52

Цитата:
2 - как запретить обработку сочетания ctrl-break при выполнении макросов.


Код: Application.EnableCancelKey = xlDisabled
'Здесь должен быть код Вашей программы.
Application.EnableCancelKey = xlInterrupt

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133

Предыдущая тема: Написание своего HyperTerminal для считывания данных


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