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

» Excel VBA (часть 2)

Автор: CEMEH
Дата сообщения: 27.11.2008 10:57
dneprcomp
Не осилю. Английский не знаю. А результат получить хочется.
Можно разжевать тему про сканирование подробнее?

пс
Чтение (и запись) текстовых файлов нашел
Автор: Barbukas
Дата сообщения: 27.11.2008 21:20
Ребят, помогите разобраться...
Мне необходимо сделать кубическую сплайн интерполяцию по заданным Х и Y в Exel'e. Скачал алгоритм, и написал небольшой код для вызова написанной функции! Но возникла проблема, что сплайн неадекватно строится...
т.е. для значений Х, например 1, 2, 3, 4, 5 и т.д. то все нормально
А если например задать последовательность 1, 3, 5, 6,5 и т.д. то сплайн рассчитывается неадекватно!
(в приклепленном файле выделенно желтым!)

SplineInt.zip (225 Kb)

Заранее благодарю за помощь!
Автор: dneprcomp
Дата сообщения: 28.11.2008 02:52
CEMEH

Цитата:
Не осилю. Английский не знаю

Код тоже на русском пишешь? Бери оттуда код и разбирай. Там нечего разжевывать. Показано как рекурсивно(через все под директории) получить список файлов.
Автор: MaximuS G
Дата сообщения: 28.11.2008 11:20
Ребята, пустяковый вопрос:
Как выделить ячейки, адресса которых занесены в массив ?
Например как с листами: Sheets(arr).select
Так не получаеться: Range(arr) .... Спасибо!

Опа, еще чето не получается вписать позицию ячейки в range... Вот так:
addr = selection.address
r1 = range(" & addr & ") ----- ??? Так нельзя ? Может из-за того что selection.address возвращает переменную не текствого типа ? А какого тогда ?
Автор: q1wed
Дата сообщения: 28.11.2008 13:32
MaximuS G убери лишнее

range(addr)

или объясни что ты хочешь
Автор: MaximuS G
Дата сообщения: 28.11.2008 13:45
q1wed
Спасибо за ответ, так работает, но не пойму следующие:
синтаксис range такой range("R5") тоесть скобки обязательно.. теперь если addr = R5, то range(addr) скобки уже не надо... хотя вроде сейчас понял что addr = "R5", уже со скобками!
А по первой части подскажите?
Если по подробней, хотел собрать адресса ячеек в массив arr и затем произвести действия над ними одновременно... тоесть как то указать их в range... сейчас поверчу, может с union что то придумаю .
Что нибудь посоветуете ? Спасибо
Автор: q1wed
Дата сообщения: 28.11.2008 17:32
MaximuS G кавычки говорят о том что между ними текст, selection.address сразу же возвращают текст, а потому еще кавычки не нужны. примерно так все работает.

по первой части. в массив данные должны загоняться примерно как то так:

for i=1 to 79870987
arr(i)=какая_то_функция_которая_зависит_от(i)
next

соответственно данные из массива должны доставться как arr(1), arr(2).. arr(i)
Автор: CEMEH
Дата сообщения: 28.11.2008 20:50
dneprcomp
Нашел!
Чтение имен файлов, работа с каталогами.
Автор: dneprcomp
Дата сообщения: 29.11.2008 00:29
CEMEH
Там не совсем верно. Или не до конца верно
Код покажет не только файлы, но и директории, и технические элементы файловой системы. Все равно придется разбираться, что нужное, а что нет. Кроме того, поиск проходит только в самой директории. В под директориях искать не будет.
Автор: AizecVHA
Дата сообщения: 29.11.2008 01:38
Подскажите, пожалуста, ответ на вопрос: как импортировать в Excel не весь текстовый файл, а только текст заключенный в кавычки ""? Потом его еще надо будет после перевода обратно вставить.
Автор: YuGo
Дата сообщения: 29.11.2008 12:58
Плз. Диапозон ячеек А1:А10 содержит определенный текст, если в них соответственно например в ячейке A1, A5, A10 встречается фрагмент текста L21, то содержимое соответствующих ячеек B1, B5, B10 накапливать (суммировать) в ячейке C1. Thanks!!!
Автор: Olive77
Дата сообщения: 29.11.2008 20:59
YuGo

я надеюсь это Вам не для зачетной сессии.
[more]
set rBereich=Activesheet.range("А1:А10")

summe=0
for each zelle in rBereich.cells
if zelle.value like "*L21*" then
summe=summe+zelle.offset(0,1).value
end if
next zelle

activesheet.range("C1")=summe
[/more]
Автор: YuGo
Дата сообщения: 29.11.2008 22:06
Olive77

БЛИН! ОГРОМНОЕ СПАСИБО!!!
Автор: wflamew
Дата сообщения: 30.11.2008 17:29
В Excel по DDE передаются данные в одни и те же ячейки. Требуется каждую новую порцию данных сохранять, т.е. разворачивать во времени. Каким образом, можно перехватывать событие на изменение значений в ячейках. Вновь поступившие данные могут в точности повторять предыдущий набор. Создал класс, в котором определил переменную, перехватывающую события Excel, в частности SheetChange().

Public WithEvents App As Application
Public Sub App_SheetChange(ByVal Sh As Object, ByVal Target As Range)
<тело обработчика>
End Sub

На ручные изменения значений в ячейках этот обработчик реагирует, а на данные по DDE - нет. В чем может быть причина, как решить данную проблему?
Автор: Mont1
Дата сообщения: 01.12.2008 07:52
AizecVHA
Здесь могу посоветовать только посимвольно перебирать весь текст в поисках кавычек
Что-то вроде

FileLength = LOF(1)
For i=1 to FileLength
if Mid(<переменная с данными из файла>,i,1) = Chr(34) then .....

Next i
Автор: MaximuS G
Дата сообщения: 01.12.2008 12:13
q1wed
Спасибо. В массив то я собираю без проблем, вопрос в том как их достать и объединить в коллекцию range, что бы потом произвести над ними действия ... range(arr(1), arr(2)... arr(n)).copy ну где вот так
Автор: QuoterMan
Дата сообщения: 01.12.2008 14:58

Подскажите, каким образом можно решить такую проблему: в Excel идет импорт данных на лист по DDE. Требуется выполнять макрос при каждом изменении этих данных.

Пытаюсь реализовать через событие Worksheet_Change(ByVal Target As Range).
Если меняю cоответствующие данные на листе вручную, то все работает, нужный макрос срабатывает. Если данные меняются автоматически по DDE, то ничего не происходит.

В инете нашел пару таких же вопросов, но без ответов. Как сделать, чтобы изменение ячеек по DDE можно было обработать?

Спасибо.

Добавлено:
проблема решена, спасибо
Автор: letropeur
Дата сообщения: 01.12.2008 20:39
Такая проблема:

Есть форма VBA под Excel, в которую уже внедрены рисунки. Нужно сделать так, чтобы из нее рисунки вставлялись на рабочий лист Экселя (именно из формы и внедренные в проект рисунки, а не из указанной папки). Возможно ли такое вообще?
Автор: q1wed
Дата сообщения: 01.12.2008 22:13
MaximuS G к сожалению не знаю что такое коллекция, вернее никогда не пользовался. Могу сказать только, что можно выгрузить весь массив на лист только если он одномерный или двумерный вот так: Range("A1:J10")=arr во всех остальных случаях приходится прокручивать по элементно.
Автор: 5tas
Дата сообщения: 02.12.2008 06:30
Добрый день,
скажите пожалуйста, кто-нибудь знает, как открыть документ Word из макроса в Excel?
Автор: Mont1
Дата сообщения: 02.12.2008 07:29
5tas
Попробуй
Application.ActivateMicrosoftApp xlMicrosoftWord
Автор: visual73
Дата сообщения: 02.12.2008 09:24
Кто-нибудь может улучшить этот макрос в плане быстродействия? Буду очень признателен.


Код: Sub Транспон(ИсхМассив) 'Переворачивает массив. Т.К. встроенная функция Transpose имеет ограничение (!)
Dim Rc As Long, Rr As Long, РезМассив() 'Rc, Rr- col и row Результирующего массива (result)
Dim Ic As Long, Ir As Long 'Ic, Ir- col и row Исходного массива (initial)

Ir = UBound(ИсхМассив, 1): Ic = UBound(ИсхМассив, 2)
ReDim РезМассив(Ic, Ir)
For Rc = 1 To Ir
For Rr = 1 To Ic
РезМассив(Rr, Rc) = ИсхМассив(Rc, Rr)
Next
Next
ИсхМассив = РезМассив
End Sub
Автор: q1wed
Дата сообщения: 02.12.2008 13:26

Цитата:
так массив не выгрузишь. Нужно обязательно указывать размер диапазона, соответствующий по размеру выгружаемому массиву.

угу действительно надо
Автор: MaximuS G
Дата сообщения: 02.12.2008 14:27
q1wed Скорее всего я неправильно объясняю, давайте попробую еще:
есть 3 элемента массива, которые я заменил на переменные:
arr(i) = addr(1) ..
Теперь 3 переменные:
addr = $A$1
addr1 = $A$10
addr2 = $C$15
теперь я хочу все три ячейки покрасить в синий цвет
как я выяснил можна так:
range(addr).interior.colorindex = 10
range(addr1).interior.colorindex = 10
...
но это все будет по порядку, а как одновременно .. ??? Читал что необходимо использовать функцию Union, тоетсь MultiRange = union(range1, range2 ... ), вот как их туда засунуть ??...
Автор: visual73
Дата сообщения: 02.12.2008 14:52
MaximuS G
записывай макросы, смотри хелп, тама все имеется
Вот тебе примерчик на сон грядущий

Код: Set bigRange = Application.Union(Range("Range1"), Range("Range2"))
bigRange.Formula = "=RAND()"
Автор: 5tas
Дата сообщения: 02.12.2008 15:41
Mont1
это несовсем то, что нужно. Мне надо открыть уже существующий документ, имя и путь к которому мне известны.
Автор: MaximuS G
Дата сообщения: 02.12.2008 15:47
visual73
Вы меня не дооцениваете !!!
Возможно я пошел не в ту степь, давайте так:
Есть n-е количество ячеек:
A5, B100, C18 ... Nn
Необходимо выполнить общую операцию над ними ОДНОВРЕМЕННО.
Просто загнать в union не получиться, так как неизвестно сколько таких ячеек а также их координаты... Вот проблемка, если бы я знал какие ячейки, тогда бы не было проблем, хотя с другой стороны запарился я бы даже 100 ячеек вручную вписывать
Автор: visual73
Дата сообщения: 02.12.2008 18:08
MaximuS G

Цитата:
так как неизвестно сколько таких ячеек

это не правильная постановка задачи. Это Вам сейчас неизвестно, а программе во время выполнения очень даже все известно, иначе она не сможет работать.
Другой вопрос откуда она об этом узнает и когда? Вот это Вы и должны нам всем рассказать. А пока я не вижу вразумительного объяснения.
Если их должен определять пользователь, тогда через форму и RefEdit. Далее считываете эти данные и далее как я написал в предыдущем сообщении применяете свою операцию ОДНОВРЕМЕННО.

Цитата:
Вы меня не дооцениваете !!!

очень даже может быть
Автор: Mont1
Дата сообщения: 03.12.2008 09:32
5tas
Могу предложить 2 способа:
Shell "winword.exe C:\1.doc", vbNormalFocus
Здесь возможно надо будет указать полный путь к ворду.

Более универсальный способ с помощью АПИ
надо создать модуль с кодом

Declare Function ShellExecute Lib "shell32.dll" Alias _
"ShellExecuteA" (ByVal hWnd As Long, ByVal lpOperation As String, _
ByVal lpFile As String, ByVal lpParameters As String, _
ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

Function ExecuteFile(ExecutableFile As String, Method As Integer)
On Error Resume Next
'Вызываем АПИ
ShellExecute Empty, "Open", ExecutableFile, vbNullString, Empty, Method
End Function

На кнопку вешаем вызов функции
ExecuteFile "c:\1.doc", 1
Автор: MaximuS G
Дата сообщения: 03.12.2008 09:48
visual73
OK
Для примера:
Есть диапазон A1:C20
Выполнить одновременно операцию над ячейками, которые окрашены скажем в синий цвет (interior.colorindex = 33) ?

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133

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


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