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

» Excel VBA (часть 3)

Автор: ViktorGil
Дата сообщения: 04.10.2010 08:27
Hugo121
Спасибо.
Автор: ol7ca
Дата сообщения: 05.10.2010 16:34
smirnvlad
Drazhar

Спасибо!
Я попробую. Потом расскажу, что получилось. Но для меня остается не ясно, почему функция Application.OnTime TimeValue("14:11:10"), "macro" не срабатывает как должна? ...будем искать)
Автор: ViktorGil
Дата сообщения: 06.10.2010 10:55


Как сделать так чтобы в части выделенной желтым цветом подставлялся полный путь с именем файла вызванным из стандартного окна "Открытие файла", т.е. нужно макросом вызвать окно "Открытие файла" и подставить значение в макрос.
Автор: smirnvlad
Дата сообщения: 06.10.2010 11:16
ViktorGil

Цитата:
Как сделать так чтобы в части выделенной желтым цветом подставлялся полный путь с именем файла вызванным из стандартного окна "Открытие файла", т.е. нужно макросом вызвать окно "Открытие файла" и подставить значение в макрос.



Код: [no]
NewFN = Application.GetOpenFilename(FileFilter:="Excel Files (*.xls), *.xls", Title:="Please select a file")
If NewFN = False Then
' They pressed Cancel
MsgBox "Stopping because you did not select a file"
' Exit Sub
Else
MsgBox "File name is " & NewFN
End If
[/no]
Автор: ViktorGil
Дата сообщения: 06.10.2010 12:03
smirnvlad
Спасибо
Автор: mikhael02
Дата сообщения: 06.10.2010 13:11
Здравствуйте!
Возникла следующая проблема: перестал работать макрос для запроса сегодняшнего курса доллара с cbr.ru( Грешу на то, что на cbr опять что-то поменяли в XML-таблице, но сам разобраться не в силах, поэтому прошу помощи...


Код:
Dim Warning As Integer
Warning = MsgBox("Ввести курс доллара вручную?", vbYesNo + vbQuestion)
If Warning = vbNo Then
Dim CBR As String
Dim oHTTP As Object
Dim htmlcode, outstr As String
Dim d, m, y As Integer
d = Day(Date)
m = Month(Date)
y = Year(Date)
CBR = "http://www.cbr.ru/currency_base/daily.aspX?C_month=" & m & "&C_year=" & y & _
"&date_req=" & d & "%2F" & m & "%2F" & y
On Error Resume Next
Set oHTTP = CreateObject("MSXML2.XMLHTTP")
oHTTP.Open "GET", CBR, False
oHTTP.Send
htmlcode = oHTTP.responseText
outstr = Mid(htmlcode, InStr(1, htmlcode, "USD") + 87, 7) ' Profit!
Set oHTTP = Nothing
outstr = Replace(outstr, ",", ".")
Range("C11") = outstr
Else
Range("C11").Value = InputBox("Введите курс USD: ")
End If
Автор: smirnvlad
Дата сообщения: 06.10.2010 13:42
mikhael02

Цитата:
d = Day(Date)
m = Month(Date)
y = Year(Date)

заменить на

Код: [no] d = Format(Date, "dd")
m = Format(Date, "mm")
y = Format(Date, "yyyy")
[/no]
Автор: mikhael02
Дата сообщения: 06.10.2010 17:22
Спасибо, помогло!
Как ни странно, раньше работало с тем, что есть.
Автор: smirnvlad
Дата сообщения: 06.10.2010 18:03
mikhael02
видимо совпадало так, что числа (день, месяц) состояли из двух цифр
Автор: luckyvivaldi
Дата сообщения: 07.10.2010 00:13
Подскажите пожалуйста !
Написал подпрограмму, но не знаю как реализовать вывод данных.
Исходные данные : в колонке есть массив данных - суммы поступивших платежей от выбранному посредника. Посредников много и по каждому разные периоды поступления, то есть массив данных каждый раз имеет разную длину. В массиве числами заполнены не все ячейки подряд, в основном через одну, но может быть две подряд заполненных, третья пустая.
Задача : вывести в соседней колонке все числа подряд, чтоб не было пустых ячеек.

Написал такую подпрограмму, но что-то никак не могу добиться вывода чисел в соседней колонке :

Function list(rng As Range)
Dim yach As Range
Dim i As Integer
i = 0
For Each yach In rng
If Not IsEmpty(yach) Then
list = yach
i = i + 1
Cells(i, 0).Value = yach.Name ' эта строка не работает
End If
Next yach
End Function

Кто знает, прошу помочь.
Автор: smirnvlad
Дата сообщения: 07.10.2010 06:43
luckyvivaldi


Цитата:
Cells(i, 0).Value = yach.Name ' эта строка не работает


1. У первой ячейки адрес (1,1)
2. yach.Name работает только для именованных ячеек и получает не значение


Код: [no]
Cells(i, 1).Value = yach.Value
[/no]
Автор: SAS888
Дата сообщения: 07.10.2010 11:02
luckyvivaldi
Для решения Вашей задачи вовсе не обязательно перебирать все ячейки диапазона и сравнивать их на пустоту. В Excel есть много встроенных методов, которые нужно использовать. Так, например, пусть требуется в столбец "B" вывести все данные, находящиеся в столбце "A" игнорируя пустые ячейки. Для этого достаточно выполнить макрос:

Код: Sub Main()
Application.ScreenUpdating = False
[A:A].Copy: [B1].PasteSpecial Paste:=xlPasteValues
[B:B].SpecialCells(xlCellTypeBlanks).Delete
End Sub
Автор: luckyvivaldi
Дата сообщения: 07.10.2010 21:29
SAS888
Большое спасибо. Коротко и в точку. Подскажите, в какой литературе вы рекомендуете подучиться VBA для Excel, а то я прочитал "VBA для чайников", но там я такого не нашёл (даже таких операторов) и был так далёк от такого простого решения.
Автор: SAS888
Дата сообщения: 08.10.2010 05:10
luckyvivaldi
Книги великого Дж. Уокенбаха - это Библия Excel. А в принципе, во встроенном в Excel Help-е по VBA достаточно подробное описание всех (ну, или почти всех) методов.
Автор: aljarreau
Дата сообщения: 08.10.2010 08:15
всем привет!
ребята плиз подскажите тут в excel наш склда обычно там делает остатки и потом все столбцы которые там накопились + ячейки они скрывают он получается доходит до половины и потом выдает вот такую ошибку "объект невозможно переместить за пределы листа" как быть где надо проверять ?
Заранее благодарю за корректный ответ.
Автор: Hugo121
Дата сообщения: 08.10.2010 15:55
aljarreau
не пробовали поискать по "объект невозможно переместить за пределы листа"?

Первая ссылка:
http://office.microsoft.com/ru-ru/excel-help/HA010241241.aspx
Автор: ol7ca
Дата сообщения: 08.10.2010 17:06
Drazhar

while...wend не подходит - при запуске, макрос все время выполняет поиск нужного значения. Я не могу параллельно делать что-то другое в экселе.
По-моему, я нашел выход. Чтобы Application.OnTime срабатывал каждый день, как мне надо, нужно в аргументе указывать название текущего макроса (где находится сам оператор Application.OnTime) а ниже вставлять исполняемый макрос. пример [more]
Код:
Sub Macro1w()

Application.OnTime TimeValue("09:59:59"), "Macro1w"

Application.Workbooks("WEATHER2.xls").Sheets("links"). _
Cells(74, 1) = TimeValue(Now)

End Sub
Автор: Drazhar
Дата сообщения: 11.10.2010 09:01
ol7ca
Повторюсь. Если запустить While wend в отдельном application'е? то подобных проблем не будет. То есть для резидентного висения один App, для работы - другой, а то и не один.
Автор: V4mp
Дата сообщения: 11.10.2010 22:31
ol7ca
Пххх... Вы пришли к тому же выводу, который Вам озвучили ранее (не помню хто).
Таймер Ontime устанавливается один раз, после использования он обнуляется.
Ваш последний код как раз и обновляет таймер по новой при его срабатывании.

Однако, на мой взгляд, Вы немного не..ээ..красиво это организовали. Оставьте Все как есть в вашем первом посте (где 3 Sub). В последней из них добавьте строчку обновления таймера.
К тому же -
expression.OnTime(EarliestTime, Procedure, LatestTime, Schedule)
Я бы добавил третий параметр, чтобы функция выполнялась не более 30 сек. Это ОЧЕНЬ плохой тон в программировании, если выполнение (как у Вас) может быть бесконечным. Также откажитесь в Вашем макросе от команд copy,cut и paste, т.к. если на этой команде произойдет сбой (оператор on error для отлова ошибок ведь Вы не используете), то команда ontime может так и не сработать.
Ну воть, вкратце)

Добавлено:
Drazhar

Цитата:
запустить While wend в отдельном application'е

А можно полюбопытствовать, как это можно организовать?
Автор: smirnvlad
Дата сообщения: 12.10.2010 06:31
V4mp

Цитата:
К тому же -
expression.OnTime(EarliestTime, Procedure, LatestTime, Schedule)
Я бы добавил третий параметр, чтобы функция выполнялась не более 30 сек.

судя по описанию OnTime, LatestTime ограничивает не время выполнения, а время в течении которого Excel может запустить Procedure, если был занят в EarliestTime
Автор: Drazhar
Дата сообщения: 12.10.2010 09:24
V4mp
1)Открывает Excel.
2)Запускается произвольный макрос висящий резидентно.
3)Открывается еще один Excel(не лист а именно приложение - через пуск ли или как еще-не важно). В нем уже работает пользователь.
В минусах:
GetObject приведет к зависанию(во всяком случае у меня приводит)
В плюсах - резидентно висящий код без установки дополнительного ПО. Имхо круто.
Автор: V4mp
Дата сообщения: 12.10.2010 12:03
smirnvlad
Угу. Так я предполагаю, что занят он может быть как раз выполнением этого же задания Ну или чем то другим.
Ведь если эксэль будет занят, например, все сутки, то на следующие сутки onTime сработает уже два раза, а ведь цитата "это влечет ошибку в другом файле". (мот не точная цитата, но суть верна)

Добавлено:
Drazhar
Честно говоря, так я не пробовал сделать. Просто я не смог добиться правильного цикла while для системы. Тут либо процессор будет грузиться на 50% из ничего, либо эксэль будет на нное кол-во секунд виснуть (зависит от того, какие операторы использовать).
Автор: smirnvlad
Дата сообщения: 12.10.2010 12:49
Drazhar
зачем городить огород, почему не использовать планировщик windows запускающий файл excel который при открытии, делает то что нужно и закрывается
Автор: Drazhar
Дата сообщения: 12.10.2010 15:10
smirnvlad
Планировщик не всегда помогает. У меня лично такая связка работает с целью раскидывания файлов из определенной папки в зависимости от имени - планировщик тут не поможет(((
Автор: Frantishek
Дата сообщения: 13.10.2010 19:21
Кто-нибудь знает, возможно как то ли обойти запрет на запуск макросов, ограниченный сис.админом на рабочем софте?
Вариант перестройки кода также интересен. Спсб.
Автор: Flex_Dj
Дата сообщения: 14.10.2010 08:06
Всем доброго дня!
Помогите решить задачу!!!
Есть код:
================================
Dim cn As ADODB.Connection
Set cn = CreateObject("ADODB.Connection")
cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\F407\BASE\db1.xls;Extended Properties=""Excel 8.0;HDR=No"";"
cn.Open

Dim rs As ADODB.Recordset
Set rs = CreateObject("ADODB.Recordset")
rs.Open "SELECT F21, F17, F9, F6, F7 FROM [db1$] WHERE f21 LIKE '%" & TextBox1.Text & "%'", cn

Dim QT1 As QueryTable
Set QT1 = QueryTables.Add(rs, Range("A10"))
QT1.FieldNames = False
QT1.Refresh
cn.Close
=================================
Всё работает, за исключением того, что при выводе QT на лист ячейка F6 - пустая, при этом я точно знаю, что в записи, которая выбирается из db1.xls там стоит дата.
В поле F7 тоже стоит дата, но она отлично выводится на лист...

В файле db1.xls в графах F6 и F7 стоят даты (не во всех строках) причем даты прописаны в текстовом формате (просто текст, например "12.10.2008")
При запросе SELECT * FROM [db1$]... ячейка F6 тоже пустая.
Кто сталкивался с таким, подскажите, что делать..
Или у меня есть ошибка в коде?
Автор: Drazhar
Дата сообщения: 14.10.2010 08:11
гм. а может проще

Код: Dim cn As ADODB.Connection
Set cn = CreateObject("ADODB.Connection")
cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\F407\BASE\db1.xls;Extended Properties=""Excel 8.0;HDR=No"";"
cn.Open

Dim rs As ADODB.Recordset
Set rs = CreateObject("ADODB.Recordset")
rs.Open "SELECT F21, F17, F9, F6, F7 FROM [db1$] WHERE f21 LIKE '%" & TextBox1.Text & "%'", cn
range()"A1").copyfromrecordset rs
Автор: Flex_Dj
Дата сообщения: 14.10.2010 08:18
Drazhar
попробовал, как Вы написали - то же самое.
Выводится все, кроме поля F6 (оно пустое)

Не понимаю, в чем проблема?
Может быть глюк в самой библиотеке ado?

Добавлено:
Спасибо, вопрос снимается.
Создал аналогичный файл db1.xls - из него всё выбирается...
Автор: Drazhar
Дата сообщения: 14.10.2010 08:42
маловероятно. поставьт брейк на строку range()"A1").copyfromrecordset rs и провенрьте содержимое rs(3).value

Добавлено:
ну вот и ладушки)
Автор: Hugo121
Дата сообщения: 15.10.2010 11:58
Frantishek
http://www.planetaexcel.ru/forum.php?thread_id=20081

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127

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


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