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

» Excel VBA (часть 2)

Автор: Pravoved90
Дата сообщения: 12.09.2008 13:25
OJIR
Большое спасибо за ответ. А как сделать обратное действо. То есть мне надо, что то вроде: Если в ячейке D1 не написано "счастье", то обратить предыдущий макрос(то есть результаты копирования исчезли). Или же нужно писать отдельный макрос по удалению и с условием если "в D1 не написано "счастье"(если да - то как правильно записать это самое "не написано")? Подскажите наиболее простой вариант. Спасибо

Добавлено:
OJIR

Цитата:
if Range("D1").Value="cчастье" then
имя_макроса
End if

А куда и с чем это записывать? Пишу в редактор VB на нужную книгу - не работает. В то же время, как вариант добавил строчки(нада ли было?) и получил такое

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
if Range("D1").Value="cчастье" then
имя_макроса
End if
End Sub

Но тогда при вводе данных в ячейку, макрос начинает исполняться бесконечно. Что же делать?
Автор: gortol
Дата сообщения: 12.09.2008 15:06
может кто делал

уже назнаю где искать

хочу получить все открытые Excel файлы и их наборами workbook и worksheet

getobject(,"excel.application") - получает только активное приложение, те не подходит

видел где то что через объект ROT (Running Object Table) можно перебрать

сделал такое на vbscript

Код:
Dim WSHShell As Object
Dim objWMIService As Object
Dim colProcesses As Object

Set WSHShell = CreateObject("WScript.Shell")

objWMIService =CreateObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
            
colProcesses = objWMIService.ExecQuery("Select * from Win32_Process Where Name = 'Excel.exe'") 'получаю список всех процессов Excel

    For each objProcess in colProcesses
'objProcess.Properties_("Processid").Value - это число, номер процесса (например 700)
    Res = WshShell.AppActivate(objProcess.Properties_("Processid").Value) 'активирую окно
    'дальше затык, незнаю как получить объектную модель Excel (для перебора workbooks и worksheets) по номеру процесса или активному окну

    next    
Автор: MaximuS G
Дата сообщения: 12.09.2008 15:42
OJIR

Спасибо
Автор: gortol
Дата сообщения: 12.09.2008 15:59
вот нашёл такое и ОНО работает!!!!!!!!

в результате возвращается коллекция из запущенных объектов Excel, где можно перебрать каджый и в каждом перебрать workbooks итп...

но неужели нет проще чего нить?



пример вызывается процедурой Example()

PS код на VB6
PPS взято отсюда
очень полезный ресурс оказался


Код: Option Explicit

Private Declare Function GetRunningObjectTable Lib "ole32.dll" (ByVal dwReserved As Long, pROT As Long) As Long
Private Declare Function CreateBindCtx Lib "ole32.dll" (ByVal dwReserved As Long, pBindCtx As Long) As Long
Private Declare Sub CoTaskMemFree Lib "ole32.dll" (ByVal pv As Long)
Private Declare Sub OleInitialize Lib "ole32.dll" (pvReserved As Any)
Private Declare Sub OleUninitialize Lib "ole32.dll" ()
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, _
ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpDest As Any, lpSource As Any, ByVal cBytes As Long)
Private Declare Function PutMem2 Lib "msvbvm60" (ByVal pWORDDst As Long, ByVal NewValue As Long) As Long
Private Declare Function PutMem4 Lib "msvbvm60" (ByVal pDWORDDst As Long, ByVal NewValue As Long) As Long
Private Declare Function GetMem4 Lib "msvbvm60" (ByVal pDWORDSrc As Long, ByVal pDWORDDst As Long) As Long
Private Declare Function VarPtr Lib "msvbvm60" (var As Any) As Long
Private Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function CopyStringA Lib "kernel32" Alias "lstrcpyA" (ByVal NewString As String, ByVal OldString As Long) As Long
Private Declare Function lstrlenW Lib "kernel32" (ByVal lpString As Long) As Long
Private Declare Function lstrlenA Lib "kernel32" (ByVal lpString As Long) As Long
Private Declare Function WideCharToMultiByte Lib "kernel32" (ByVal codepage As Long, ByVal dwFlags As Long, _
lpWideCharStr As Any, ByVal cchWideChar As Long, lpMultiByteStr As Any, ByVal cchMultiByte As Long, _
ByVal lpDefaultChar As String, ByVal lpUsedDefaultChar As Long) As Long

Private Const GMEM_FIXED As Long = &H0
Private Const asmPUSH_imm32 As Byte = &H68
Private Const asmRET_imm16 As Byte = &HC2
Private Const asmRET_16 As Long = &H10C2&
Private Const asmCALL_rel32 As Byte = &HE8

'IUnknown vTable ordinals
Private Const unk_QueryInterface As Long = 0
Private Const unk_AddRef As Long = 1
Private Const unk_Release As Long = 2
Private Const vtbl_ROT_EnumRunning = 9
Private Const vtbl_EnumMoniker_Next = 3
Private Const vtbl_Moniker_GetDisplayName = 20

Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long

Sub Example()
Dim AllExcelApps As Collection, ExcelApp As Application, wb As Workbook, Pid As Long

Set AllExcelApps = GetAllInstances
If Not AllExcelApps Is Nothing Then
For Each ExcelApp In AllExcelApps
GetWindowThreadProcessId ExcelApp.hwnd, Pid
Debug.Print ExcelApp.Caption & ", Process ID = " & Pid
For Each wb In ExcelApp.Workbooks
Debug.Print " " & wb.Name
Next
Next
End If
End Sub


'Function to call Interface members by ordinal in VTable
Private Function CallInterface(ByVal pInterface As Long, ByVal FuncOrdinal As Long, _
ByVal ParamsCount As Long, Optional ByVal p1 As Long = 0, Optional ByVal p2 As Long = 0, _
Optional ByVal p3 As Long = 0, Optional ByVal p4 As Long = 0, Optional ByVal p5 As Long = 0, _
Optional ByVal p6 As Long = 0, Optional ByVal p7 As Long = 0, Optional ByVal p8 As Long = 0, _
Optional ByVal p9 As Long = 0, Optional ByVal p10 As Long = 0) As Long
Dim i As Long, t As Long
Dim hGlobal As Long, hGlobalOffset As Long

If ParamsCount < 0 Then Err.Raise 5 'invalid call
If pInterface = 0 Then Err.Raise 5

'5 bytes for each parameter
'5 bytes - PUSH this
'5 bytes - call member function
'3 bytes - ret 0x0010, pop CallWindowProc
'1 byte - dword align.

hGlobal = GlobalAlloc(GMEM_FIXED, 5 * ParamsCount + 5 + 5 + 3 + 1)
If hGlobal = 0 Then Err.Raise 7 'insuff. memory
hGlobalOffset = hGlobal

If ParamsCount > 0 Then
t = VarPtr(p1)
For i = ParamsCount - 1 To 0 Step -1
PutMem2 hGlobalOffset, asmPUSH_imm32
hGlobalOffset = hGlobalOffset + 1
GetMem4 t + i * 4, hGlobalOffset
hGlobalOffset = hGlobalOffset + 4
Next
End If

'First member of any interface - this. Assign...
PutMem2 hGlobalOffset, asmPUSH_imm32
hGlobalOffset = hGlobalOffset + 1
PutMem4 hGlobalOffset, pInterface
hGlobalOffset = hGlobalOffset + 4

'Call IFace Function by its ordinal
PutMem2 hGlobalOffset, asmCALL_rel32
hGlobalOffset = hGlobalOffset + 1

GetMem4 pInterface, VarPtr(t) 'dereference: find vTable
GetMem4 t + FuncOrdinal * 4, VarPtr(t) 'Function offset in vTable, dereference
PutMem4 hGlobalOffset, t - hGlobalOffset - 4
hGlobalOffset = hGlobalOffset + 4

'all interfaces are stdcall, so forget about stack clearing
PutMem4 hGlobalOffset, asmRET_16 'ret 0x0010

CallInterface = CallWindowProc(hGlobal, 0, 0, 0, 0)

GlobalFree hGlobal

End Function

Private Function StrFromPtrA(ByVal lpszA As Long, Optional nSize As Long = 0) As String
Dim s As String, bTrim As Boolean
If nSize = 0 Then
nSize = lstrlenA(lpszA)
bTrim = True
End If
s = String(nSize, Chr$(0))
CopyStringA s, ByVal lpszA
If bTrim Then s = TrimNULL(s)
StrFromPtrA = s
End Function

Private Function StrFromPtrW(ByVal lpszW As Long, Optional nSize As Long = 0) As String
Dim s As String, bTrim As Boolean
If nSize = 0 Then
nSize = lstrlenW(lpszW) * 2
bTrim = True
End If
s = String(nSize, Chr$(0))
' CopyMemory ByVal StrPtr(s), ByVal lpszW, nSize ' VBA doesn't support StrPtr
WideCharToMultiByte 0, &H0, ByVal lpszW, -1, ByVal s, Len(s), &H0, &H0
If bTrim Then s = TrimNULL(s)
StrFromPtrW = s
End Function

Private Function TrimNULL(ByVal str As String) As String
If InStr(str, Chr$(0)) > 0& Then
TrimNULL = Left$(str, InStr(str, Chr$(0)) - 1&)
Else
TrimNULL = str
End If
End Function

Public Function GetAllInstances() As Collection
Dim pROT As Long, pEnumMoniker As Long, pMoniker As Long, pBindCtx As Long
Dim ret As Long, nCount As Long, CheckForInstance As Boolean, Key As String
Dim pName As Long, RegisteredName As String, ExcelApp As Application

ret = GetRunningObjectTable(0, pROT)
ret = CreateBindCtx(0, pBindCtx)
CallInterface pROT, vtbl_ROT_EnumRunning, 1, VarPtr(pEnumMoniker)
While CallInterface(pEnumMoniker, vtbl_EnumMoniker_Next, 3, 1, VarPtr(pMoniker), VarPtr(nCount)) = 0
CallInterface pMoniker, vtbl_Moniker_GetDisplayName, 3, pBindCtx, 0, VarPtr(pName)
'For win9x you'll need StrFromPtrA

RegisteredName = StrFromPtrW(pName)
If InStr(LCase(RegisteredName), "book") Then
CheckForInstance = True
Else
Select Case Right(RegisteredName, 3)
Case "xla", "slk", "dif", "csv", "txt", "prn", "dbf", "wq1", "wks", "wk1", "wk3", "wk4", "xlw", "xls", "xlt", "htm", "mht", "xml"
CheckForInstance = True
End Select
Select Case Right(RegisteredName, 5)
Case ".html", "mhtml"
CheckForInstance = True
End Select
End If

If CheckForInstance Then
CheckForInstance = False
If ParentIsExcel(RegisteredName, ExcelApp) Then
If GetAllInstances Is Nothing Then Set GetAllInstances = New Collection
Key = CStr(ObjPtr(ExcelApp))
If Not InstanceAlreadyCollected(GetAllInstances, Key) Then
GetAllInstances.Add ExcelApp, Key
End If
End If
End If

CallInterface pMoniker, unk_Release, 0
CoTaskMemFree pName
Wend
CallInterface pEnumMoniker, unk_Release, 0
CallInterface pBindCtx, unk_Release, 0
CallInterface pROT, unk_Release, 0
Exit Function

End Function

Private Function ParentIsExcel(ByVal RegisteredName As String, ExcelApp As Application) As Boolean
On Error Resume Next

Set ExcelApp = GetObject(RegisteredName).Parent
If ExcelApp.Name = "Microsoft Excel" Then
ParentIsExcel = True
End If

End Function

Private Function InstanceAlreadyCollected(GetAllInstances As Collection, Key As String) As Boolean
On Error GoTo Err_InstanceAlreadyCollected
Dim o As Application
Set o = GetAllInstances(Key)
InstanceAlreadyCollected = True
Err_InstanceAlreadyCollected:
End Function
Автор: WowGun
Дата сообщения: 12.09.2008 16:20
в модуль пустой книги вставь код

Sub wer()

Dim sp() As String

boob = ActiveWorkbook.Name

For i = 1 To Workbooks.Count
Workbooks(i).Activate
nn = Workbooks(i).Name
ReDim sp(Worksheets.Count + 1)
kk = Worksheets.Count

For j = 1 To Worksheets.Count
Worksheets(j).Activate
sp(j) = ActiveSheet.Name
Next j

Workbooks(boob).Activate
Range("A1").Offset(i, 0).Value = nn

For k = 1 To kk
Range("A1").Offset(i, k).Value = sp(k)
Next k

Next i

End Sub
Автор: gortol
Дата сообщения: 12.09.2008 16:29
2WowGun

Это действует если только ОДИН экземпляр Excel запущен!!!!
Автор: WowGun
Дата сообщения: 12.09.2008 16:45
а открывать ВСЕ файлы из одной копии Excel что-то мешает?
или ПРОСТО автоматически КАЖДЫЙ файл открывается в отдельной копии Excel?
Автор: Pravoved90
Дата сообщения: 12.09.2008 18:23
Уважаемые специалисты. Помогите разобраться в такой ситуации:
Есть условие на исполнение макроса
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Cells.Count > 1 Then
Exit Sub
End If
If Not Intersect(Target, Range("M7")) Is Nothing Then
Application.EnableEvents = False
If Range("M7").Value = "есть" Then
Range("H11:J11").Clear
Логотип1
End If
If Range("M7").Value = "нет" Then
Range("H10:J10").Clear
Логотип2
End If
Application.EnableEvents = True
End If
End Sub

Когда я ниже пишу идентичночное условие(только с другимим ячейками)

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Cells.Count > 1 Then
Exit Sub
End If
If Not Intersect(Target, Range("M1")) Is Nothing Then
Application.EnableEvents = False
If Range("M7").Value = "есть" Then
Range("H11:J11").Clear
макрос1
End If
If Range("M1").Value = "нет" Then
Range("H10:J10").Clear
макрос2
End If
Application.EnableEvents = True
End If
End Sub

, получаю следующую загадочную ошибку:
ambiguous name detected work_sheet change
Что это значит и как с ним бороться? Спасибо
Автор: Pravoved90
Дата сообщения: 14.09.2008 15:36
В принципе решил проблему записью всех идентичных данных под один макрос..Но вопрос остается актуальным..И еще - можно ли сделать таку себе визуальную разделительную черту в самом макросе, чтобы визуально данные не путать.
Автор: SERGE_BLIZNUK
Дата сообщения: 14.09.2008 18:16
Pravoved90

Цитата:
ambiguous name detected work_sheet change

Вы правильно исправили допущенную Вами ошибку.
Только не поняли, в чём она была? :-) Дело в том, что нельзя назначить ДВА макроса на одно событие (в данном случае - на событие изменение данных - Worksheet_Change() )
поэтому Excel а) - ругался б) не выполнял второй макрос.
Автор: dneprcomp
Дата сообщения: 14.09.2008 20:31
SERGE_BLIZNUK Pravoved90
Все-таки уточню Масросов на одно событие(event) может быть два и больше.
Обработчик событий(Worksheet_Change) должен быть один на event.
Автор: OJIR
Дата сообщения: 15.09.2008 05:33
Pravoved90

Проверила ваш код - ошибка не выдается. В какой момент она появляется? Попробуйте точки останова ставить.


Цитата:
И еще - можно ли сделать таку себе визуальную разделительную черту в самом макросе, чтобы визуально данные не путать.


Можно. Также запишите макрос выбрав любой диапазон и выделив линией. Затем, вставляйте макрос в нужное место в проге, только уберите из него диапазон выделения...указывайте диапазон до вызова макроса.
Автор: SERGE_BLIZNUK
Дата сообщения: 15.09.2008 08:41
dneprcomp

Цитата:
Все-таки уточню Масросов на одно событие(event) может быть два и больше.
Обработчик событий(Worksheet_Change) должен быть один на event.

э... извините, за непонятливость :-( - а расжуйте, пожалуйста, что Вы хотели сказать? что значит - "Макросов на одно событие (event) может быть два" ?
Автор: MaximuS G
Дата сообщения: 15.09.2008 09:52
OJIR

Спасибо за подсказку по поводу записи в массив, можно еще вопросик:
У меня ситуация:
Есть цикл:
For i = 13 to 55 step 21 ' вытягую значение с ячеек в 13, 34, 55 ряду и так до 1000..
Мне нужно записать в массив значения этих ячеек, но если я буду заносить их так
Arr(i) = Cells(i, 5).value, то значение будут записываться в массив под номерами:
13, 34, 55 и т.д. , а мне нужно чтобы они числили в обычном порядке 1, 2, 3, 4 и т.д.
Не знаю как это можно организовать, может быть использовать прогрессию (+21) ... 13+21=34... 34+32 = 55 ...
Автор: Solenaja
Дата сообщения: 15.09.2008 10:14
MaximuS G

Код: Sub copy_sheets()

Dim arg As String
Dim i As Integer
For i = 1 To Sheets.Count
arg = Sheets(i).Name
If ActiveWorkbook.Sheets(i).Tab.ColorIndex = 14 Then Sheets(Array("СОДЕРЖАНИЕ", "Скидки", arg, "Валюта", "Примечание", "Адрес")).Copy
ChDir "e:\DOCS\Товары\расширенный каталог с ценами\temp\..." ' сохраняю и закрываю книгу
ActiveWorkbook.SaveAs (arg)
ActiveWorkbook.Close
Windows("Продукция_ALL_delete.xlsx").Activate ' перехожу к поиску следующего зеленого листа
End If
Next
End Sub
Автор: Pravoved90
Дата сообщения: 15.09.2008 10:45
Добрый день. Для начала - Благодарю всех помощь, мир екселя теперь стал намного ясней))
Уважаемые знатоки, помогите встать на верный путь: В разных листах есть столбики с идентичными значениями и выпадающими списками. Задача состоит следующем: При выборе конкретного значения из выпадающего списка в Листе1, такое же действо должно произойти в идентичной таблице в Листе2.
Вариант сделать "значение в Листе1 = значение Листе2" не подходит, поскольку на слово в Листе2 ссылается исполнение макроса - не будет работать.

Помогите написать условие, типа: если в листе1 выбрать из выпадающего списка слово "добро", то в листе2 тоже выбирается из выпадающего списка слово "добро". Спасибо.
Автор: OJIR
Дата сообщения: 15.09.2008 10:49
MaximuS G

Если я тебя правильно понимаю, то попробуй так

Private Sub CommandButton1_Click()
Dim i, row As Integer
Dim Arr(1 To 10) As Integer

i = 1

' i - изменяется в порядке возрастания 1,2,3

For row = 13 To 55 Step 21
Arr(i) = Cells(row, 5).Value
i = i + 1
Next row
.................
End Sub
Автор: MaximuS G
Дата сообщения: 15.09.2008 12:52
OJIR
Спасибо большое

Solenaja
Чесно сказать даже не знаю... взял только что ваш код, поменял путь и название файла и все работает... Может быть проблема в разных Екселях, я так понимаю с расширения файла "...delete.xlsx" Вас 2007 ?...

Может быть попросим кого-то проверить этот код ?
Автор: Pravoved90
Дата сообщения: 15.09.2008 15:08
Немного уточню вопрос, поскольку уже столкнулся с сутью проблемы. Есть обработчик событий такого содержания:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Cells.Count > 1 Then
Exit Sub
End If
If Not Intersect(Target, Range("M7")) Is Nothing Then
Application.EnableEvents = False
If Range("M7").Value = "есть" Then
Range("H11:J11").Clear
Логотип1
End If
If Range("M7").Value = "нет" Then
Range("H10:J10").Clear
Логотип2
End If
Application.EnableEvents = True
End If
Суть в том, что мне нужно, чтобы при вводе значения в Лист1 = значению в Листе2. Проблема в том, что при автоматическом измениии слова в ячейке - не работает приписанный к ней указанный обработчик. Срабатывает же он только после того, как по нему дважды клацнуть(как для ввода слова)
По логике вещей я понимаю процесс так: Макрос срабатывает, если происходит непосредственное взаимодействие с ячейкой(или есть соотвествующий процесс в коде ).
В этом же случае значение меняется без непосредственного взаимодействия с ячейкой => макрос не видит изменения.

Чувствую, что всего лишь нужно дописать пару слов, но по неопытности понятия не имею, что и как. SOS
Автор: Solenaja
Дата сообщения: 15.09.2008 16:24
MaximuS G
да 2007, но разве VB так принципиально должен отличаться для этой функции If
Автор: dneprcomp
Дата сообщения: 15.09.2008 20:22
Solenaja
Судя по всему, програма не понимает синтаксиса. Попробуйте Sheets(Array...так как у меня, с новой строки.

Код: Sub copy_sheets()

Dim arg As String
Dim i As Integer
For i = 1 To Sheets.Count
arg = Sheets(i).Name
If ActiveWorkbook.Sheets(i).Tab.ColorIndex = 14 Then
Sheets(Array("СОДЕРЖАНИЕ", "Скидки", _
arg, "Валюта", "Примечание", "Адрес")).Copy
' сохраняю и закрываю книгу
ChDir "e:\DOCS\Товары\расширенный каталог с ценами\temp\..."
ActiveWorkbook.SaveAs (arg)
ActiveWorkbook.Close
' перехожу к поиску следующего зеленого листа
Windows("Продукция_ALL_delete.xlsx").Activate
End If
Next
End Sub
Автор: Solenaja
Дата сообщения: 16.09.2008 11:57
dneprcomp
твой код работает

но почему то:
- выгружает только первый лист СОДЕРЖАНИЕ
- размер файла СОДЕРЖАНИЕ такой же как общей книги
- все листы из общей книги перешли в СОДЕРЖАНИЕ
Автор: dneprcomp
Дата сообщения: 16.09.2008 21:30
Solenaja
Это не мой код. Решение твое и MaximuS G Я всего лишь поправил синтаксис в одном месте.
Т.ч., если код не работает сейчас, он и раньше не работал
Попробуй прoгнать с остановками, в дебаге. С проверкой значений. Ошибка себя покажет.
Автор: Solenaja
Дата сообщения: 16.09.2008 22:11
dneprcomp
я не коим образом не преуменьшаю работу MaximuS G
в любом случае обоим спасибо
завтра буду смотреть
Автор: MaximuS G
Дата сообщения: 17.09.2008 11:37

Solenaja

Цитата:
dneprcomp
твой код работает

но почему то:
- выгружает только первый лист СОДЕРЖАНИЕ
- размер файла СОДЕРЖАНИЕ такой же как общей книги
- все листы из общей книги перешли в СОДЕРЖАНИЕ


Как должно быть... я так понимаю, должен копироваться один зеленый лист и вместе с ним СОДЕРЖАНИЕ", "Скидки", "Валюта", "Примечание", "Адрес" - это стандартные... То-есть меняться должен только зеленый лист ?.. Если да, то у меня так и было...
Автор: mic21
Дата сообщения: 17.09.2008 11:49
Добрый день, у меня бооольшая просьба к вам по написания макросов...
Есть 6 файлов(таблиц) и один файл(таблица) итоговая, надо сделать так, чтобы при отработке макроса НЕ открывая все 6 файлов копировались данные (с таблицами) в один ИТОГОВЫЙ файл…
Т.е. допустим, что 6-ть файлов называются 1,2,3-6 и есть итоговый файл который называется «ИТОГИ» !
Надо чтобы вот эти 6-ть файлов по очереди копировались в файл ИТОГИ, НО нужно сделать так, чтобы были плавающие строки, т.е. если в таблице 3, добавились новые строки, чтобы в файле ИТОГИ, они отобразились тоже.

Я вижу работу макроса таковой…
Есть файл ИТОГИ, надо копировать начиная со строки 5 и ниже файлы 1,2,3,4,5,6 и при том ВСЕ файлы 1-6 должны копировать ОТ 5-той строки и до первой пустой ячейки.

ПОЖАЛУЙСТА, если кто может... помогите написать такой макрос...
если какие либо вопросы нужно уточнить то связаться можно по мылу denis_kulikov@mic21.ru или по аське 408-118-255
ну или написать тута...
Автор: Solenaja
Дата сообщения: 17.09.2008 12:21
MaximuS G
да так как ты описал - но у меня не так
я сейчас попробую на листах небольшого размера
возможно это из-за того что файл на 25 мб
Автор: MaximuS G
Дата сообщения: 17.09.2008 12:27
mic21
Вы можете сохранить задание с подробными инструкциями в архив и выложить ссылку на него... будет время я попробую

Подскажите пожалуйста, можно ли получить имена книг находящихся в какой-то в папке? Например, в книге 1 на рабочем столе 5 книг, но я не знаю их названия...
Может быть есть что-то как получаються ссылки на источники и записываются в массив?
Спасибо.
Автор: Solenaja
Дата сообщения: 17.09.2008 13:01
MaximuS G
в общем вообще не выгружает листы
странно как то даже
была мысль что может цвет не видит - делалось так RGB(0, 176, 80) - тоже самое

в общем на 2007 Excel этот код не работает
на 2003 работает - только почему файлы складывает в c:\Documents and Settings\пользоватль\Мои документы\ - т.е. рабочий каталог который стоит в настройках Excel по умолчанию
Автор: Oyger
Дата сообщения: 17.09.2008 13:14
mic21
Эксель не работает не с открытыми книгами. Так что она должна открываться.
Смотри как все работает: когда ты открываешь книгу обычным способом, эксель запускает свой встроенный модуль, который преобразовывает текст файла в привычный тебе вид книги. То же самое происходит, когда ты открываешь книгу макросом - запускается все тот же модуль открытия.
А ты хочешь работать с файлом не открывая его. Пока ты его не откроешь - содержимое файла представляет для экселя просто текст.
А с чем связано такое стремление уйти от открытия книги?

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133

Предыдущая тема: Написание своего HyperTerminal для считывания данных


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