Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Power Basic

Страница: 1 | 2 |

 

  Вопрос: Excel и PowerBasic Добавлено: 21.08.06 12:53  

Автор вопроса:  poiskxxx
Здравствуйте.

Помогите пожалуйста:
выделить именованный диапазон и удалить в нем значения ячеек. Excel уже открыт, и листы добавлять не надо.

Функции из dll, я научился вызывать, а вот процедуры никак.
Option Explicit
Private Declare Function del_cena Lib "c:\_power basic\_proekt\kol.dll" () As String

Sub fhh()
Call del_cena
End Sub




#COMPILE DLL
#DIM ALL
#INCLUDE "WIN32API.INC"
#INCLUDE "ExcelApp.inc"


FUNCTION del_cena ALIAS "del_cena"() EXPORT AS STRING
     ' Object Variables
    DIM oExcelApp       AS ExcelApplication
    DIM oExcelWorkbook  AS ExcelWorkbook
    DIM oExcelWorkSheet AS ExcelWorkSheet
    DIM oExcelChart     AS ExcelChart

    ' General Object param variables
    DIM vBool           AS VARIANT
    DIM vVnt            AS VARIANT
    DIM oVnt            AS VARIANT
    DIM vText           AS VARIANT
    DIM vRange          AS VARIANT
    DIM vX              AS VARIANT
    DIM vY              AS VARIANT
    DIM a()             AS STRING
    DIM b()             AS CURRENCY
    DIM y               AS LONG

    ' Chart Object param variables
    DIM vGallery        AS VARIANT
    DIM vFormat         AS VARIANT
    DIM vPlotBy         AS VARIANT
    DIM vCatLabels      AS VARIANT
    DIM vSerLabels      AS VARIANT
    DIM vHasLegend      AS VARIANT
    DIM vTitle          AS VARIANT

    ' SaveAs Object param variables
    DIM vFile           AS VARIANT
    DIM vFileFmt        AS VARIANT


SET oExcelApp = ExcelApplication IN $PROGID_ExcelApplication8

    OBJECT CALL oExcelApp.WorkBooks TO oVnt

    SET oExcelWorkbook = oVnt

        OBJECT CALL oExcelWorkBook.WorkSheets TO oVnt

        SET oExcelWorkSheet = oVnt

 MSGBOX("6")
 LET vRange = "отобр_цены_все"
    OBJECT CALL oExcelWorkSheet.Range(vRange).SELECT
 

'OBJECT CALL oExcelWorkbook.WorkSheets("ОТЧЕТ").SELECT TO oVnt


'LET vRange = "отобр_цены_все"
'OBJECT CALL oExcelWorkSheet.Range(vRange).ClearContents



SET oExcelApp       = NOTHING
SET oExcelWorkbook  = NOTHING
SET oExcelWorkSheet = NOTHING
SET oExcelChart     = NOTHING
END FUNCTION

Ответить

  Ответы Всего ответов: 16  

Номер ответа: 1
Автор ответа:
 alex



Вопросов: 84
Ответов: 453
 Профиль | | #1 Добавлено: 21.08.06 13:18
Вопрос не ясен. Тебе нужна помощь по Excel или PowerBasic?

Ответить

Номер ответа: 2
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #2
Добавлено: 21.08.06 17:07
Если неправильно понял - звыняй. Рассказ у тебя какой-то несвязный.

Следующий код вызвает из Excel VBA функцию из библиотеки, созданной в PB8.
PB
#Compile Dll "pbdll.dll"

#Include "WIN32API.INC"

Function PBLibMain()
 Function = 1
End Function

Function PbStr Alias "PbStr";() Export As String
 Function = "Hello from PB/DLL!"
End Function


VBA
Private Declare Function PbStr Lib "C:\PBWin80\Bin\pbdll.dll" () As String

Private Sub Workbook_Open()
 MsgBox PbStr()
End Sub

Ответить

Номер ответа: 3
Автор ответа:
 poiskxxx



Вопросов: 2
Ответов: 9
 Профиль | | #3 Добавлено: 22.08.06 11:27
Это я умею (насчет функций).

Попробую сформулировать свой вопрос точнее:

при разработке своего приложения в Excel, хотелось бы скрыть свой код от посторонних глаз, т.е. мои макросы может изменить, переписать - практически любой человек.
в Excel есть защита от их просмотра, но эти пароли снимаются за 1 секунду. Т.е. защиты практически никакой.
Так вот, я пытаюсь весь код из Excel'я переписать в DLL на PB.
Столкнулся с такой проблемой:
не получается выделить диапазон на листе Excel'я и удалить в нем данные.(нужно написать это дело на PB и из Excel'я вызывать). Мой код (см. выше) не работает, просто проскакивает

Ответить

Номер ответа: 4
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #4
Добавлено: 23.08.06 20:35
 Вообще тут спецов по COM'у нету, но я тебе уделил время специально чтобы показать что подсматривая в примеры в папке \SAMPLES и читая документацию экселя можно самому во всём разобраться. Где-то прийдётся додумывать, но если ты хороший специалист по VBA (а не такой средненький как я), то это труда не составит.

PB/WIN 8
#Compile Dll "pbdll.dll"

#Include "WIN32API.INC"
#Include "C:\PBWin80\Samples\COM\Excel\ExcelApp.inc"

Function PBLibMain()
 Function = 1
End Function

Sub DispErr(ByVal ComErr As Long, Optional ByVal ApiErr As Long)
   Dim strz_ComErr As Asciiz * 1024
   Dim strApiErr As String
   
   If ComErr Then
      Call FormatMessage(%FORMAT_MESSAGE_FROM_SYSTEM, _
        ByVal 0&, ObjResult, ByVal MAKELANGID( _
        %LANG_NEUTRAL, %SUBLANG_DEFAULT), _
        strz_ComErr, SizeOf(strz_ComErr), ByVal 0&;)
   End If
   If ApiErr Then
      strApiErr=Error$(ApiErr)
   End If
   
   MsgBox strz_ComErr,16,strApiErr
End Sub

Sub SelRange Alias "SelRange" () Export
    Dim vBool As Variant
    Dim oVnt     As Variant
    Dim vRange As Variant

    Dim oExcelApp       As ExcelApplication
    Dim oExcelWorkbook  As ExcelWorkbook
    Dim oExcelWorkSheet As ExcelWorkSheet
    Dim sProgID_Excel   As String

    sProgID_Excel = ProgId$(ClsId$("Excel.Application";))
    If Len(sProgID_Excel) = 0 Then sProgID_Excel = "Excel.Application"
    oExcelApp = ExcelApplication In sProgID_Excel
    If IsFalse IsObject(oExcelApp) Then _
        oExcelApp = New ExcelApplication In sProgID_Excel
        
    Let vBool = 1
    Object Let oExcelApp.Visible = vBool

    'Object Call oExcelApp.WorkBooks.ADD To oVnt
    'Object Get oExcelApp.ThisWorkbook To oVnt
    'oExcelWorkbook = oVnt

    'Object Call oExcelWorkBook.WorkSheets.ADD To oVnt
    Object Get oExcelApp.ThisWorkbook.ActiveSheet To oVnt
    oExcelWorkSheet = oVnt

    Let vRange = "A1:C3"

    Object Call oExcelWorkSheet.Range(vRange).Select

    If ObjResult Or Err Then
      ;DispErr ObjResult,Err
    End If
End Sub


Вызов из VBA
Private Declare Sub SelRange Lib "C:\PBWin80\Samples\pbdll.dll" ()

Sub Macro1()
 SelRange
End Sub

Ответить

Номер ответа: 5
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #5
Добавлено: 24.08.06 12:47
Вообще тут спецов по COM'у нету

А как же LamerOnLine?

Ответить

Номер ответа: 6
Автор ответа:
 alex



Вопросов: 84
Ответов: 453
 Профиль | | #6 Добавлено: 24.08.06 13:03
poiskxxx - чтобы скрыть логику работы, выноси вычислительные функции в DLL файл, а операции на подобие выделения диапазона оставь в VBA коде

Ответить

Номер ответа: 7
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #7
Добавлено: 24.08.06 16:36
Sharp,
 "тут" - это значит в форуме PowerBasic, а не во всём vbnet.ru/forum/. :)

Ответить

Номер ответа: 8
Автор ответа:
 poiskxxx



Вопросов: 2
Ответов: 9
 Профиль | | #8 Добавлено: 28.08.06 11:14
 CyRax - спасибо большое за ответ!


Object Get oExcelApp.ThisWorkbook.ActiveSheet To oVnt
oExcelWorkSheet = oVnt

В принципе я сам уже разобрался (путаница у меня была с GET, SET, LET....) Все равно - СПАСИБО.

Теперь воюю вот с этим:
допустим:
на PowerBasic

LET vVnt = %xlMedium ' Medium density border
OBJECT CALL oExcelWorkSheet.Range(vRange).BorderAround(Weight = vVnt)


на VBA (Excel)
Range("H7";).Select
    With Selection.Borders(xlEdgeLeft)
        .LineStyle = xlContinuous
        .Weight = xlMedium
        .ColorIndex = xlAutomatic
    End With
    With Selection.Borders(xlEdgeTop)
        .LineStyle = xlContinuous
        .Weight = xlMedium
        .ColorIndex = xlAutomatic
    End With
    With Selection.Borders(xlEdgeBottom)
        .LineStyle = xlContinuous
        .Weight = xlMedium
        .ColorIndex = xlAutomatic
    End With
    With Selection.Borders(xlEdgeRight)
        .LineStyle = xlContinuous
        .Weight = xlMedium
        .ColorIndex = xlAutomatic
    End With


В справке по PowerBasic нет ни про %xlMedium, ни про BorderAround (выводит все тот же единственный пример который в папке \SAMPLES). :(
 
Вот думаю искать про все это в ExcelApp.inc. Верно?

Ответить

Номер ответа: 9
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #9
Добавлено: 29.08.06 14:51
Ну если в предыдущем сам разобрался, то и в этом разобраться думаю особого труда не составит.

Ответить

Номер ответа: 10
Автор ответа:
 poiskxxx



Вопросов: 2
Ответов: 9
 Профиль | | #10 Добавлено: 29.08.06 15:48
Опять дело встало...
т.е. есть диапазон vRange и нужно, допустим, верхнюю границу сделать толстой линией. Меня смущает, что везде GET (см. ниже), а у меня компилятор только на LET не ругается. В трех соснах запутался...

Мой код (который проскакивает):
  
LET vVnt1 = %xlEdgeTop
LET vVnt =  %xlThick
OBJECT [B]LET!!!![/B] oExcelWorkSheet.Range(vRange).Borders.Item(vVnt1)= vVnt



Это из файла ExcelApp.inc

'Enumeration XlBordersIndex
%xlInsideHorizontal = &HC
%xlInsideVertical = &HB
%xlDiagonalDown = &H5
%xlDiagonalUp = &H6
%xlEdgeBottom = &H9
%xlEdgeLeft = &H7
%xlEdgeRight = &HA
%xlEdgeTop = &H8

'Enumeration XlBorderWeight
%xlHairline = &H1
%xlMedium = &HFFFFEFD6
%xlThick = &H4
%xlThin = &H2

INTERFACE DISPATCH ExcelBorders
........
MEMBER GET Item<&HAA>;(IN Index AS %XlBordersIndex<&H0>;) AS ExcelBorder
MEMBER GET Weight<&H78>;() AS VARIANT
MEMBER LET Weight<&H78>;() 'Parameter Type As Variant
........
END INTERFACE


INTERFACE DISPATCH ExcelRange
......
MEMBER GET Borders<&H1B3>;() AS ExcelBorders
......
END INTERFACE


Ответить

Номер ответа: 11
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #11
Добавлено: 30.08.06 12:12
Ну вот так обводит выделение чёрной рамкой.
' ...
    Dim V1 As Variant, V2 As Variant
    Let V1=%xlContinuous
    Let V2=%xlThick
    Object Call oExcelWorkSheet.Range(vRange).BorderAround(V1,V2)
    If ObjResult Or Err Then
      ;DispErr ObjResult,Err
    End If

 Или где у тебя не получается?

Ответить

Номер ответа: 12
Автор ответа:
 poiskxxx



Вопросов: 2
Ответов: 9
 Профиль | | #12 Добавлено: 31.08.06 11:58
Как обвести выделение черной рамкой я умел.
А мне надо, например:
верхнюю часть диапазона выделить толстой линией
нижнюю - тонкой
боковую правую - точечной линией
боковую левую - ....

Вот это у меня никак не получается.

Ответить

Номер ответа: 13
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #13
Добавлено: 03.09.06 11:02
Делается это довольно просто. Для человека, который до сих пор сам во всём разбирался, несостоятельность в таком вопросе выглядит несколько странной. Признайся, поленился ведь, а?

Этот фрагмент создаёт бордюр в выделении и перекрашивает нижнюю полоску в красный цвет.
Dim V1 As Variant, V2 As Variant
    Let V1=%xlContinuous
    Let V2=%xlThick
    Object Call oExcelWorkSheet.Range(vRange).BorderAround(V1,V2)
    If ObjResult Or Err Then
      ;DispErr ObjResult,Err
    End If
    Let V1=%xlEdgeBottom: Let V2=RGB(255,0,0)
    Object Let oExcelWorkSheet.Range(vRange).Borders(V1).Color=V2
    If ObjResult Or Err Then
      ;DispErr ObjResult,Err
    End If

Ответить

Номер ответа: 14
Автор ответа:
 poiskxxx



Вопросов: 2
Ответов: 9
 Профиль | | #14 Добавлено: 04.09.06 12:12
Не ленился я. Просто не так делал

Мой код (который проскакивает):
LET vVnt1 = %xlEdgeTop
LET vVnt = %xlThick
OBJECT LET oExcelWorkSheet.Range(vRange).Borders.Item(vVnt1)= vVnt

Ответить

Номер ответа: 15
Автор ответа:
 poiskxxx



Вопросов: 2
Ответов: 9
 Профиль | | #15 Добавлено: 12.09.06 12:24
Извините, что надоедаю, но больше спрашивать негде...

этот код работает, если окно Excel не активно.
если запускать прямо из VBA-редактора, то он выделяет эту область. Все нормально.
Пробовал так: на листе кнопка вызывает форму и кнопкой с формы вызывается эта процедура. все равно пишет ошибку.

  
sProgID_Excel = PROGID$(CLSID$("Excel.Application";))
   IF LEN(sProgID_Excel) = 0 THEN sProgID_Excel = "Excel.Application"
   SET oExcelApp = ExcelApplication IN sProgID_Excel
   IF ISFALSE ISOBJECT(oExcelApp) THEN _
   SET oExcelApp = NEW ExcelApplication IN sProgID_Excel    
   LET  oVnt="отобр_цены_все"
   OBJECT CALL oExcelApp.Goto(Reference=oVnt)
    If ObjResult Or Err Then
      ;DispErr ObjResult,Err
    End If

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам