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

» Excel VBA (часть 3)

Автор: AndVGri
Дата сообщения: 21.10.2011 14:02
unit4
Oem так понимаю для dos cp866, ansi 1251, а win - это какая?
Посмотреть dbf можно плагином к total commader xbaseview, он так же есть как и отдельное приложение (бесплатное для людей с русской, украинской консолью)
gjf
ну так можно. А гуру то зачем напрягать?


Добавлено:
unit4
Oem так понимаю для dos cp866, win 1251, а oem - это какая?
Посмотреть dbf можно плагином к total commader xbaseview, он так же есть как и отдельное приложение (бесплатное для людей с русской, украинской консолью)
gjf
ну так можно. А гуру то зачем напрягать?
Автор: unit4
Дата сообщения: 21.10.2011 14:37
AndVGri

Цитата:
а win - это какая?

Пардон, имел ввиду как раз ANSI 1251.
Автор: gjf
Дата сообщения: 22.10.2011 02:35
AndVGri

Цитата:
ну так можно.

Ну так и как?

data man
Да успокойтесь Вы уже. Что Вы бегаете за мной по всем темам?
Автор: AndVGri
Дата сообщения: 22.10.2011 04:55
unit4
Может проще создавать два dbf файла? Один в dos, другой в win, а там что заказчик выберет. Трудностей никаких. Создаёшь два подключения, одно с Provider=VFPOLEDB. Provider=Microsoft.Jet.OLEDB.4.0 в двух разных папках, создаёшь две таблицы, два Recordset и пишешь в одном цикле в оба.
gjf
Золотой вы наш. Шапку прочитали? Вот unit4 трудится - помогаем. Приложите то, что не выходит - поможем. А "ну так как" это другая ветка любого форума по программированию, на ru-board это здесь
Автор: unit4
Дата сообщения: 22.10.2011 06:07
AndVGri

Цитата:
Вот unit4 трудится - помогаем.

Пасиб))

Заказчик - это я сам, т.е. на работе попросили, точнее вынудили. А что касается

Цитата:
одно с Provider=VFPOLEDB. Provider=Microsoft.Jet.OLEDB.4.0

Так я же уже создавал, пробовал, и чего то не работает(( Надо разобраться с шаблоном который саппорт прислал и тогда станет ясно чего там надо.
Автор: grbdv
Дата сообщения: 22.10.2011 08:36
gjf
Ну ты наглый :)

1. Ты бы для приличия свой начальный пост во флейме поправил.
2. Подъем темы? Знаешь ведь, что это такое.
3. Я же сказал тебе - учи матчасть. И посомтри тему для печати. Недавно обсуждалась программная обработка гиперссылок.
Автор: gjf
Дата сообщения: 22.10.2011 23:21
AndVGri
Вот пожалуйста: ссылка.

Добавлено:
grbdv
Уважаемый, мне неприятно с тобой общаться под любым ником, но исключительно из желания тебе помочь в собственном самообразовании укажу, почему мой вопрос не имел ответа в этой теме.

Как поменять гиперссылки и как их обрабатывать - да, обсуждалось. Но я спросил - как угодно назови: специалистов, опытных пользователей, гуру - по мне, так едино: я спросил их:

Цитата:
скачать контент всех гиперссылок в папку, где находится искомый файл-таблица, после чего поменять все гиперссылки на локальный путь.


И со всем уважением - коли помочь не можешь - не мешайся под ногами. Не ищи неприятностей. Просто прошу - без тебя хватает флудеров.
Автор: grbdv
Дата сообщения: 23.10.2011 08:10
gjf

Цитата:
скачать контент всех гиперссылок в папку, где находится искомый файл-таблица,

Я не буду искать, потрудись сам, будь ласка, но ведь и работа с Microsoft Internet Controls если не на днях, то месяц-два назад обсуждалась. Да и ссыль проскальзывала, как щаз помню, что-то типа Automating Internet Explorer. Не помню, насколько уж она полезна... Как тему для печати открыть знаешь? Это максимум, что я могу для тебя сделать в SQ.

Бзв, а для мелкого шрифта разве не место в личке или во Флейме, где все началось?
Автор: gjf
Дата сообщения: 23.10.2011 15:55
grbdv

Цитата:
работа с Microsoft Internet Controls если не на днях, то месяц-два назад обсуждалась. Да и ссыль проскальзывала, как щаз помню, что-то типа Automating Internet Explorer

Видимо, мне неправильно указали ссылку во Флейме, где могут помочь. Реально стоит единичная задача, которая вряд ли ещё повторится. Ради решения единичной задачи осваивать VBA и суммировать отдельные обрывки кода и рекомендации по всей теме не считаю целесообразным. Нет, безусловно это было бы полезным для расширения кругозора и наверняка пригодилось бы в будущем, но на это просто нет сейчас времени - и так хватает рутины.

А касательно того файла - сделаю всё ручками, раз уж помощи нет. Потраченный час иди два меньше времени, затраченного на изучение всего вышесказанного. Тем более подчеркну - задача единичная.

Всем спасибо, кто не помог.
Автор: AndVGri
Дата сообщения: 24.10.2011 01:57
unit4

Цитата:
Так я же уже создавал, пробовал, и чего то не работает

Чего же? Вот для примера
[more]

Код:
Option Explicit

Const adUseClient = 3
Const adOpenStatic = 3
Const adCmdTable = 2
Const adLockOptimistic = 3
Dim dosConn, winConn
Dim dosRSet, winRSet, i

Set dosConn = CreateObject("ADODB.Connection")
Set winConn = CreateObject("ADODB.Connection")

dosConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\Temp;Extended Properties=dBASE IV;User ID=Admin;Password=;"
winConn.Open "Provider=VFPOLEDB.1;Data Source='c:\temp\';Collate=Russian"

dosConn.Execute "Create Table DREPORT (LCODE char(254), CODE int, [SECTION] char(2), KOL int, [SUM] double, PRTSH char(1), EI char(3))"
winConn.Execute "Create Table WREPORT (LCODE char(254), CODE int, [SECTION] char(2), KOL int, [SUM] double, PRTSH char(1), EI char(3))"

Set dosRSet = CreateObject("ADODB.Recordset")
Set winRSet = CreateObject("ADODB.Recordset")

dosRSet.CursorLocation = adUseClient
winRSet.CursorLocation = adUseClient

dosRSet.Open "DREPORT", dosConn, adOpenStatic, adLockOptimistic, adCmdTable
winRSet.Open "WREPORT", winConn, adOpenStatic, adLockOptimistic, adCmdTable

For i = 1 To 5
    dosRSet.AddNew: winRSet.AddNew
    dosRSet("LCODE") = "код" & CStr(i): winRSet("LCODE") = "код" & CStr(i)
    dosRSet("SECTION") = "шт": winRSet("SECTION") = "шт"
    dosRSet("KOL") = i * 10: winRSet("KOL") = i * 10
    dosRSet("SUM") = i * 10.5: winRSet("SUM") = i * 10.5
    dosRSet("EI") = "кор": winRSet("EI") = "кор"
Next
dosRSet.Update: winRSet.Update
Автор: unit4
Дата сообщения: 24.10.2011 07:15
AndVGri
А должны ли поля таблиц по типу dbf с полям БД в которую втягиваются данные совпадать? Или опять же, все зависит от прослойки, сможет ли она правильно их обработать?
Автор: AndVGri
Дата сообщения: 24.10.2011 07:35
unit4
Это уже зависит от прослойки. Есть ли возможность сопоставления полей или порядок полей в таблице или что-то другое... Конкретные требования к этим таблицам нужно узнать у конечных пользователей.
Автор: unit4
Дата сообщения: 24.10.2011 10:01
AndVGri
Прослойка дурацкая, потому что оказывается все параметры необходимо было передавать в char)))) Но вот с единицами измерения, те что "кор", я так и не смог совладать, не видит она их правильно и все((
Автор: AndVGri
Дата сообщения: 24.10.2011 10:32
unit4
Так образец того, что видит нормально можно получить?
Автор: unit4
Дата сообщения: 25.10.2011 04:58
AndVGri
Прошу прощения, что так долго, работы много.
Тут
Автор: AndVGri
Дата сообщения: 25.10.2011 07:27
unit4
Может на e-mail (есть в профиле) а то

Цитата:

Содержимое данного сайта заблокировано для просмотра в сети.
Скорее всего этот сайт содержит материалы, которые Вам не нужны для выполнения Ваших должностных обязанностей, но которые сильно загружают канал в интернет и мешают работе других сотрудников.
Автор: unit4
Дата сообщения: 25.10.2011 07:43
AndVGri
))) ваш админ молоец)))
Автор: AndVGri
Дата сообщения: 25.10.2011 08:56
unit4
По моему, я уже советовал воспользоваться xbaseview (как плагин к Total commander, так и отдельная программа).
[more=Вот что получается]

Код:
Option Explicit
Const adModeReadWrite = 3, adTypeText = 2
Const WinCharset = "Windows-1251", DosCharset = "cp866"
Const adUseClient = 3, adOpenStatic = 3
Const adCmdTable = 2, adLockOptimistic = 3

Dim pStream, pConn, pRSet, i

Set pStream = CreateObject("ADODB.Stream")
pStream.Type = adTypeText: pStream.Mode = adModeReadWrite

Set pConn = CreateObject("ADODB.Connection")
pConn.Open "Provider=VFPOLEDB.1;Data Source='c:\temp\';Collate=russian;Codepage=866"
pConn.Execute "Create Table REPORT (LCODE char(8), [SUM] NUMERIC(20,0), KOL char(16), [SECTION] char(3), EI char(5))"

Set pRSet = CreateObject("ADODB.Recordset")
pRSet.CursorLocation = adUseClient
pRSet.Open "REPORT", pConn, adOpenStatic, adLockOptimistic, adCmdTable

For i = 1 To 5
    pRSet.AddNew
    pRSet("LCODE")= CStr(i)
    pRSet("SUM") = 20 * i + 1
    pRSet("KOL") = CStr(10 * i + 1)
    pRSet("SECTION") = FromWinToDos("кор")
    pRSet("EI") = FromWinToDos("шт")
Next
pRSet.Update
Public Function FromWinToDos(byval thisStr)
pStream.Open: pStream.Charset = DosCharset
pStream.WriteText thisStr
pStream.Position = 0: pStream.Charset = WinCharset
FromWinToDos = pStream.ReadText: pStream.Close
End Function
Автор: Olive77
Дата сообщения: 25.10.2011 15:08
All
кому-нибудь попадалось, как можно скопировать текст из окна командной строки?

P.S.: команда выполняется при помоши Shell().

Добавлено:
- > http://www.vistax64.com/vb-script/201476-wscript-shell-echo-command.html
Автор: AndVGri
Дата сообщения: 26.10.2011 01:50
Olive77
А чего ж в Excel VBA? Вопрос скорее к Программирование "удобняшек" на VBScript
По существу: получение вывода программы в командную строку

Код:
Option Explicit
Dim sCommand
Dim pShell, pExec, pStream

sCommand = "cmd /c help"
Set pShell = CreateObject("WScript.Shell")
Set pExec = pShell.Exec(sCommand)
Set pStream = pExec.StdOut
WScript.Echo pStream.ReadAll
Автор: VictorKos
Дата сообщения: 26.10.2011 16:45
Olive77

Цитата:
кому-нибудь попадалось, как можно скопировать текст из окна командной строки?

Если я правильно понял:
Щёлкнуть левый верхний угол окна и выбрать в появившемся меню "Свойства".
В открывшемся окне, вкладка "Общие", установить галку в пункте "Выделение мышью", нажать ОК.
Теперь любой текст в окне можно выделить с зажатой левой кнопкой мыши.
Щелчок правой кнопки мыши по выделенному тексту скопирует выделенный текст в буфер обмена.
Если нужно вставить скопированный текст в позицию ввода, нужно снова щелкнуть правой кнопкой мыши.
Автор: unit4
Дата сообщения: 27.10.2011 12:55
Всем здрасте. У меня горе В общем я что то запутался в синтаксисе. Вот [more=тут]

Код:
If rec1.EOF Then
i = i + 1
.Cells(i, 1) = rec!sklad
.Cells(i, 2) = rec!skln_cd
.Cells(i, 3) = TD(ddd1)
.Cells(i, 4) = 0
If rec!skldcs_SumExt <> 0 And rec!bonus = 1 Then .Cells(i, 5) = 0
ElseIf rec!skldcs_SumExt = 0 And rec!bonus = 1 Then .Cells(i, 5) = -1
.Cells(i, 6) = 0
.Cells(i, 7) = qtn
.Cells(i, 8) = 0
.Cells(i, 9) = 0
.Cells(i, 10) = qtn
.Cells(i, 11) = smn
.Cells(i, 12) = 0
.Cells(i, 13) = 0
.Cells(i, 14) = smn
Else
If ddd1 <> rec1!dat Then
i = i + 1
.Cells(i, 1) = rec!sklad
.Cells(i, 2) = rec!skln_cd
.Cells(i, 3) = TD(ddd1)
.Cells(i, 4) = 0
If rec!skldcs_SumExt <> 0 And rec!bonus = 1 Then .Cells(i, 5) = 0
ElseIf rec!skldcs_SumExt = 0 And rec!bonus = 1 Then .Cells(i, 5) = -1

.Cells(i, 6) = 0
.Cells(i, 7) = qtn
.Cells(i, 8) = 0
.Cells(i, 9) = 0
.Cells(i, 10) = qtn
.Cells(i, 11) = smn
.Cells(i, 12) = 0
.Cells(i, 13) = 0
.Cells(i, 14) = smn
Else
i = i + 1
.Cells(i, 1) = rec!sklad
.Cells(i, 2) = rec!skln_cd
.Cells(i, 3) = TD(rec1!dat)
.Cells(i, 4) = 0
If (rec!skldcs_SumExt <> 0) And (rec!bonus = 1) Then .Cells(i, 5) = 0
ElseIf (rec!skldcs_SumExt = 0) And (rec!bonus = 1) Then .Cells(i, 5) = -1
.Cells(i, 6) = 0
.Cells(i, 7) = qtn
.Cells(i, 8) = rec1!prih
.Cells(i, 9) = rec1!rash
qtn = qtn + rec1!prih - rec1!rash
.Cells(i, 10) = qtn
.Cells(i, 11) = smn
.Cells(i, 12) = rec1!prih * rec!sklkrt_cn
.Cells(i, 13) = rec1!rash * rec!sklkrt_cn
smn = qtn * rec!sklkrt_cn
.Cells(i, 14) = smn
rec1.MoveNext
End If
End If
Автор: kandi
Дата сообщения: 27.10.2011 15:18
Здравствуйте. Такая задача. Есть MultiPage форма для работы с базой данных Excel. На форме есть TextBox, ComboBox, CheckBox и управляющие кнопки (в общей сложности 160 контролов). Как отследить изменение TextBox (всех, кроме двух), всех ComboBox и CheckBox для выдачи уведомления пользователю?
Автор: grbdv
Дата сообщения: 27.10.2011 16:10
kandi

Цитата:
Как отследить изменение TextBox (всех, кроме двух), всех ComboBox и CheckBox для выдачи уведомления пользователю?

Через события контролов. Сравнить предыдущее значение с новым.

Если имелось ввиду - "Есть ли событие формы, реагирующее на изменение контролов и передающее кто, где и как изменился, и избежать 160-и индивидуальных процедур?", то не знаю. Может кто подскажет.

А по-простому - создать единую процедуру выдачи уведомления (через специальную форму ли, через MsgBox ли), которая будет вызываться из выбраннного (ключевого) события каждого контрола (160-2 процедур). В нее передавать все, о чем надо информировать юзера - имя контрола, значение, предыдущее значение etc. Если уведомления различаются - передавать тип требуемого уведомления. Как-то так...

Если это не просто уведомление - констатация факта, а требуется интерактив, то это будет ужЕ ф-ция, возвращающая нечто в вызвавшую.
Автор: kandi
Дата сообщения: 27.10.2011 16:30
Конкретные контролы не интересуют, это не имеет значения. Важен лишь факт, что данные хотя бы одного поля на форме были реально изменены. Если, для примера, пользователь изменил значение текстового поля с "Иванов" на "Петров", затем передумал и вернул Иванова назад - это не есть изменение. Когда пользователь "наиграется" с формой и захочет перейти к следующей (предыдущей) записи, закрыть форму и т.д. нужно выдать уведомление о необходимости сохранения записи только в случае реального изменения данных.
Если способ, чтобы не писать 160 отдельных процедур?
Автор: grbdv
Дата сообщения: 27.10.2011 17:04
kandi
Получается, что речь тогда идет не о контролах и контроле за ними (сорри, твт) на таком низком уровне, а о СУБД.

Если упрощенно, то текущему состоянию контролов соответствует некая запись в БД. После "поиграться" и нажатия ОК, надо или обновить эту запись (или занести новую), если возникшее после "игры" новое сочетание контролов признано легитимным или отказаться от этого.

Для этого и существуют СУБД, там есть встроенные механизмы, которые можно дополнить своими проверками. Но, Ексель, это не СУБД. Легитимность придется проверять вручную и, опять же, поэлементно - где-то запоминать состояние каждого до начала "игры" и сравнивать с после.

Контролы-то берут ведь откуда-то свои начальные значения... Термин "запись" прозвучал. Можно новое (пусть оно, фактически, и не новое) сочетание писать куда-то в служебную, врЕменную запись и сравнивать ужЕ записи - тогда уйдем от контролов (очень уж низкий уровень) и будем оперировать стандартными элементами - ячейками. Это ужЕ легче. Циклом по ячейкам в строке. Одна процедура, после нажатия ОК.

Целую лекцию сваял ради последнего абзаца :)
Автор: kandi
Дата сообщения: 27.10.2011 18:24
grbdv
Спасибо за участие. Вариант с ячейками рассматривал, но решил оставить реализацию на последок, если не найдется ничего более элегантного.
Автор: grbdv
Дата сообщения: 27.10.2011 19:39
kandi
Не за что.

Я не настаиваю (просто не вижу принципиально иного варианта), но, куда уж элегантнее? 1 vs 160, не зависим от типов данных, имен контролов, удобство считывания простым перебором etc. etc. - вобщем, даже не то что "элегантно", а хай лакшери фэшн :)

Да и, с другой стороны, СУБД в Екселе - это как мышь в ... хм... оригинально, вобщем :) Тут хотя бы просто манишечку под пиджаком с чужого плеча подгладить - и уже будет элегантно :) Подводных камней в подобной реализации - множество. Не завидую, если честно... Ведь, данный подход, по сути - костыль, а костыль может быть элегантен лишь по сравнению с другим костылем. В своем классе :)


Добавлено:
kandi
Но если что-то изящное и проклюнется - не сочти за труд, дай знать. Тоже ведь - заколебывают эти интерфейсные решения, обвязка эта вся...
Автор: Olive77
Дата сообщения: 27.10.2011 21:49
AndVGri
VictorKos

Цитата:
- > http://www.vistax64.com/vb-script/201476-wscript-shell-echo-command.html

да я, вобщем-то, пока ждал, сам нашел ответ , пусть и не самый элегантный.


Цитата:
А чего ж в Excel VBA?

по причине обработки большого количества файлов (писал макрос по определению какие пдф-ки не содержат распозного текста)



Автор: AndVGri
Дата сообщения: 28.10.2011 02:05
kandi
[more=Вот для примера с TextBox]

Код:
'Создаём класс с содержимым
Option Explicit
Private pTextbox As MSForms.TextBox
Private TextboxValue As String

Public Sub Init(ByVal withText As MSForms.TextBox)
Set ptexbox = withtextbox
TextboxValue = pTextbox.Value
End Sub

Public Function Changed() As Boolean
Changed = VBA.StrComp(TextboxValue, pTextbox.Value, VbCompareMethod.vbTextCompare) = 0
End Function

Public Function OldValue() As String
OldValue = TextboxValue
End Function

Public Function NewValue() As String
NewValue = pTextbox.Value
End Function

Public Function Name() As String
Name = pTextbox.Name
End Function

'Где-то в коде формы или где-то ещё есть процедура инициализации записи.
'Установка элементов управления в соответствии с записью
Option Explicit
Private TextBoxCollection As VBA.Collection
Private Sub Инициализация_записи()
Dim pControl As MSForms.Control
Dim nextInfo As TextBoxInfo
'.... код ввода данных в элементы управления
TextBoxCollection = New VBA.Collection
For Each pControl In Me.Controls
If TypeOf pControl Is MSForms.TextBox Then
Set nextTextbox = New TextBoxInfo
nextInfo.Init pControl
TextBoxCollection.Add nextInfo
End If
Next pControl
End Sub

'Где-то в коде есть процедура проверки элементов управления на изменения,
'внесённые пользователем
Private Sub Проверка_изменения()
Dim nextInfo As TextBoxInfo
'.... какие-то ещё проверки
For Each nextInfo In TextBoxCollection
If nextInfo.Changed Then
MsgBox "Изменено с " & nextInfo.OldValue & " на " & nextInfo.NewValue, VbMsgBoxStyle.vbOKOnly + VbMsgBoxStyle.vbInformation, nextInfo.Name
End If
Next nextInfo
End Sub

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127

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


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