Непонятно откуда берутся l_Cnt, где они задаются?
» Excel VBA (часть 3)
Black_Lung
Декларируются as long глобальными на уровне проекта. Инициализирутся:
l_Counter = 0: l_Cnt = 1
Декларируются as long глобальными на уровне проекта. Инициализирутся:
l_Counter = 0: l_Cnt = 1
Как меняется значение l_Counter в строках перед и после пустых?
Цитата:
оба счетчика считают исправно, без пробелов
С каждым поступившим отсчетом оба счетчика увеличиваются на 1. Когда ничего не пишется они все равно увеличиваются:
http://img842.imageshack.us/img842/7969/0927090358.png
l_Counter - порядковый номер поступившего отсчета. l_Cnt, на единицу больше, соответствует номеру строки, в которую будет записан отсчет.
Колонка 10 - l_Counter
загадочно это, может там цвет шрифта в белый выставился, я бы перед endsub для теста вставил
Код:
With Sheets(2).Cells(l_Cnt, 2)
.AddComment
.Comment.Text Text:="test"
End With
Код:
With Sheets(2).Cells(l_Cnt, 2)
.AddComment
.Comment.Text Text:="test"
End With
Black_Lung
Цитата:
Проверил. Все черным по умолчанию. Растянул формат - пусто там
Я бы понял, что какой-то затык происходит, когда данные ускоряются - до нескольких десятков в секунду, но и при медленном их поступлении возникают пробелы...
Попробовать можно, конечно, но большого смысла не вижу. Просто вместо св-ва .Value объекта Range будем добавлять ему новое св-во .Comment и присваивать значение ему. То же масло, только чуть масляннее
Меня смущает, что даже эта строка не отрабатывает
Код: .Cells(l_Cnt, 2).Value = Time
Цитата:
может там цвет шрифта в белый выставился
Проверил. Все черным по умолчанию. Растянул формат - пусто там
Я бы понял, что какой-то затык происходит, когда данные ускоряются - до нескольких десятков в секунду, но и при медленном их поступлении возникают пробелы...
Попробовать можно, конечно, но большого смысла не вижу. Просто вместо св-ва .Value объекта Range будем добавлять ему новое св-во .Comment и присваивать значение ему. То же масло, только чуть масляннее
Меня смущает, что даже эта строка не отрабатывает
Код: .Cells(l_Cnt, 2).Value = Time
Цитата:
Private Sub Worksheet_Calculate()
Попробуйте прописать код не в этой процедуре, а в процедуре, где обрабатываются поступающие данные
Добавлено:
Цитата:
Меня смущает, что даже эта строка не отрабатывает
Значит как-раз и не вызывается пересчёт на листе
psiho
Цитата:
Нет других считающих процедур:
Цитата:
Цитата:
Вот как раз и вызывается :) Само событие-то возникает и отрабатывается...
Добавлено:
psiho
Спасибо за наколку!
Цитата:
Понял, в чем дело. У меня две ячейки с формулами DDE. Остальные формулы - зависящие от них. Обновление по DDE иногда вызывает событие до того, как пересчитаются остальные, зависимые формулы.
Уберу все зависимые формулы, перенесу промежуточные расчеты в VBA, но...
... ну, бог с ним, писались бы старые, искаженные данные или, вообще, ошибки. Но ведь даже Time не пишется!
Баг, не? Обойти его - понятно как. А вот почему так происходит?
Цитата:
Попробуйте прописать код не в этой процедуре, а в процедуре, где обрабатываются поступающие данные
Нет других считающих процедур:
Цитата:
данные через DDE, считаются формулами листа
Цитата:
Значит как-раз и не вызывается пересчёт на листе
Вот как раз и вызывается :) Само событие-то возникает и отрабатывается...
Добавлено:
psiho
Спасибо за наколку!
Цитата:
psiho
Цитата:Попробуйте прописать код не в этой процедуре, а в процедуре, где обрабатываются поступающие данные
Нет других считающих процедур:
Цитата:данные через DDE, считаются формулами листа
Понял, в чем дело. У меня две ячейки с формулами DDE. Остальные формулы - зависящие от них. Обновление по DDE иногда вызывает событие до того, как пересчитаются остальные, зависимые формулы.
Уберу все зависимые формулы, перенесу промежуточные расчеты в VBA, но...
... ну, бог с ним, писались бы старые, искаженные данные или, вообще, ошибки. Но ведь даже Time не пишется!
Баг, не? Обойти его - понятно как. А вот почему так происходит?
Цитата:
А вот почему так происходит?
Это уже вопрос к мелкософтовым.
Есть макрос. При его выполнение происходит замена нужных букв, но часть из них не хочет нормально отображатся. Например, заместо символа йены или цента в макросе вопросительный знак.
____________________
Все. Нашел решение про ChrW.
____________________
Все. Нашел решение про ChrW.
Как через статус 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
Код модуля:
Код: 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
А как можно отличить 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
Код: 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
panda3
Снкс. Так повеселее. Хоть и не люблю я эти аврианты, но после проверки можно присвоить r локальному объекту конкретного типа.
Снкс. Так повеселее. Хоть и не люблю я эти аврианты, но после проверки можно присвоить r локальному объекту конкретного типа.
Подскажите пожалуйста решение задачи.
Имеется документ в нем есть
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
Ошибаетесь - это не совсем транспонирование
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
Ошибаетесь - это не совсем транспонирование
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
разработал программку с использованием элемента управления Calendar1. На офисе 2003, 2007 все работало отлично. переходим на официально закупленный офис 2010 - не работает - нет элемента. пытаюсь зарегистрировать элемент управления ActiveX - файл mscal.ocx из 2007 офиса - выдает ошибку. что делать, чтобы не писать самому календарик???
Доброго времени суток.
Подскажите пожалуйста, как организовать цикл получения данных из внешней базы и записи в 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
....
где х -должна быть строка. что то с цыклом никак не получается
а строк вовнешке ого как много...
Подскажите пожалуйста, как организовать цикл получения данных из внешней базы и записи в 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
....
где х -должна быть строка. что то с цыклом никак не получается
а строк вовнешке ого как много...
neuka
Я с Аctivex не имею дела вообще, но для помощи еще кого-то нужно подробней описывать что за ошибка.
chel78
Непонятна задача
Цитата:
Если "ого как много" не намного больше того что нужно записать, то записать всё и лишнее удалить потом.
Я с Аctivex не имею дела вообще, но для помощи еще кого-то нужно подробней описывать что за ошибка.
chel78
Непонятна задача
Цитата:
х -должна быть строка. что то с цыклом никак не получаетсяне все строки нужны для записи?
Если "ого как много" не намного больше того что нужно записать, то записать всё и лишнее удалить потом.
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
Что-нибудь вроде
Код:
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
Цитата:
Непонятна задача
Цитата:
х -должна быть строка. что то с цыклом никак не получается
не все строки нужны для записи?
Если "ого как много" не намного больше того что нужно записать, то записать всё и лишнее удалить потом.
Полный код выглядит следующим образом
если бы было скажем 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
chel78
А что не устраивает то? Под ваш пример меняется всего то
Код:
For iRow = 1 To 2000
Cells(iRow, 1).Value = session.findById(Replace(baseStr, "x", CStr(iRow + 2))).Text
Next iRow
А что не устраивает то? Под ваш пример меняется всего то
Код:
For iRow = 1 To 2000
Cells(iRow, 1).Value = session.findById(Replace(baseStr, "x", CStr(iRow + 2))).Text
Next iRow
Цитата:
А что не устраивает то? Под ваш пример меняется всего то
Мне надо что бы строка была именно такого вида.. а Ваш пример что то никак не прикручу
*=session.findById("wnd[0]/usr/sub/1[0,0]/sub/1/2[0,0]/sub/1/2/3[0,3]/lbl[1,3]").Text
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). и просмотрите вышеприведённый полный код цикла. А я всё - пас.
Почитайте справку по 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). и просмотрите вышеприведённый полный код цикла. А я всё - пас.
Цитата:
Код:
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.
Может загнать 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
Код:
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
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 строку, после равенства скопировал
Цитата:
Так что причина не в способе формировании строки
В 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
Так что причина не в способе формировании строки
Цитата:
Так что причина не в способе формировании строки
Либо лыжи не едут.. либо я не догоняю...
У меня редактор ругается красным .. на "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
Цитата:
Удалось решить вопрос следующим образом .. работает на УРА!
Ан нет.. не работает : ( .считывает только видимую часть, а далее не хотит.. надо скролить
Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
Предыдущая тема: VS 2010
Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.