Команды из файла

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 07.08.2006 (Пн) 15:18

Конь писал(а):Мда, возвращаемся к этой теме.
Задача, конечно, решена, но вопрос не закрыт.
Если у меня есть файл с VB-кодом, можно этот код выполнить?
Да в принципе можно. Даже не очень сложно. Ставишь себе VBA SDK, интегрируешь в свой проект, внимательно его изучаешь. Далее поднимаешь поиск по темам "как добавить код в модуль экселя" - очень похоже - добавляешь и выполняешь этот код.
Лучший способ понять что-то самому — объяснить это другому.

zHackLeX
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 23.10.2003 (Чт) 21:08

Сообщение zHackLeX » 08.08.2006 (Вт) 8:41

Ну, ещё можно частный случай рассмотреть (поскольку в примере только присвоения) - переместить все переменные в модуль формы, сделать их Public, потом через CallByName(Form1,Var,vbLet,Value) всё разрешить... можно даже дальше уйти в извращениях :) - передать после этого форму-объект в MS ScriptControl с установленным AddMembers=True, и потом можно весь файл запросто построчно выполнить... Короче перевести код можно. Оговорюсь, не весь.
Просто был уже такой подход у меня... в ~страницу кода уложилась поддержка скинов для проги - типа winamp'a
There is no knowledge that is not power...

X,C,A,B,C,Z,X,A,B,C,Z....
Многие ли помнят? :)

AntonGV
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 24.05.2006 (Ср) 12:10
Откуда: г. Пермь

Сообщение AntonGV » 09.08.2006 (Ср) 16:13

можно использовать API фyнкцию EbExecuteLine. Фyнкция не докyментиpована и опиcания я так и не нашел.

Hа фоpме: кнопка cmdRun и теcкcтовое поле txtCode
вот код формы:
Код: Выделить всё
Private Sub cmdRun_Click()
    If Len(txtCode.TEXT) <> 0 Then
    Dim Result As Boolean, Code As String
    Code = txtCode.TEXT

    Code = Replace(Code, vbCrLf, ":") ', , , 2)
    'Code = Replace(Code, "Если", "If", , , 2)
    'Code = Replace(Code, "Тогда", "Then", , , 2)
    'Code = Replace(Code, "Сообщ", "MsgBox", , , 2)
    'Code = Replace(Code, "От", "For", , , 2)
    'Code = Replace(Code, "До", "To", , , 2)
    'Code = Replace(Code, "Следyющ", "Next", , , 2)

    Result = FExecuteCode(Code, False)
    If Result = False Then MsgBox "Ошибка в синтаксисе пpогpаммы!", vbCritical
        txtCode.SetFocus
    Else
        MsgBox "Поле ввода кода не должно быть пyстой стpокой!", vbCritical
    End If
End Sub

А вот код модуля:
Код: Выделить всё
'------------------------------------------
'   (c) 1999 Trigeminal Software, Inc.  All Rights Reserved
'------------------------------------------
Option Compare Text
Option Explicit

'For VB6 IDE
Private Declare Function EbExecuteLine Lib "vba6.dll" _
  (ByVal pStringToExec As Long, ByVal Foo1 As Long, _
  ByVal Foo2 As Long, ByVal fCheckOnly As Long) As Long

' For VB5 IDE
'Declare Function EbExecuteLine Lib "vba5.dll" _
' (ByVal pStringToExec As Long, ByVal Foo1 As Long, _
'  ByVal Foo2 As Long, ByVal fCheckOnly As Long) As Long

' FOR Access 97/VBE.dll clients like Word 97 and Excel 97
'Declare Function EbExecuteLine Lib "vba332.dll" _
' (ByVal pStringToExec As Long, ByVal Foo1 As Long, _
'  ByVal Foo2 As Long, ByVal fCheckOnly As Long) As Long

Function FExecuteCode(stCode As String, Optional fCheckOnly As Boolean) As Boolean
    FExecuteCode = EbExecuteLine(StrPtr(stCode), 0&, 0&, Abs(fCheckOnly)) = 0
End Function

' Замена в TEXT значений A на B
Function Replace(TEXT As String, A As String, B As String) As String
    Dim p, t1, t2

    p = InStr(TEXT, A)
    While p > 0
        t1 = Left(TEXT, p - 1)
        t2 = Mid(TEXT, p + Len(A))
        TEXT = t1 + B + t2
        p = InStr(p + 1, TEXT, A)
    Wend
    Replace = TEXT
End Function
Последний раз редактировалось AntonGV 09.08.2006 (Ср) 16:31, всего редактировалось 1 раз.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 09.08.2006 (Ср) 16:18

не морочь человеку голову - этот код будет работать на компе, где установлен сам бейсик

AntonGV
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 24.05.2006 (Ср) 12:10
Откуда: г. Пермь

Сообщение AntonGV » 09.08.2006 (Ср) 16:24

ну или придется таскать за программой библиотеку vba6.dll

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 09.08.2006 (Ср) 16:31

AntonGV, EbExecuteLine не работает в скомпилированном коде. Можешь проверить.
Изображение

AntonGV
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 24.05.2006 (Ср) 12:10
Откуда: г. Пермь

Сообщение AntonGV » 09.08.2006 (Ср) 16:40

Точно, я запускал только в проекте :cry:

Пред.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 78

    TopList