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

» Excel VBA (часть 3)

Автор: Black_Lung
Дата сообщения: 27.09.2012 11:22
Непонятно откуда берутся l_Cnt, где они задаются?
Автор: zippun
Дата сообщения: 27.09.2012 11:39
Black_Lung
Декларируются as long глобальными на уровне проекта. Инициализирутся:
l_Counter = 0: l_Cnt = 1
Автор: Black_Lung
Дата сообщения: 27.09.2012 11:53
Как меняется значение l_Counter в строках перед и после пустых?
Автор: zippun
Дата сообщения: 27.09.2012 12:12

Цитата:
оба счетчика считают исправно, без пробелов

С каждым поступившим отсчетом оба счетчика увеличиваются на 1. Когда ничего не пишется они все равно увеличиваются:
http://img842.imageshack.us/img842/7969/0927090358.png
l_Counter - порядковый номер поступившего отсчета. l_Cnt, на единицу больше, соответствует номеру строки, в которую будет записан отсчет.

Колонка 10 - l_Counter
Автор: Black_Lung
Дата сообщения: 27.09.2012 12:22
загадочно это, может там цвет шрифта в белый выставился, я бы перед endsub для теста вставил

Код:
With Sheets(2).Cells(l_Cnt, 2)
.AddComment
.Comment.Text Text:="test"
End With
Автор: zippun
Дата сообщения: 27.09.2012 12:43
Black_Lung
Цитата:
может там цвет шрифта в белый выставился

Проверил. Все черным по умолчанию. Растянул формат - пусто там

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

Попробовать можно, конечно, но большого смысла не вижу. Просто вместо св-ва .Value объекта Range будем добавлять ему новое св-во .Comment и присваивать значение ему. То же масло, только чуть масляннее

Меня смущает, что даже эта строка не отрабатывает

Код: .Cells(l_Cnt, 2).Value = Time
Автор: psiho
Дата сообщения: 27.09.2012 16:47

Цитата:
Private Sub Worksheet_Calculate()

Попробуйте прописать код не в этой процедуре, а в процедуре, где обрабатываются поступающие данные

Добавлено:

Цитата:
Меня смущает, что даже эта строка не отрабатывает

Значит как-раз и не вызывается пересчёт на листе
Автор: zippun
Дата сообщения: 27.09.2012 18:31
psiho
Цитата:
Попробуйте прописать код не в этой процедуре, а в процедуре, где обрабатываются поступающие данные

Нет других считающих процедур:
Цитата:
данные через DDE, считаются формулами листа


Цитата:
Значит как-раз и не вызывается пересчёт на листе

Вот как раз и вызывается :) Само событие-то возникает и отрабатывается...

Добавлено:
psiho
Спасибо за наколку!

Цитата:
psiho
Цитата:Попробуйте прописать код не в этой процедуре, а в процедуре, где обрабатываются поступающие данные

Нет других считающих процедур:
Цитата:данные через DDE, считаются формулами листа

Понял, в чем дело. У меня две ячейки с формулами DDE. Остальные формулы - зависящие от них. Обновление по DDE иногда вызывает событие до того, как пересчитаются остальные, зависимые формулы.

Уберу все зависимые формулы, перенесу промежуточные расчеты в VBA, но...

... ну, бог с ним, писались бы старые, искаженные данные или, вообще, ошибки. Но ведь даже Time не пишется!

Баг, не? Обойти его - понятно как. А вот почему так происходит?
Автор: psiho
Дата сообщения: 28.09.2012 06:39

Цитата:
А вот почему так происходит?

Это уже вопрос к мелкософтовым.
Автор: 4upa4ups
Дата сообщения: 02.10.2012 00:29
Есть макрос. При его выполнение происходит замена нужных букв, но часть из них не хочет нормально отображатся. Например, заместо символа йены или цента в макросе вопросительный знак.
____________________

Все. Нашел решение про ChrW.
Автор: koyusi
Дата сообщения: 03.10.2012 17:11
Как через статус r отличить вызовы друг от друга? Ну накрайняк первый ( от второго (без Optional). Объект может быть любой другой.
Код модуля:

Код: Option Explicit

Private rng As Range
'

Private Sub Test_Nothing_Start()
Call Test_Nothing(rng) ' 1
Call Test_Nothing(Nothing) ' 2
Call Test_Nothing ' 3
End Sub

Private Sub Test_Nothing(Optional r As Range)
Debug.Print (r Is Nothing)
End Sub
Автор: panda3
Дата сообщения: 04.10.2012 13:04
А как можно отличить 2 от 2? Также как и Nothing от Nothing, т.е. никак. Можно использовать типы, более богатые на пустые значения, например:

Код: Option Explicit

Private rng As Range
'
Private Sub Test_Nothing_Start()
Call Test_Nothing(rng) ' 1
Call Test_Nothing(Null) ' 2
Call Test_Nothing ' 3
End Sub

Private Sub Test_Nothing(Optional r As Variant = Empty)
If IsNull(r) Then Debug.Print "Null"
If IsEmpty(r) Then Debug.Print "Empty"
If IsObject(r) Then If r Is Nothing Then Debug.Print "Nothing"
End Sub
Автор: koyusi
Дата сообщения: 05.10.2012 09:39
panda3
Снкс. Так повеселее. Хоть и не люблю я эти аврианты, но после проверки можно присвоить r локальному объекту конкретного типа.
Автор: zarin_13
Дата сообщения: 05.10.2012 15:11

Подскажите пожалуйста решение задачи.
Имеется документ в нем есть
A1 A2 A3 An
B1 B2 B3 Bn
M1 M2 M3 Mn
Какой макрос нужно применить или как сделать, чтобы это все безобразие преобразовалось, сорри за тавтологию, в
A1 A2
A1 A3
A1 An
B1 B2
B1 B3
B1 Bn
M1 M2
M1 M3
M1 Mn

Заранее спасибо!
Автор: koyusi
Дата сообщения: 05.10.2012 18:53
Штатное транспонирование чем не любо?
Автор: AndVGri
Дата сообщения: 07.10.2012 08:38
koyusi
Ошибаетесь - это не совсем транспонирование
zarin_13

Код:
Public Sub Transpose2(ByVal this As Range)
Dim vIn As Variant, vOut() As Variant
Dim iRow As Long, iCol As Long
Dim i As Long, vNext As Variant
Dim LRow As Long, LCol As Long
Dim pSheet As Worksheet

vIn = this.Value: i = 0
LRow = UBound(vIn): LCol = UBound(vIn, 2)
ReDim vOut(1 To LRow * (LCol - 1), 1 To 2)
For iRow = 1 To LRow
vNext = vIn(iRow, 1)
For iCol = 2 To LCol
i = i + 1: vOut(i, 1) = vNext: vOut(i, 2) = vIn(iRow, iCol)
Next iCol
Next iRow
Set pSheet = ThisWorkbook.Worksheets.Add
pSheet.Range(pSheet.Cells(1, 1), pSheet.Cells(UBound(vOut), 2)).Value = vOut
End Sub
Автор: neuka
Дата сообщения: 08.10.2012 10:59
разработал программку с использованием элемента управления Calendar1. На офисе 2003, 2007 все работало отлично. переходим на официально закупленный офис 2010 - не работает - нет элемента. пытаюсь зарегистрировать элемент управления ActiveX - файл mscal.ocx из 2007 офиса - выдает ошибку. что делать, чтобы не писать самому календарик???
Автор: chel78
Дата сообщения: 10.10.2012 17:51
Доброго времени суток.
Подскажите пожалуйста, как организовать цикл получения данных из внешней базы и записи в Excel построчно.
Вот кусок примера кода.

...
Cells(x, 1) = session.findById("wnd[0]/usr/sub/1[0,0]/sub/1/2[0,0]/sub/1/2/x[0,x]/lbl[1,x]").Text
....

где х -должна быть строка. что то с цыклом никак не получается
а строк вовнешке ого как много...
Автор: Black_Lung
Дата сообщения: 11.10.2012 11:44
neuka
Я с Аctivex не имею дела вообще, но для помощи еще кого-то нужно подробней описывать что за ошибка.


chel78
Непонятна задача
Цитата:
х -должна быть строка. что то с цыклом никак не получается
не все строки нужны для записи?

Если "ого как много" не намного больше того что нужно записать, то записать всё и лишнее удалить потом.
Автор: AndVGri
Дата сообщения: 11.10.2012 12:55
Black_Lung
Что-нибудь вроде

Код:
Public Sub FillFromSession()
Const baseStr As String = Cells(x, 1) = "wnd[0]/usr/sub/1[0,0]/sub/1/2[0,0]/sub/1/2/x[0,x]/lbl[1,x]"
Dim iRow As Long
For iRow = FRow To LRow
Cells(iRow, 1).Value = session.findById(Replace(baseStr, "x", CStr(iRow))).Text
Next iRow
End Sub
Автор: chel78
Дата сообщения: 11.10.2012 13:24

Цитата:
Непонятна задача
Цитата:
х -должна быть строка. что то с цыклом никак не получается
не все строки нужны для записи?
 
Если "ого как много" не намного больше того что нужно записать, то записать всё и лишнее удалить потом.

Полный код выглядит следующим образом
если бы было скажем 5-10 строк статичных, записал бы постоянный код и не парился, но кол-во строк динамичное, 1- 2000+

Код: Sub testttt()
If Not IsObject(sap) Then
Set SapGuiAuto = GetObject("SAPGUI")
Set sap = SapGuiAuto.GetScriptingEngine
End If
If Not IsObject(Connection) Then
Set Connection = sap.Children(0)
End If
If Not IsObject(session) Then
Set session = Connection.Children(0)
End If
If IsObject(WScript) Then
WScript.ConnectObject session, "on"
WScript.ConnectObject sap, "on"
End If
session.findById("wnd[0]/tbar[0]/okcd").Text = "/nmb52"
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/usr/ctxtWERKS-LOW").Text = "a709"
session.findById("wnd[0]/usr/ctxtLGORT-LOW").Text = "ua38"
session.findById("wnd[0]/usr/ctxtLGORT-LOW").SetFocus
session.findById("wnd[0]/usr/ctxtLGORT-LOW").caretPosition = 4
session.findById("wnd[0]").sendVKey 8
Cells(1, 1) = session.findById("wnd[0]/usr/sub/1[0,0]/sub/1/2[0,0]/sub/1/2/3[0,3]/lbl[1,3]").Text
Cells(2, 1) = session.findById("wnd[0]/usr/sub/1[0,0]/sub/1/2[0,0]/sub/1/2/4[0,4]/lbl[1,4]").Text
Cells(3, 1) = session.findById("wnd[0]/usr/sub/1[0,0]/sub/1/2[0,0]/sub/1/2/5[0,5]/lbl[1,5]").Text
'etc
End Sub
Автор: AndVGri
Дата сообщения: 11.10.2012 13:30
chel78
А что не устраивает то? Под ваш пример меняется всего то

Код:
For iRow = 1 To 2000
Cells(iRow, 1).Value = session.findById(Replace(baseStr, "x", CStr(iRow + 2))).Text
Next iRow
Автор: chel78
Дата сообщения: 11.10.2012 14:28

Цитата:
А что не устраивает то? Под ваш пример меняется всего то

Мне надо что бы строка была именно такого вида.. а Ваш пример что то никак не прикручу

*=session.findById("wnd[0]/usr/sub/1[0,0]/sub/1/2[0,0]/sub/1/2/3[0,3]/lbl[1,3]").Text
Автор: AndVGri
Дата сообщения: 11.10.2012 14:45
chel78
Почитайте справку по Replace (может поймёте, как она формирует строку "wnd[0]/usr/sub/1[0,0]/sub/1/2[0,0]/sub/1/2/3[0,3]/lbl[1,3]" для session.findById()Text). и просмотрите вышеприведённый полный код цикла. А я всё - пас.
Автор: chel78
Дата сообщения: 11.10.2012 15:14

Цитата:
Код:
 
   For iRow = 1 To 2000
        Cells(iRow, 1).Value = session.findById(Replace(baseStr, "x", CStr(iRow + 2))).Text
    Next iRow  
 

Тем не менее не работает, застряет как только доходит до строки.
The control could not be found by id.
Автор: andrewkard1980
Дата сообщения: 11.10.2012 15:23
Может загнать session в переменную, и потом подставлять:

Код:
sSessionString="session.findById(" & chr(34) & "wnd[0]/usr/sub/1[0,0]/sub/1/2[0,0]/sub/1/2/3[0,3]/lbl[1," & i & "]" & chr(34) & ").Text"
Cells(i, 1).Value = sSessionString
Автор: AndVGri
Дата сообщения: 11.10.2012 15:37
chel78
В Immediate
?Replace("wnd[0]/usr/sub/1[0,0]/sub/1/2[0,0]/sub/1/2/x[0,x]/lbl[1,x]","x",CStr(5))="wnd[0]/usr/sub/1[0,0]/sub/1/2[0,0]/sub/1/2/5[0,5]/lbl[1,5]"
Выдаёт True строку, после равенства скопировал
Цитата:
Cells(3, 1) = session.findById("wnd[0]/usr/sub/1[0,0]/sub/1/2[0,0]/sub/1/2/5[0,5]/lbl[1,5]").Text

Так что причина не в способе формировании строки
Автор: chel78
Дата сообщения: 11.10.2012 16:13

Цитата:
Так что причина не в способе формировании строки

Либо лыжи не едут.. либо я не догоняю...
У меня редактор ругается красным .. на "x" ... и на Replace ругается ...
и к стати, в окошке имидиатли ничего не отображается вообще

Добавлено:
Удалось решить вопрос следующим образом .. работает на УРА!


Код: For x = 3 To 10000
On Error GoTo erh
Cells(x, 1) = session.findById("wnd[0]/usr/sub/1[0,0]/sub/1/2[0,0]/sub/1/2/" & x & "[0," & x & "]/lbl[1," & x & "]").Text
Cells(x, 2) = session.findById("wnd[0]/usr/sub/1[0,0]/sub/1/2[0,0]/sub/1/2/" & x & "[0," & x & "]/lbl[14," & x & "]").Text
Cells(x, 3) = session.findById("wnd[0]/usr/sub/1[0,0]/sub/1/2[0,0]/sub/1/2/" & x & "[0," & x & "]/lbl[55," & x & "]").Text
Cells(x, 4) = session.findById("wnd[0]/usr/sub/1[0,0]/sub/1/2[0,0]/sub/1/2/" & x & "[0," & x & "]/lbl[60," & x & "]").Text
Cells(x, 5) = session.findById("wnd[0]/usr/sub/1[0,0]/sub/1/2[0,0]/sub/1/2/" & x & "[0," & x & "]/lbl[65," & x & "]").Text
Cells(x, 6) = session.findById("wnd[0]/usr/sub/1[0,0]/sub/1/2[0,0]/sub/1/2/" & x & "[0," & x & "]/lbl[80," & x & "]").Text
Cells(x, 7) = session.findById("wnd[0]/usr/sub/1[0,0]/sub/1/2[0,0]/sub/1/2/" & x & "[0," & x & "]/lbl[99," & x & "]").Text
Cells(x, 8) = session.findById("wnd[0]/usr/sub/1[0,0]/sub/1/2[0,0]/sub/1/2/" & x & "[0," & x & "]/lbl[118," & x & "]").Text
Next

erh: Exit Sub
End Sub
Автор: AndVGri
Дата сообщения: 12.10.2012 00:55
chel78
Посмотрите ещё здесь, люди тоже самое делают.
Автор: chel78
Дата сообщения: 15.10.2012 12:49

Цитата:
Удалось решить вопрос следующим образом .. работает на УРА!

Ан нет.. не работает : ( .считывает только видимую часть, а далее не хотит.. надо скролить

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127

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


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