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

» Excel VBA (часть 3)

Автор: vlth
Дата сообщения: 29.01.2010 14:48

Цитата:
Осталось разобраться только, как удалить старые файлы с расширением .xls.


Код: 'проверяем, является ли интересующий нас каталог текущим и, если нет, делаем его таковым
'(здесь, возможно, в начале понадобится смена текущего диска - это делает оператор ChDrive: ChDrive "D", например)
If CurDir <> strPath Then ChDir strPath
'удаляем все файлы "*.xls" в текущем каталоге
Kill "*.xls"
Автор: GenyaMS
Дата сообщения: 30.01.2010 18:40
Никто не знает какой максимальной длины(число символов) можно записать строку в переменную объявленную как String?
и что делать если длины строки больше?
Автор: ZlydenGL
Дата сообщения: 30.01.2010 18:59
GenyaMS, я в какой-то момент писал 4096 символов - все "помещалось". А что за задача, где надо хранить бОльшее число текста? Если все же требуется - можно создать объект вида Word.Application и хранить там столько текста, сколько сам Word вытянет
Автор: vlth
Дата сообщения: 30.01.2010 20:36
GenyaMS

Цитата:
Никто не знает какой максимальной длины(число символов) можно записать строку в переменную объявленную как String?

Фиксированной длины - не более 65526 символов (по другому источнику - около 65400);
переменной длины - около 2х миллиардов.
Автор: GenyaMS
Дата сообщения: 30.01.2010 23:17
vlth

Цитата:
Фиксированной длины - не более 65526 символов (по другому источнику - около 65400);
переменной длины - около 2х миллиардов.

А при объявлении переменной чем они будут отчиться?

ZlydenGL

Цитата:
можно создать объект вида Word.Application

у меня как раз вариан - примерно 65600 символов надо в переменную сохранить (текст из файла) - для его обработки
Можно строчку правильного кода по созданию данного объекта - переменной?

Автор: vlth
Дата сообщения: 31.01.2010 10:54
GenyaMS

Цитата:
А при объявлении переменной чем они будут..?


Dim strFix as string * 5 - строковая переменная фиксир. длины из 5-и символов
Dim strVar as string - строковая переменная произвольной длины

Если присвоить фиксир. переменной strFix значение, скажем, содержащее два символа, VBA добавит в конец 3 пробела.

У Вас предполагаются строковые переменные, содержащие более 2х миллиардов символов ?

Здесь пример обработки большого текстового файла частями по 3000 строк (замерял - с разбивкой на части значительно быстрее, чем присваивать переменной сразу весь текст файла):
Excel VBA (часть 2)
Автор: bigrussel
Дата сообщения: 31.01.2010 17:50
Ребята!!! Прошу помогите написать макрос excel для следующей задачи:
Данные постоянно меняются в первой (A1) ячейке, необходимо сделать так что бы при достижении предельного значения (например 50) данные со второй ячейки (В10) записывались в другом столбце (F) каждый раз в новой ячейке как только нужное значение в первой (A1) ячейке будет достигнуто. Это надо для того что бы видеть сколько раз в течении дня достигался определенный параметр, и возможно было видеть историю дня.
После выхода из таблиц необходимо что бы данные в ячейках столбца (F) сохранения - очищались!! .

Прошу помогите плизззз!!! Я в макросах вообще ничего не понимаю.
Автор: ZlydenGL
Дата сообщения: 31.01.2010 18:01
bigrussel, а теперь давай то же самое, только более структурированным языком. Например: в начале рабочего дня в ячейку A1 записывается 0. В течение рабочего дня в эту же ячейку производится запись (чего? Приращения? Или произвольных чисел?), по достижении 50 (чего? Раз перезаписи? Или значения?) содержимое ячейки B10 записывается в последнюю свободную ячейку столбца F. В начале следующего рабочего дня столбец F очищается.

После этого можно будет набросать черновик макроса, или хотя бы ткнуть пальцем, куда надо "копать".
Автор: bigrussel
Дата сообщения: 31.01.2010 18:21
Ага!! Излагаю: В ячейку А1 в начале дня записывается значение 0. В течение этого дня производится запись произвольных чисел. По достижении значения 50 ( значения). Содержимое ячейки В10 записывается в столбец F первую ячейку, как только в течении часа или двух снова будет достигунто значение 50 в я чейкке А1 то запись снова ведется из ячейки В10 но уже во вторую ячейку столбца F,
и так далее ... Ну вроде бы пояснил, проявите любезность, напишите мне сие чудо!!!
Автор: ZlydenGL
Дата сообщения: 31.01.2010 18:36
Неоптимизированный вариант, дальше сам (в том числе отладку, писал по памяти):

Код: Private Sub Worksheet_Change(ByVal Target As Range)
Debug.Print Target.Address
If Target.Address = "$A$1" Then
If Target.Value = 50 Then
For I = Range("F:F").Cells.SpecialCells(xlCellTypeLastCell).Row To 1 Step -1
If Not Cells(I, 6) = "" Then
Cells(I + 1, 6) = Cells(10, 2)
Exit For
End If
Next I
End If
End If
End Sub
Автор: bigrussel
Дата сообщения: 31.01.2010 18:37
Забыл добавить что столбец F свободный!! А очищаеться от должен при выходе из таблиц. При входе должно начинаться все сначала.


Добавлено:
Чего то не пашет совсем!! И где в коде есть запись о ячейке В10... Помоги напиши правильно, очень надо

Добавлено:
ZlydenGL
Не понимаю где тут в коде должна быть вставлена ячейка В10
Автор: vlth
Дата сообщения: 01.02.2010 00:03
bigrussel

Код: Private Sub Worksheet_Change(ByVal Target As Range)
Dim lngClearCell As Long
If Target.Address = "$A$1" Then
If Target = 50 Then
If IsEmpty(Cells(1, 6)) Then
Cells(1, 6) = [b10]
Else
lngClearCell = Cells(65536, 6).End(xlUp).Row + 1
Cells(lngClearCell, 6) = [b10]
End If
End If
End If
End Sub
Автор: mrdime
Дата сообщения: 01.02.2010 10:18
vlth
По старому. С шаблонами в VBA замечен интересный глюк
При следующем шаблоне
Kill "*.xls" удаляются не только файлы с расширением .xls, но и .xlsx, хотя должны бы только .xls.
Автор: vlth
Дата сообщения: 01.02.2010 11:46
Тогда, наверное, имеет смысл подключить Microsoft Scripting Runtime...
С ней, правда, удалять файлы пакетом, по-моему, не получится, но зато появится больше возможностей для работы с ними.
Автор: bigrussel
Дата сообщения: 01.02.2010 14:00
vlth
Спасибо большое! Работет конечно но не совсем то что хотелось. Попробую пояснить подробнее-
я получаю данные в ячейку А1 по DDE и они постоянно меняются, так вот мне надо что бы при достижении определенных значений происходила запись из другой ячейки. Ребята мне тоже подкинули макрос который работает но необходимо выделять мышкой ячейку А1 что бы произошло действие.
Так вот, есть ли возможность сделать так что бы все работало автоматически не прикасаясь мышкой к ячейке????

Вот макрос который прислали, вроде тоже работает но не могу решить проблему описанную выше!!
С уважением, подскажите как сделать это...

Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Address = "$A$1" Then
If Target.Value = 50 Then
I = [B10]
Range("F65536").End(xlUp).Offset(1, 0) = I
End If
End If
End Sub

Автор: vlth
Дата сообщения: 01.02.2010 17:00
bigrussel
Странные вещи Вы сообщаете...

Код: Private Sub Worksheet_Change(ByVal Target As Range)
...
End Sub
Автор: AftarJjet
Дата сообщения: 02.02.2010 09:46
Имеется список А и список В. Необходимо удалить дубликаты строк из списка А, сравнив его со списком В.
Как?
Автор: ZlydenGL
Дата сообщения: 02.02.2010 09:49
AftarJjet, что за список? Одномерный массив или 4х мерная матрица? Задача написать это на VBA или просто решить задачу средствами MS Excel (ибо VBA тут в общем-то не нужен)?
Автор: AftarJjet
Дата сообщения: 02.02.2010 09:51
ZlydenGL
Не нужен? Ну тогда как решить попроще (например средствами Excel)? Ибо задача чисто прикладная.
Автор: ZlydenGL
Дата сообщения: 02.02.2010 09:54
AftarJjet, элементарно, Ватсон

Предположим, что наши "списки" представляют из себя обычные колонки. Около второй колонки добавляем формульную колонку с проверкой VLOOKUP'ом (ВПР в русском Ёкселе) на существование такой записи в первой колонке. Если есть - возвращаем пустую ячейку, если нет - возвращаем ячейку (можно через обработчик IsNA, можно через еще один столбец). После этого, при необходимости, убираем пустые ячейки pivot'ом (сводной таблицей). Все!
Автор: AftarJjet
Дата сообщения: 02.02.2010 10:02
ZlydenGL
Чего?
Мне бы что попроще, типа кнопочку там нажать. Сейчас выставил функцию ВПР, оно какое-то ИМЯ хочет. Что бы мне туда написать?
Автор: JekG
Дата сообщения: 02.02.2010 17:56
Пытаюсь довести до ума свой макрос по учету рабочего времени. Запнулся на такой штуке - по итогам подсчетов имеем лист результаты где информация представлена в таком виде

Иванов    ОТК 26.01.2010 11:33:37    26.01.2010 13:47:11     2 ч 13 мин 34 сек
Иванов    ОТК 26.01.2010 15:14:08    27.01.2010 0:51:37     -15 ч 37 мин 29 сек

где первое число - время входа, второе - время выхода, третье соответственно разница между ними, что дает отработанное время. Как видно если и вход и выход в один день все ок, но если вход в один день, а выход на следующий подсчет идет с минусом. Нужно написать процедурку которая в конце выполнения всех подсчетов проверит столбец 5 на наличие отрицательного результата, при отсутствии продолжит выполнять имеющийся макрос, при наличии - корректно пересчитает итог.
PS Все значения в столбцах в формате Общий
Автор: vlth
Дата сообщения: 02.02.2010 21:43
JekG
Попробую, наступив себе на горло, ответить Вам ещё раз:
1. Когда Вы первый раз опубликовали свою задачу, одно из условий требовало учитывать входы и выходы одного дня
Цитата:
Нужно создать макрос который позволит посчитать время, которое сотрудник отработал за деннь учитывая все входы и выходы и потом, просуммировав данные по дням, получить время отработанное за неделю.
...
При ложном проходе (вход без выхода или выход без входа) весь проход ануллируется.
Excel VBA (часть 2)

2. Вам был предложен рабочий вариант.
3. При небольшой корректировке этот вариант продолжает соответствовать изменённым условиям: из строк
Код: If .Cells(intI, 7) = "Вход" And .Cells(intI + 1, 7) = "Выход" _
And Day(.Cells(intI, 1)) = Day(.Cells(intI + 1, 1)) Then
Автор: V4mp
Дата сообщения: 03.02.2010 14:30
Помогите, уже мозг плавится..

Есть форма, запускается при событии Workbook_Open.
Причем пока висит эта форма excel не должен быть виден (Application.Visible = False)

НО! проблема в том, что при скрытии эксэля формочку то свернуть нельзя (нет в панели задач пункта, т.к. эксэль скрыт).
Собственно вопрос - как в описанной ситуации можно сворачивать и разворачивать формочку? Может возможно скрыть эксэль, но оставить его пункт в панели задач?
Автор: ZlydenGL
Дата сообщения: 03.02.2010 14:41
V4mp, сходу (без привлечения API) вижу только такой подход: окно Ёкселя не скрывать, а прятать за формой (т.е. убирать максимизацию окна если она есть, а размеры и положение окна подгонять под размер и положение формы). Правда в этом случае будет целая куча проблем:

1. Пользователю все-таки лучше не сбрасывать любимые настройки окна Ёкселя - т.е. перед изменением положения лучше запомнить и статус окна, и его координаты
2. Если пользователь в процессе работы с твоим приложением откроет другой файл Ёкселя - он его банально не увидит. Решается обработкой событий OnActivate/OnDeactivate.
Автор: V4mp
Дата сообщения: 03.02.2010 14:47
ZlydenGL
Хм..Вариант интересный, но не подойдет из-за описанных проблем....
Копаю в сторону апишных функций скрытия в трей, но опять же сворачивание в трей - это немного перебор по моему(

Хех, а если юзверь формочку передвинет? увидит бяку)
Автор: ZlydenGL
Дата сообщения: 03.02.2010 14:49
V4mp, дык для того и нужна прокладка между стулом и монитором/клавой, чтобы проблемы решать по мере их поступления Насчет API в VBA могу с уверенность сказать следующее: они работают, но кривят иногда по-страшному! Но если уж все-таки решился - копай в сторону FormStyle.
Автор: V4mp
Дата сообщения: 03.02.2010 15:21
Попробовал так.

Код: Private Sub Workbook_Open()
Application.WindowState = xlMinimized
Main.Show
End Sub
Автор: Oyger
Дата сообщения: 03.02.2010 15:37
V4mp

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

А что, при работе Формы(макроса) можно свернуть Excel???

Цитата:
Причем пока висит эта форма excel не должен быть виден

Не должен быть виден Excel? Или Excel виден, но не видна сама открытая книга?
Автор: V4mp
Дата сообщения: 03.02.2010 15:56
Oyger

Цитата:
А что, при работе Формы(макроса) можно свернуть Excel???

Можно, если форма не модальная.

Цитата:
Не должен быть виден Excel? Или Excel виден, но не видна сама открытая книга?

В идеале - не должен быть виден эксэль (но на панели задач чтобы кнопка была для сворачивания и разворачивания эксэля и вместе с ним формы)
Книгу то скрыть можно, но ее юзверь может легко обратно отобразить.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127

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


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