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

» Excel VBA (часть 3)

Автор: alpopo
Дата сообщения: 17.11.2012 21:00
Excel 2010 Проф программирование на VBA онлайн , rghost
Автор: Maximus777
Дата сообщения: 18.11.2012 12:34
andrewkard1980

Цитата:
Dim oHTTP as object, sURL$
sURL = "http://ya.ru"
Set oHTTP = CreateObject("MSXML2.XMLHTTP")
With oHTTP
.Open "GET", sURL, False
.Send
sHTML = .responseText
End With
Set oHTTP = Nothing

Если страничка в кодировке win1251, то в VBA русский текст превращается в "??????". Как с этим бороться?
Автор: komputeryuzer
Дата сообщения: 18.11.2012 18:27
andrewkard1980а нельзя ли проверить открыт ли нужный файл/лист на лету(одной функцией) таким способом
ведь списки открытых файлов/листов хранятся в массиве (раз форeач)
неельзя ли проверить нет ли в элементах массива какого то члена.. как обычно делается в других языках программирования
Автор: me4me
Дата сообщения: 18.11.2012 18:56
komputeryuzer

Цитата:
хранятся в массиве (раз форeач)

Блин! Просил же нормально, чтобы завязывал с олбанским? Просил.
Вежливо просил? Вежливо.
Так что тебе еще надо? Вали с этим говноязом знаешь куда, а... конфигсус!

Кнопку нажал.

Любой член любой коллекции можно проверить на валидность многими способами. Почти всегда это зависит от типа данных. Есть несколько специалихированных ф-ций IS[bla-bla-bla]. Самый простой (имо, стремный) способ - явное обращение к члену с последующей обработкой ошибки.

Ты в хэлп никак заглянуть-то не решаешься? Спрашиваешь такие азы и такого общего плана, что отвечая на них можно дисер написать...

Последнее - прекрати сравнивать языки. Это и самому тебе вредит в освоениии нового, и других с панталыку сбивает. Не гоже это. ТЕма эта скользкая и не для данного, сугубо практического топика.
Автор: panda3
Дата сообщения: 19.11.2012 09:23
komputeryuzer
Можно проверить одновременно, есть ли книга с нужным листом:

Код: IsObject([[Книга1]Лист1!A1])
Автор: komputeryuzer
Дата сообщения: 19.11.2012 11:30
panda3во!!! похоже что как раз то что надо... безовсяких многострочных переборов.. дай бог тебе здоровья..
Автор: komputeryuzer
Дата сообщения: 20.11.2012 13:23
всё равно ошибку выдает когда нет открытого файла - видать исобект() проверяет объект это или простая перемнная а не существует или нет.. приходится дополнительные строки (как минимум 3 команды) добовлаять.. на лету не получается..
ну ладно..
Автор: Black_Lung
Дата сообщения: 21.11.2012 12:10
komputeryuzer
on error лучший и простейший вариант, имхо
Автор: komputeryuzer
Дата сообщения: 21.11.2012 13:42
ну да.. из возможных.. надо вписать он eрор потом не забыть включить обратно плюс исобъект() проверить отдельно иначе нужная команда (например иис(,,) ) где хотим проверить "на лету" не срабатывает
а так терпимо.. хотелось бы совсем "на лету" ну ладно.. разобрались..
Автор: Voodooism
Дата сообщения: 22.11.2012 10:49
[more] Помогите пожалуйста, я в тупике. В институте занимаюсь изучением VBA. Код приведенный ниже взят из методички( за исключением переменных, их озвучивал сам)

Код: Sub Диапазон_ячеек()
Dim KP, KO, KN, NR, NC, NumOfRow, NumOfCol, i, j As Integer
Dim Item As Variant
NR = Selection.Rows.Count
NC = Selection.Columns.Count
NumOfRow = Selection.Row
NumOfCol = Selection.Column
For i = 1 To NR    
For j = 1 To NC
Item = Selection.CeIls(i, j)
If IsNumeric(Item) Then ' если значение в ячейке - числовое
If Item > 0 Then
КР = КР+1
Selection.Cells(i, j).Font.Color = vbRed
End If
If Item = 0 Then KN = KN + 1
If Item < 0 Then КО = КО + 1
End If
Next j
Next i
Cells(NumOfRow, NumOfCol + NC) = КР
Cells(NumOfRow, NumOfCol + NC + 1) ="Количество положительных значений"
Cells(NumOfRow + 1, NumOfCol + NC) = KN
Cells(NumOfRow + 1, NumOfCol + NC + 1) ="Количество нулевых значений"
Cells(NumOfRow + 2, NumOfCol + NC) = КО
Cells(NumOfRow + 2, NumOfCol + NC + 1) ="Количество отрицательных значений"
End Sub
Автор: Black_Lung
Дата сообщения: 22.11.2012 11:26
komputeryuzer
пример:

Код: On Error GoTo ErrorHandler
xx = VarType(Workbooks("zzz.xls"))
On Error GoTo 0
Exit Sub
ErrorHandler:
MsgBox "bla-bla-bla"
Resume Next
Автор: Voodooism
Дата сообщения: 22.11.2012 11:29
[more] Black_Lung
Спасибо тебе! С другом сидели минут 20 разбирались что как. В смой среде разработки - не сразу бросается в глаза

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


Код:
Sub ex7()
Dim NR, NC, NumOfRow, NumOfCol, i, j, K As Integer
Dim Item As Variant
K = 0
NR = Selection.Rows.Count
NC = Selection.Columns.Count
NumOfRow = Selection.Row
NumOfCol = Selection.Column
For i = 1 To NR
For j = 1 To NC
Item = Selection.Cells(i, j)
If IsNumeric(Item) Then
If Abs(Item) > 1 And j Mod 2 = 0 Then
Selection.Cells(i, j).Font.Color = vbRed
K = K + 1
End If
Next i
Next j
End Sub
Автор: LaCastet
Дата сообщения: 22.11.2012 16:06
Voodooism

Код:
If IsNumeric(Item) Then
If Abs(Item) > 1 And j Mod 2 = 0 Then
Selection.Cells(i, j).Font.Color = vbRed
K = K + 1
End If
Автор: Voodooism
Дата сообщения: 22.11.2012 16:15
А зачем мне второй end if? Ведь в коде, что я выкладывал выше, там тоже количество операторов If > End If.
Просто я немогу понять куда мне запихнуть еще 1 End If, так чтобы логический смысл не нарушился.

UP1:
Попробовал убрать еще 1 If и заменить его на связку AND - заработало.
Так же попробовал воткнуть второй End If сразу после первого - тоже работает.

Только суть проблемы в том что мне нужно разобратся в этом коде. Больше всего меня интересует почему в верхнем коде не каждый оператор if "закрывается"
Автор: LaCastet
Дата сообщения: 22.11.2012 16:43
Voodooism
Если вы об этом коде:

Код:
If IsNumeric(Item) Then ' если значение в ячейке - числовое
If Item > 0 Then
КР = КР+1
Selection.Cells(i, j).Font.Color = vbRed
End If
If Item = 0 Then KN = KN + 1
If Item < 0 Then КО = КО + 1
End If
Автор: Voodooism
Дата сообщения: 22.11.2012 18:04
[more] Окей,я понял. Ну и последний вопрос на сегодня, а то я уже устал, и вас утомил
В общем задача такая:
В каждой строке диапазона подсчитать число пар соседних ячеек, таких, что значение во второй ячейке в 2 раза меньше значения в первой ячейке, и выделить цветом меньшее значение.

Написал такой код

Код:
Sub ololoshka2()
Dim NR, NC, NumOfRow, NumOfCol, i, j As Integer
Dim Item, Item1 As Variant
Dim K As Double
NR = Selection.Rows.Count
NC = Selection.Columns.Count
NumOfRow = Selection.Row
NumOfCol = Selection.Column
For i = 1 To NR
For j = 1 To NC
Item = Selection.Cells(i, j)
Item1 = Selection.Cells(i, j + 1)
K = Item \ Item1
If K = 2 Then
Selection.Cells(i, j + 1).Font.Color = vbRed
End If
Next j
Next i
End Sub
Автор: LaCastet
Дата сообщения: 22.11.2012 18:30
Voodooism
Что-то типа этого:

Код:
For j = 1 To NC-1
Item = Selection.Cells(i, j)
Item1 = Selection.Cells(i, j + 1)
K = Item \ Item1
If K = 2 Then
Selection.Cells(i, j + 1).Font.Color = vbRed
End If
Next j
Автор: Voodooism
Дата сообщения: 22.11.2012 18:43
Если честно не понял смысла, переменная i вообще не озвучивается, и получается при пошаговом рассмотрении работы программы переменные Item и Item1 получают значения Empty. Фигня какая то

Up:
Оп, заработало, но смысла еще не понял. Ща буду опять пошагово разбирать
Автор: andrewkard1980
Дата сообщения: 23.11.2012 00:33

Цитата:
Если страничка в кодировке win1251, то в VBA русский текст превращается в "??????". Как с этим бороться?

Maximus777
Пробуй так:
sHtml = StrConv(oHttp.responseBody, vbUnicode)

Добавлено:
Voodooism
В сети есть бесплатная надстройка Smart Intender, приводит код в удобочитаемый вариант и сразу видны ошибки Next without For.
Автор: komputeryuzer
Дата сообщения: 23.11.2012 09:37
Black_Lung
Цитата:
и ненадо надо исобъектов
varype() ot isobjecta() ничем не лутче.. оба выдают ошибку при проверке.. и следовательно чтобы не убивать текучий оператор надо эту проверку выводить в отдельный оператор да и отключение с последующим включением еррора добавить.. полюбому "на лету" не получается.. ну хоть так...
Автор: panda3
Дата сообщения: 23.11.2012 12:33
komputeryuzer


Цитата:
всё равно ошибку выдает когда нет открытого файла

Ну не знаю, у меня вот такая процедура:

Код: Sub Test()
Debug.Print IsObject([[Книга2]Лист1!A1])
End Sub
Автор: komputeryuzer
Дата сообщения: 23.11.2012 13:24
у меня 2010.. и я через воркбоокс(книга2) пробовал не как ты
ты меня обнадёживаешь конечно.. сечас буду копать.. правда уменя..
Автор: komputeryuzer
Дата сообщения: 23.11.2012 17:20
MsgBox IsObject("Книга1!A2") ==> False (книга1 есть, текучая, ошибки нет)
MsgBox IsObject("Книга2!A2") ==> False (книга2 отсутствует, ошибки нет)
MsgBox Range("Книга1!A2").Value ==> (значение а2, ошибки нет)

если использовать вместо "Книга2!A2" Workbooks("Книга2") либо Range("Книга2!A2")
то если книга открыта - всё нормально, а если не открыта то ошибка!
Автор: panda3
Дата сообщения: 23.11.2012 19:13
komputeryuzer
Ну так я и предложил способ, при котором ошибки не будет. Вместо того, чтобы его применить ты придумываешь свой, который выдает ошибку и жалуешься, что ничего не получается. Выглядит довольно странно...
Автор: Maximus777
Дата сообщения: 26.11.2012 16:22
andrewkard1980

Цитата:
Пробуй так: sHtml = StrConv(oHttp.responseBody, vbUnicode)

Спасибо. Я уже нашёл это решение, просто не отписался здесь. Так всё ОК получается.

Теперь я поинтересней задачку нашёл, требуется динамически создать форму, положить на неё несколько label-ов, image-й и кнопку. Всё это получилось реализовать, а вот сделать так, чтобы ещё и кнопка работала, не получается. Вобщем, это суть прогрессбар с возможностью остановки макроса. Может кто решал такой ребус?
Автор: AndVGri
Дата сообщения: 27.11.2012 06:43
Maximus777

Цитата:
а вот сделать так, чтобы ещё и кнопка работала

Создаёте свой класс с кодом

Код:
Private WithEvents newButton As CommandButton

Public Sub Create(ByVal onForm As MSForms.UserForm, ByVal Caption As String, _
ByVal Left As Single, Top As Single, _
ByVal Width As Single, ByVal Height As Single)

Set newButton = onForm.Controls.Add(bstrProgID:="", Visible:=True)
newButton.Top = Top: newButton.Left = Left
newButton.Width = Width: newButton.Height = Height
newButton.Caption = Caption
End Sub

Private Sub newButton_Click()
MsgBox "new button"
End Sub
Автор: Maximus777
Дата сообщения: 27.11.2012 09:23
AndVGri
вся соль заключается в том, что мне это требуется сделать в одном модуле. Ни форм, ни классов в проекте не должно быть. Только один VBAProject\Modules\Module1. То есть, абсолютный рантайм.
Автор: komputeryuzer
Дата сообщения: 27.11.2012 13:27
panda3
Цитата:
Ну так я и предложил способ, при котором ошибки не будет. Вместо того, чтобы его применить ты придумываешь свой, который выдает ошибку и жалуешься, что ничего не получается. Выглядит довольно странно...
что предложил? можешь повторить? когда у меня нет ошибки (то есть сообщенмия об ошибке и остановки скрипта) но это не значит что работает корректно - да сообщения об ошибке нет но и не работает.. вот в чём беда.. если вставлю перед этим оператор "он error ресуме нехт" то мой весь оператор(где я "на лету" пытаюсь проверить открыта ли Книга2.хлс) просто не срабатывает - молча обходится...
ты говоришь(как я понял) у тебя 2003 и у тебя срабатывает коррекно.. а у меня 2010 и и меня не срабатывает корректно... либо ошибку выдает (и останавливается) либо молча пропускается
если отдельно запустить какой то оператор и результать запомнить в перемнную то в нужном месте можно проверить эту проверить эту перемнную то тогда да.. так можно.. (я так и делаю сечас) но это же не "на лету"..
а ты говоришь что у тебя "на лету" получается....
уххх!!! выдал!!! теперь понятно?
Автор: AndVGri
Дата сообщения: 28.11.2012 09:09
komputeryuzer
Вы может разберётесь с IsObject? panda3 дал прекрасную реализацию

Цитата:
[IsObject([[Книга2]Лист1!A1])

Этот код выполняется (в 2010 тоже) для вновь созданной книги именно в такой нотации.
Для уже существующей (сохранённой на диск) нужно писать, например:
IsObject(['d:\path\[Книга2.xlsx]Лист1'!A1]) - такой же формат прописывается в ячейке к данным в другой книге (без общих [])
или упрощённо (тоже работает)
IsObject([[Книга2.xlsx]Лист1!A1])

panda3
Отдельное спасибо за находку.
Автор: komputeryuzer
Дата сообщения: 28.11.2012 11:06
и у меня получилось! если долго мучиться... хорошо что не махнул рукой..

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127

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


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