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

» Excel VBA (часть 2)

Автор: Ergistael
Дата сообщения: 26.11.2007 12:16

Цитата:
Ergistael
Вот так попробуй (для активной ячейки с формулой =СУММ(A3:A5)+E3*G5)

Код:
Public Sub test()
Dim p As Range
For Each p In ActiveCell.Precedents.Areas
Debug.Print p.Address
Next p
End Sub


AndVGri,
Спасибо большое, это, к сожалению, не решает для: =СУММ(A3:A5)+A3*G5, поскольку A3 входит в диапазон A3:A5 (я писал, что этого нужно избежать).

Пока придумал такое решение:



Добавлено:
Sub TestPrecAreas()
ActiveCell.ShowPrecedents
rangecount = 1
initcell = ActiveCell.Address
While Not currentcell = initcell
ActiveCell.NavigateArrow True, rangecount
currentcell = ActiveWindow.Selection.Address
MsgBox ActiveWindow.Selection.Address
rangecount = rangecount + 1
Range(initcell).Activate
Wend
MsgBox ("Finished!")
ActiveCell.ShowPrecedents Remove:=True
End Sub


Думаю, как оптимизировать...

Добавлено:
Еще проблема: как получить диапазоны в том виде, в каком они входят в формулу (т.е. абсолютные ссылки или относительные, а не все одинаково).
Автор: Luciefer
Дата сообщения: 26.11.2007 13:36
Очень нужна помощь.

Имеется:
Книга. Несколько листов.
Создается на основе макета новая книга и в нее вставляются значения из старой в необходимом порядке.

Что нужно:
в коде имеется

ActiveWorkbook.ActiveSheet.Cells(i, 2).Value = "='[процентная ведомость.xls]вед.нач.%% без проср.'!RC"

Таким образом в новую книгу вводится значение в виде функции, которая потом уже вписывает в ячейку значение. Как напряму вписать значение, что бы оно было явным, и соответственно не просило обновляться потом? (а то блн обновили )
Я так понимаю через Value, но не знаю как обратитья к старой книге, из которой берутся все значения, т.е. вторая часть формулы.
И еще вопрос.
Предположим мы нашли все таки значение в эту ячейку [i;2] (это Ф.И.О.), значение в ячейку [i;10] должно браться следующим образом: в книге откуда до этого бралось значение в [i;2] есть лист соотвествия номеров счетов, значениям Ф.И.О.. Так вот надо пройтись циклом по всему листу и найти там номер счета соответствующий фамилии.
Понятное дело
For j = 2 To 100 Step 1
....
Next j

А вот как организовать само сравнение значений? Опять же весь вопрос в том что значения из двух разных.

И еще вопрос. Если все таки (это так, для общего развития ) в ячейке формула типа "='[процентная ведомость.xls]вед.нач.%% без проср.'!RC", как в ячейку новосозданной книги записать именно ЗНАЧЕНИЕ из данной ячейки, а не формулу.

Фух, вроде все сформулировал.
Автор: I am not Liar
Дата сообщения: 26.11.2007 20:30
Помогите пожалуйста.
Другу дали задачи на VBA, а я его синтаксис не знаю. на остальных языках решения не принимают =(
1)
Даны действительные числа a1..an; n<=30
Вычислить MAX(|a1|,..|an|);
2)
Дан массив размером n, n<=20
заменить элементы массива большие 7 на 7, вывести массив и кол-во замененных элементов
3) Дана строка. Заменить символ пробела на "?" (без кавычек)
4) Выдать на печать позиции буквы "ю". Заменить все "ю" на "ь".
Буду очень признателен.
Автор: Tanya3000
Дата сообщения: 26.11.2007 20:54
Кто-нибудь знает, как программку, записанную с помощью module, заделать в Userform (чтоб работал с окошечками м кнопкой), а то у меня не получается. Заранее срасибо!!!

Sub main()
Dim N As Integer
N = InputBox("Введите число элементов")
Dim a() As Integer
ReDim a(1 To N) As Integer
For i = 1 To N
a(i) = InputBox("Введите элемент№" & i)
Next i
For i = 1 To N
If a(i) = i Then a(i) = 0
Next
Dim Msg As String
For i = 1 To N
Msg = Msg & "Вектор№ " & i & Chr(61) & a(i) & vbCrLf
Next
MsgBox Msg
End Sub
Автор: SAS888
Дата сообщения: 27.11.2007 06:52
I am not Liar
Возьми [more=Здесь.]
Sub MaxAbsA()
'Даны действительные числа a1..an; n<=30
'Вычислить MAX(|a1|,..|an|);
Dim n As Integer
Dim a(1 To n) As Variant 'пусть дан массив из n элементов

For i = 1 To n - 1
If Abs(a(i)) > Abs(a(i + 1)) Then MaxA = Abs(a(i)) Else MaxA = Abs(a(i + 1))
Next
MsgBox "Max(|a1|,|a2|,...,|an|) = " & MaxA 'искомое значение
End Sub

Sub Massiv()
'Дан массив размером n, n<=20
'заменить элементы массива большие 7 на 7, вывести массив и кол-во замененных элементов

Dim n As Integer, q As Integer
Dim a(1 To n) As Variant 'пусть дан массив из n элементов
Dim Msg As String

For i = 1 To n
If a(i) > 7 Then
a(i) = 7
q = q + 1
End If
Next
'вывод в окно сообщений
For i = 1 To n
Msg = Msg & "Элемент № " & i & Chr(61) & a(i) & vbCrLf
Next
Msg = Msg & "кол-во замененных элементов = " & q
MsgBox Msg
End Sub

Sub Stroka()
'Дана строка. Заменить символ пробела на "?" (без кавычек)
Dim MyString As String 'пусть дана строка MyString
Dim MyConvert As String

MyConvert = Application.WorksheetFunction.Substitute(MyString, " ", "?")
'Получим требуемую строку MyConvert
'ВНИМАНИЕ! Это будет работать только в Excel VBA
End Sub

Sub Pos()
'Выдать на печать позиции буквы "ю". Заменить все "ю" на "ь"
Dim MyString As String 'пусть дана строка MyString
Dim MyConvert As String, Msg As String
MyString = Range("C5")
Msg = "Позиции символа " & Chr(34) & "ю" & Chr(34) & vbCrLf
For i = 1 To Len(MyString)
If Right(Left(MyString, i), 1) = "ю" Then Msg = Msg & i & vbCrLf
Next
MyConvert = Application.WorksheetFunction.Substitute(MyString, "ю", "ь")
Msg = Msg & MyConvert
MsgBox Msg
'Получим требуемую строку MyConvert
'ВНИМАНИЕ! Это будет работать только в Excel VBA
End Sub
[/more]

Добавлено:
Luciefer
Если в "Книга1" уже имеется значение в ячейке [i, 2] (пусть результат формулы), то скопировать значение в другую книгу можно, например, так:
Workbooks("Книга2").Worksheets(1).Cells(i, 2) = Workbooks("Книга1").Worksheets(1).Cells(i, 2)
Все остальное - аналогично т.е. используй ссылку на Workbooks и Worksheets. (св-во ячейки Value - по умолчанию)
Автор: hackman
Дата сообщения: 27.11.2007 10:55
Подскажите пожалуйста, как у формуле поменять адресацию с относительной на абсолютнуюю (например есть формула =ВХ_Рец!E131, а надо =ВХ_Рец!$E$131).
Думал обрабативать строку формули через Mid, но ссилки разные и длина разная. Возможно есть более оптимальный способ?
Автор: dneprcomp
Дата сообщения: 27.11.2007 20:51
hackman
Попробуй функцию Replace
Автор: SAS888
Дата сообщения: 28.11.2007 05:41
hackman

Цитата:
как у формуле поменять адресацию с относительной на абсолютнуюю

Может [more=так.]
Sub Rel_to_Abs()

Dim i As Integer, A As String
Dim B() As String, C() As String, x As String, y As Integer

'Например, для активной ячейки

x = Mid(CStr(ActiveCell.Formula), 2) 'строка с формулой
y = Application.Find("!", x) 'позиция разделителя
On Error Resume Next 'если не ссылка, а просто формула
ActiveCell.Value = Chr(61) & Mid(x, y + 1) 'формула без ссылки
A = CStr(ActiveCell.DirectPrecedents.Address) 'строка с абс. ссылками
B = Split(A, ",") 'массив абсолютных ссылок
ReDim C(UBound(B))
For i = 0 To UBound(B)
C(i) = Application.Substitute(B(i), "$", "") 'массив относительных ссылок
x = Application.Substitute(x, C(i), B(i)) 'замена отн. на абс.
Next
ActiveCell.Value = Chr(61) & x 'формируем строку формулы

End Sub
[/more] пойдет?
Автор: emptyteam
Дата сообщения: 28.11.2007 06:29
Люди добрые, помогите советом.
У Автофильтра есть определенный предел 1000 значений, чем можно заменить Автофильтра на языке VBA ???
Автор: micolo
Дата сообщения: 28.11.2007 08:42
Доброго времени суток!

У меня такая задача!

Необходимо пробежаться по таблице и удалить все строки в в которых например пустая вторая колонка. Использовал разную кучу скриптов и с этого форума и с интернета -
когда доходит до удаления строки вылетает ошибка


Код:
Метод Delete из класса Range завершен неверно

Автор: SAS888
Дата сообщения: 28.11.2007 09:34
micolo
Sub Udalenie()
'Например, для столбца "B"
Dim i As Long
For i = ActiveSheet.Range("B65536").End(xlUp).Row To 1 Step -1
If IsEmpty(Range("B" & i)) Then Rows(i).Delete
Next
End Sub
Автор: hackman
Дата сообщения: 28.11.2007 10:17
SAS888
Спасибо! подошло! додал цикл и сделал как надо
Автор: micolo
Дата сообщения: 28.11.2007 12:11
SAS888

таже самая ошибка

Метод Delete из класса Range завершен неверно
Автор: SAS888
Дата сообщения: 28.11.2007 12:31
micolo
Ну, код-то точно рабочий. Смотри особенности таблицы. Или выложи файл. Разберемся.

Добавлено:
Такую ошибку, например, вызовет попытка удаления защищенной ячейки.
Автор: Ergistael
Дата сообщения: 28.11.2007 16:50
hackman

Цитата:
Подскажите пожалуйста, как у формуле поменять адресацию с относительной на абсолютнуюю (например есть формула =ВХ_Рец!E131, а надо =ВХ_Рец!$E$131).
Думал обрабативать строку формули через Mid, но ссилки разные и длина разная. Возможно есть более оптимальный способ?


Все существенно проще:


Код:
ActiveCell.Formula = Application.ConvertFormula(Formula:=ActiveCell.Formula, fromReferenceStyle:=xlA1, toReferenceStyle:=xlA1, ToAbsolute:=True)
Автор: ol7ca
Дата сообщения: 28.11.2007 18:45

Цитата:
SAS888


Спасибо за помощь! Все отлично работает!
Автор: ol7ca
Дата сообщения: 29.11.2007 03:35

Цитата:
SAS888


Есть очень похожая задача, но я не смог решить ее по аналогии. Если поможете - буду очень признателен.
вот ее пример:
http://rapidshare.com/files/73003657/3.xls.html

Автор: SAS888
Дата сообщения: 29.11.2007 08:53
ol7ca
Посмотри этот файл http://slil.ru/25164981 может устроит.

Добавлено:
Ergistael
Безусловно, непосредственную задачу от hackman этот метод решит, но все зависит от того, зачем это надо. Предложенный мной макрос, кроме изменения стиля ссылки, легко разделяет строку формулы на источник ссылки и, непосредственно, ячейку. Может это пригодится для решения дальнейшей задачи.
Автор: ol7ca
Дата сообщения: 29.11.2007 09:28

Цитата:
SAS888


Спасибо за помощь!
Завтра начну тестировать.
Автор: micolo
Дата сообщения: 29.11.2007 12:32
Привет всем! Подскажите пожалуйста с помощью чего можно проверять данные в ячейке на соответствию формату AA1419004 или AA1419013-E5. Именно формату а не равенству. Спасибо!
Автор: SAS888
Дата сообщения: 29.11.2007 12:35
micolo
При помощи оператора Like
Автор: micolo
Дата сообщения: 29.11.2007 12:43
SAS888

на сколько я понимаю Like - это оператор поиска или я ошибаюсь? Можно примерчик?
Автор: SAS888
Дата сообщения: 29.11.2007 12:44
micolo
String Like Pattern- оператор для проверки строки String на маску Pattern. Это очень мощный оператор, почти аналог регулярных выражений в Perl.

Пример:

Dim MyCheck
MyCheck = "aBBBa" Like "a*a" ' Возвратит True.
MyCheck = "F" Like "[A-Z]" ' Возвратит True.
MyCheck = "F" Like "[!A-Z]" ' Возвратит False.
MyCheck = "a2a" Like "a#a" ' Возвратит True.
MyCheck = "aM5b" Like "a[L-P]#[!c-e]" ' Возвратит True.
MyCheck = "BAT123khg" Like "B?T*" ' Возвратит True.
MyCheck = "CAT123khg" Like "B?T*" ' Возвратит False.

myString = "312T-87GD-8922"

If myString Like "###[A-Z]-##[A-Z][A-Z]-####" Then ...

Спец-символы в маске:

? Любой одиночный символ
* Ноль или более символов
# Любая одиночная цифра (0–9).
[charlist] Любой одиночный символ в классе символов (списке)
[!charlist] Любой одиночный символ не принадлежащий классу символов

Автор: micolo
Дата сообщения: 29.11.2007 13:00
SAS888

Спасибо! Вроде оно! А как сделать чтобы :



Код:
If myString (не)Like "###[A-Z]-##[A-Z][A-Z]-####"
Автор: SAS888
Дата сообщения: 29.11.2007 13:06
micolo
If Not([myString] Like [pattern]) Or Not([myString] Like [pattern]) Then ...
Автор: micolo
Дата сообщения: 29.11.2007 13:46
SAS888

Спасибо большое!
Автор: 81241
Дата сообщения: 30.11.2007 15:38
Всем привет!
Подскажите, пожалуйста, как в Exel сделать такую фичу.

Начальные условия:
Скажем в ячейке C2 прописывается дата (скажем, 30.11.07), а в ячейке B2 ставится число (любое). Это число определяет вторую дату, которая расчитывается как сумма введенной даты и введенного числа.
В колонке D2-Dn появляется очередные даты, где n=значению числа из ячейки B2.
Т.е. если в B2 стоит 1, то добавляется одна ячейка с датой 01.12.07; если в B2 стоит 3, то добавляется 2 колонки с датами 01.12.07 и 02.12.07 и т.д.
Такая штука у меня есть (кажется, пример с Планета Exel).

Мне необходимо в строке 3 в ячейке с датой n-1 вывести заливку какого-либо заданного цвета (например, красного) с каким-то заданным символом (скажем, X).

Как это сделать?
Автор: kalinakrasnay
Дата сообщения: 30.11.2007 17:01
Привет всем! У меня такая проблема: стоит задача из документа excel открыть существующий документ word (ну с целью запомнить его имя). Это я делаю вот так:

Цитата:
Private Sub otkr_Click()
Dim dial As Word.Dialog
Dim wd As Word.Application
Set wd = New Word.Application
Set dial = Dialogs(wdDialogFileOpen)
dial.Display
MsgBox dial.Name
End Sub

Собственно Проблема: запускаю я один раз эту прогу и в итоге все смотрю, все нормально, имя выдается, закрываю открывшееся окно ворда. Запускаю другой раз и мне выдается ошибка «The remote server machine does not exist or is unavailable» в строчке Set dial = Dialogs(wdDialogFileOpen).
Посмотрела в диспетчере задач, у меня там даже после закрытия ворда висит процесс WinWord.exe. я его убила, прога опять сработала без ошибки. Как избавиться от этой ошибки (не буду ж я вручную постоянно этот процесс убивать) и как автоматически после запоминания имени файла закрывать ворд (если я полностью открываю документ, ну при этом вместо dial.Display пишу dial.Show)?
Спасибо за помощь.
Автор: Troitsky
Дата сообщения: 30.11.2007 22:39
kalinakrasnay

Цитата:
Как избавиться от этой ошибки

Код: Set dial = Nothing
Set wd = Nnothing
Автор: kalinakrasnay
Дата сообщения: 01.12.2007 08:00
Troitsky

Цитата:
wd.Quit

за эт спасибочки.

Цитата:
Set dial = Nothing
Set wd = Nothing

проблемы не решают после 2-го запуска подряд опять же
Цитата:
выдается ошибка «The remote server machine does not exist or is unavailable»

и висит процесс WinWord.exe, причем я сделала wd.Quit. непонятно где собака зарыта...

добавлено:
Еще:
Заметила такую штуку: если я запускаю программу и у меня при этом открыт какой-нибудь файл ворда, пусть даже просто пустой, то программа работает корректно всегда, ошибка не выдается.
НО проблема не исчерпана, мне нужно чтобы прога работала и всяких запущенных документов ворда.


Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133

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


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