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

» Excel VBA (часть 2)

Автор: Oyger
Дата сообщения: 27.08.2007 16:41
Ребята. Вопрос может и ерундовый, но...
Есть много листов. Данные на всех листах однородные и представляют из себя массивы из 11 столбцов. В 10 столбцах числа. А в 1 столбце - дата. Например 01.07.2007, но формат ячейки МММ.ГГ (т.е. в ячейки видна дата "июл.07").
Каждый месяц происходит добавление строки путем копирования формата предыдущей строки. Вставляются данные. И что получается: Числа-то, само собой, нормально, а вот дата так и отображается "01.08.2007". При этом формат ячейки стоит как и надо - МММ.ГГ. Если зайти в ячейку руками (через F2) и нажать Enter, то формат станет нужным - "авг.07". Но мне влом после макроса идти на каждый лист и менять ячейки.
В чем может быть проблема? Как научить его ставить формат даты сразу МММ.ГГ?
Автор: SERGE_BLIZNUK
Дата сообщения: 28.08.2007 01:44
Oyger
а выложить тестовый файлик можно? (с данным макросом)
или хотя бы приведите здесь код макроса, который -
Цитата:
происходит добавление строки путем копирования формата предыдущей строки. Вставляются данные.

Автор: Oyger
Дата сообщения: 28.08.2007 08:33
SERGE_BLIZNUK
Вот такая вот вставка и заменя даты в первом столбце. Замену данных приводить не стал.
Stroka_Temp2 - номер строки - присвой любой.

Цитата:
происходит добавление строки путем копирования формата
- немного наврал, копированием диапазона строки.

Range("A" & Stroka_Temp2).Select 'Выделяем первую ячейку нужной строки
Range(Selection, Selection.End(xlToRight)).Select 'Выделяем все данные в этой строке - выделение направо.
Selection.Copy 'Копируем выделенный диапазон
Range("A" & Stroka_Temp2 + 1).Select 'Выделяем первую ячейку следующей строки - строка пустая.
ActiveSheet.Paste 'Вставляем
Application.CutCopyMode = False
Cells(Stroka_Temp2 + 1, 1).FormulaR1C1 = "01.12.2009" 'Заменяем дату. Для теста дата указана сразу. В макросе она формируется из нескольких переменных, но это значения не имеет.
Автор: SERGE_BLIZNUK
Дата сообщения: 28.08.2007 20:43
Oyger

Цитата:
Cells(Stroka_Temp2 + 1, 1).FormulaR1C1 = "01.12.2009" 'Заменяем дату.

а если попробовать так:
Cells(Stroka_Temp2 + 1, 1).FormulaLocal = "01.12.2009"
Автор: ol7ca
Дата сообщения: 28.08.2007 21:22

Цитата:
Привет, авторитеты! Я в VBA новичок. Подскажите, как в VBA выполнить функцию ВПР или СУММЕСЛИ. т.е. надо найти значение на пересечении конкретных строк и столбцов а затем это значение вставить на пересечении конкретных строк и столбцов в другом файле. спасибо.


Может кто-то может дать пример скрипта для даного случая? Я могу дать пример в файле.
Буду признателен за помощь.
Автор: CEMEH
Дата сообщения: 28.08.2007 21:38
Oyger
Огромное спасибо за помощь!
только:
Цитата:
предварительно в Excel подключи библиотеку Word'а
не знаю как это делать.. (я новичок в программировании)

Я еще не пробовал передавать данные ни в каком виде. Самое простое для меня это напечатать в Word-е текстовую переменную А.

1. Я как то встречал документы Word у которых в тексте есть такая фишка: {asdf} я так понимаю, что некая программа вставит вместо "фишки" значение своей переменной asdf. хочется посмотреть на такую возможность сделать это через Excel.

2. Но бывает, что надо вставить не в определенное место, а подряд несколько (количество неизвестно) абзацев.
что то вроде:
for x=1 to Y
(напечатать очередным абзацем в ворде переменную x)
next x

Автор: SERGE_BLIZNUK
Дата сообщения: 28.08.2007 22:31
CEMEH
Извините, влезу в чужой разговор...
Цитата:
предварительно в Excel подключи библиотеку Word'а не знаю как это делать.. (я новичок в программировании)

меню Tools / References
находишь Microsoft Word 11.0 Object Library (вместо 11.0 у тебя может быть другая версия - зависит от версии Офиса)

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


Цитата:
for x=1 to Y
(напечатать очередным абзацем в ворде переменную x)
next x

просто перед next x
делать
Selection.TypeParagraph ' это вставить Enter = перевод каретки = конец абзаца...



ol7ca
Вам нужно использовать функции Application.WorksheetFunction.
например, Application.WorksheetFunction.VLOOKUP и Application.WorksheetFunction.SumIf
о использовании почитайте (обсуждение на странице 35 - правда там для функций Индекс и ПоискПоз - но общий смысл, думаю, понятен.) соответствие русских и английских имён смотри шапку и/или файлик "C:\Program Files\Microsoft Office\OFFICE11\1049\funcs.xls"

Автор: Oyger
Дата сообщения: 29.08.2007 10:06
CEMEH

Цитата:
Я как то встречал документы Word у которых в тексте есть такая фишка: {asdf} я так понимаю, что некая программа вставит вместо "фишки" значение своей переменной asdf. хочется посмотреть на такую возможность сделать это через Excel


Ты говоришь про обычную замену - так иногда делают. Когда Тебе надо вставить текст в Word он привязывается к положению - страница, строка, символ... А если у Тебя изменится прочий-исходный текст что тогда - править макрос?
Чтобы избежать такого гемороя обычно в местах вставки указывают всякую фигню, типо твоей
Цитата:
{asdf}

А в макросе пишут - заменить врагмент на...

Вот пример:

Dim Word_ As Object 'Описываем переменную как объект
Set Word_ = GetObject("c:\Мои документы\Sghasdrhy.doc") 'Инициализируем объект. Он автоматом откроется.
Word_.Application.Visible = True 'Делаем его видимым
With Word_.Application.Selection.Find 'Параметры поиска-замены
.Text = "{arqwtrq}" 'то - что ищем. Твои
Цитата:
"фишки"

.Replacement.Text = "asfwqwtqwt" 'то - на что заменяем
.Execute Replace:=wdReplaceAll 'заменяем
End With

Параметров замены намного больше, но для твоей задачи достаточно этих.

Добавлено:
SERGE_BLIZNUK

Цитата:
Cells(Stroka_Temp2 + 1, 1).FormulaLocal = "01.12.2009"

Спасибо - работает.
Автор: CEMEH
Дата сообщения: 29.08.2007 20:06
SERGE_BLIZNUK
Oyger
ОГРОМНОЕ СПАСИБО!!!!!!


Цитата:
просто перед next x
делать
Selection.TypeParagraph ' это вставить Enter = перевод каретки = конец абзаца...

вот так:
word_.Selection.TypeParagraph ' это вставить Enter = перевод каретки = конец абзаца...
Автор: CEMEH
Дата сообщения: 30.08.2007 02:32
Опять косяк (((((

Не могу в макросе написать формулу

=ЕОШ(НАЙТИ("-";A1;1)) тут ищу в ячейке A1

B = IsErr(Find("" - "", A, 1)) ' тут ищу в переменной A

(программа ругается, что я не так написал?)


Придется пока делать расчет через формулу в ячейке (((
Автор: SERGE_BLIZNUK
Дата сообщения: 30.08.2007 04:12
CEMEH

Цитата:
B = IsErr(Find("" - "", A, 1)) ' тут ищу в переменной A

1) а кто будет писать Application.WorksheetFunction перед вызовом функций книги?
2) Application.WorksheetFunction.Find я так и не смог запустить... ;-((
3) не видно, какого типа у Вас переменная A ? range?
4) Почему бы не использовать такой подход?
Dim B As Boolean
Dim r As Range
Set r = Range("A1").Find("-", LookIn:=xlValues, LookAt:=xlPart)
If r Is Nothing Then
B = False
Else
B = True
End If





Добавлено:
НЕ, НУ Я ЗАТУПИЛ!!!!!! тупо пытался решить, почему не работает Ваш код, вместо того, чтобы представить - А ЧТО ЖЕ НУЖНО получить!

это же банальное - if InStr(A.Value, "-") > 0 Then

и ещё,
Find заработал, НО! Чтобы перехватить ошибку (когда не нашлось), вероятно прийдётся назначать обработчик событий! Так что это явно тупиковая ветка!!!!
Автор: Oyger
Дата сообщения: 30.08.2007 08:27
CEMEH
SERGE_BLIZNUK


Цитата:
B = IsErr(Find("" - "", A, 1))

Во первых: пишится с одной кавычкой B = IsErr(Find("-", A, 1))
Во вторых: как уже сказал SERGE_BLIZNUK не забывай писать Application.WorksheetFunction перед функциями.
В третьих: в начале опиши переменную А как текстовую.

Пример:
Dim A as String
A = Cells(1, 1).Value
B = Application.WorksheetFunction.IsErr(Application.WorksheetFunction.Find("-", А, 1))

Добавлено:
CEMEH

Цитата:
вот так:
word_.Selection.TypeParagraph


Тут в чем фишка: если Ты инициализируешь объект как класс Application

Цитата:
Dim word_ As Word.Application
Set word_ = New Word.Application

то Тебе не надо указывать класс в самой команде и команда будет такой как Ты написал.
А если Ты открыл объект просто и не инициализировал его к конкретному классу

Цитата:
Dim Word_ As Object
Set Word_ = GetObject("c:\Мои документы\Sghasdrhy.doc")

то Тебе в команде надо указывать класс, иначе VBA не поймет к какому классу относится данный метод. Каманда будет записана как:
word_.Application.Selection.TypeParagraph
Автор: SERGE_BLIZNUK
Дата сообщения: 30.08.2007 09:52
Oyger

Цитата:
B = Application.WorksheetFunction.IsErr(Application.WorksheetFunction.Find("-", А, 1))

а вот теперь вопрос - а если в переменной А нет "-" - что даёт у Вас выполнение кода?
ошибка не вылетает?..
Автор: Oyger
Дата сообщения: 30.08.2007 11:52
SERGE_BLIZNUK
Твоя правда. Код не работает если в переменной нет "-".
Слажал...

CEMEH
Смотри сообщение от SERGE_BLIZNUK...
Автор: SERGE_BLIZNUK
Дата сообщения: 30.08.2007 12:32
Oyger

Цитата:
Твоя правда. Код не работает если в переменной нет "-".
- хорошо. а я уж думал, что это с моим Excel локальные проблемы.

А по поводу такого решения - так мы тут не при чём - это Excel так мудро рулит... ;-(( при желании через On Error Resume Next это элементарно гасится (я видел даже подобные решения в Интернете, пока искал способ использования WorksheetFunction.Find), но на мой вкус и некрасиво, да и не зачем так поступать.
Автор: vasiliy74
Дата сообщения: 30.08.2007 12:47
привет всем! есть проблема в понимании того как нужно делать ссылку в диалоговом окне, не типовом, а построеном на основе пользовательской формы, на диапозон ячеек с именем, нужно чтобы выподал список значений.

Private Sub ComboBox1_Change()
...?
End Sub
Автор: Oyger
Дата сообщения: 30.08.2007 13:17
vasiliy74

На странице 36 обсуждали этот вопрос, но только про ListBox.
Разницы никакой нет.
Если я конечно вопрос правильно понял.
Автор: vasiliy74
Дата сообщения: 30.08.2007 13:32
Oyger
Наверно мне пример непонятен,
У меня есть перечень значений ему присвоено имя, я хочу через это имя обратиться к перечню и подставить перечень в пользовательскую форму в виде выпадающего списка.
Автор: nick7inc
Дата сообщения: 30.08.2007 15:43
vasiliy74
У меня заработало это:

Код:
Private Sub UserForm_Initialize()
UserForm1.ListBox1.RowSource = Лист1.Range("OO1").Address()
End Sub
Автор: ol7ca
Дата сообщения: 30.08.2007 20:30
Мне как новичку сложно пока разобраться. Мой скрипт все время выдает ошибку. Может кто-то сможет написать скрипт для этой задачки:

Имеем файл А - куда должны попасть даные из файлов В и С. Важно чтобы были вставлены только значения без формул а итоговые (последняя строка снизу и последний столбец справа) остались с формулами. В реальности таблица больше и шире раза в два чем прведеный пример. Желательнов А где-то снизу иметь строчку для самопроверки. Где будут итоговые суммы по столбцам из В и С. У меня стоит английская версия Excel. спасибо.


Добавлено:
Я не нашел как прицепить файл с примером-(
Но пример простой: файлы А, В и С содержат столбец с одинаковыми наименованиями, В и С содержат по 3 столбца цифр напротив наименований которые должны быть записаны в соответствующие столбцы и строки в файл А, который имеет 6 столбцов (3 для В и 3 для С). Также в А последние строка и столбец имеют формулу суммирования - итог по столбцу\строке.
Автор: SERGE_BLIZNUK
Дата сообщения: 30.08.2007 20:55
ol7ca

Цитата:
не нашел как прицепить файл с примером

заходите на http://rapidshare.com или http://iFolder.ru или на http://zalil.ru
ищете там кнопку "Обзор" (или "Browse"), нажимаете её, указываете свой файл с примером (лучше его предварительно запаковать в архив rar), потом кнопочку "Upload" (или "Host it" или "Send"
ждёте, пока загрузится, потом Вам высвечивают ссылочки (ну, для рапиду это будет вида - Your Download-Link #1: http://rapidshare.com/files/999999999/TEST.rar.html
(возможно надо будет нажать внизу дополнительно
"I don't want a collector's account right now. Just give me the download-link.")
эту ссылку - для закачки и опубликуете в данном топике... Поверьте, я рассказываю дольше, чем это делается.

и ещё, иногда очень помогает скриншот (или графическая иллюстрация) - в этом случае можно таким же образом выгрузить картинку на сайт, например, http://www.imageshack.us/ - а потом в форум поместить ссылочку (для http://www.imageshack.us/ - из окошка "Hotlink for forums (1)")
всё.
Автор: vasiliy74
Дата сообщения: 31.08.2007 10:41
nick7inc
Да супер! работает!, Вопрос так сказать дальше, потомучто пирмеров нет
вот мы выбрали значение из списка, А потом что лучше организовать в качестве хранилища (временную переменную используемую между формами), с учётом того что делаю мастер который последовательно будет запрашивать данные, ну там Next и так пока не внисут всё только после этого выполнится макрос по их разнесению в файл Excel
Автор: 6epe3a
Дата сообщения: 31.08.2007 12:28

Автор: vasiliy74
Дата сообщения: 31.08.2007 14:04
Не работает подстановка списка если вызываю форму на другом листе:

Код: Private Sub UserForm_Initialize()
UserForm1.ComboBox1.RowSource = Лист1.Range("OO1").Address()
End Sub
Автор: ol7ca
Дата сообщения: 31.08.2007 16:39

Цитата:
SERGE_BLIZNUK


спасибо.


Цитата:
Имеем файл А - куда должны попасть даные из файлов В и С. Важно чтобы были вставлены только значения без формул а итоговые (последняя строка снизу и последний столбец справа) остались с формулами. В реальности таблица больше и шире раза в два чем прведеный пример. Желательнов А где-то снизу иметь строчку для самопроверки. Где будут итоговые суммы по столбцам из В и С. У меня стоит английская версия Excel. спасибо.


Вот файлы с примерами:

A-http://slil.ru/24800804
B-http://slil.ru/24800850
C-http://slil.ru/24800869
Автор: nick7inc
Дата сообщения: 31.08.2007 16:57
vasiliy74

Цитата:
Не работает подстановка списка если вызываю форму на другом листе:

На то может быть 2 причины, причём сразу обе

1. В моём примере указан явно лист, с которым идёт связь.
Сделай что-то вроде:

Код: Dim ws as worksheet
'Проверяем, чтобы activesheet указывал на рабочий лист, а не на диаграмму или что-то другое.
If TypeName(ActiveSheet) <> "Worksheet" Then
msgbox "Не тот лист выбрали!"
stop: end ' Или свой код на случай, если пользователь откроет,
' скажем, диаграмму вместо рабочего листа
end if

set ws=activesheet
Автор: SERGE_BLIZNUK
Дата сообщения: 31.08.2007 21:11
ol7ca
два вопроса -
1) в таблицах B и C строго по три столбца с значениями?
2) наименования в B и C точно всегда совпадают? Количество, написание, порядок???

Автор: august23
Дата сообщения: 01.09.2007 16:40
Кто подскажет как можно сделать чтобы макрос сам запускался во всех документах excel и на всех листах книг.
Автор: nick7inc
Дата сообщения: 01.09.2007 21:34
august23
Конкретизируйте ваш вопрос, при каком условии: открытии, изменении данных на листе, переключение между листами, закрытие книги, до печати и т.п.

Добавлено:
Или при нажатии на кнопку надо перебрать все книги и листы?
Главный медиум ещё в отпуске.
Автор: august23
Дата сообщения: 02.09.2007 12:07
Есть макрос который рисует линии от активной ячейки до координатной сетки(вверх и влево) - помогает ориентироваться.
Нужно чтобы он автоматом работал во всех книгах и листах, которые открываются на этом компе.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133

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


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