Помогите пожалуйста:
выделить именованный диапазон и удалить в нем значения ячеек. 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
при разработке своего приложения в Excel, хотелось бы скрыть свой код от посторонних глаз, т.е. мои макросы может изменить, переписать - практически любой человек.
в Excel есть защита от их просмотра, но эти пароли снимаются за 1 секунду. Т.е. защиты практически никакой.
Так вот, я пытаюсь весь код из Excel'я переписать в DLL на PB.
Столкнулся с такой проблемой:
не получается выделить диапазон на листе Excel'я и удалить в нем данные.(нужно написать это дело на PB и из Excel'я вызывать). Мой код (см. выше) не работает, просто проскакивает
Вообще тут спецов по COM'у нету, но я тебе уделил время специально чтобы показать что подсматривая в примеры в папке \SAMPLES и читая документацию экселя можно самому во всём разобраться. Где-то прийдётся додумывать, но если ты хороший специалист по VBA (а не такой средненький как я), то это труда не составит.
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
 ispErr ObjResult,Err
End If
End Sub
Вызов из VBA
Private Declare Sub SelRange Lib "C:\PBWin80\Samples\pbdll.dll" ()
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. Верно?
Опять дело встало...
т.е. есть диапазон vRange и нужно, допустим, верхнюю границу сделать толстой линией. Меня смущает, что везде GET (см. ниже), а у меня компилятор только на LET не ругается. В трех соснах запутался...
Мой код (который проскакивает):
LET vVnt1 = %xlEdgeTop
LET vVnt = %xlThick
OBJECT [B]LET!!!![/B] oExcelWorkSheet.Range(vRange).Borders.Item(vVnt1)= vVnt
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
' ...
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
 ispErr ObjResult,Err
End If
Делается это довольно просто. Для человека, который до сих пор сам во всём разбирался, несостоятельность в таком вопросе выглядит несколько странной. Признайся, поленился ведь, а?
Этот фрагмент создаёт бордюр в выделении и перекрашивает нижнюю полоску в красный цвет.
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
 ispErr 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
 ispErr ObjResult,Err
End If
Извините, что надоедаю, но больше спрашивать негде...
этот код работает, если окно 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
 ispErr ObjResult,Err
End If