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

» Excel VBA

Автор: The okk
Дата сообщения: 13.12.2006 12:19
Товарищи, дайте хотя бы ссылку, где можно скачать нормальный контрол типа листбокса, чтобы там можно было с сеткой работать. А то создавать собственный как-то не хочется - наверняка уже кто-то делал.
Автор: Anton T
Дата сообщения: 13.12.2006 12:27
Господин-профессионалист Yuk!
Вот сделал немного пример:

Код: Private Sub UserForm_Initialize()
Dim strAA As String
Dim ls As Worksheet
For Each ls In Worksheets
strAA = ls.Range("A1") 'Application.WorksheetFunction.CountA(ls.Range("A:A"))
ListBox1.AddItem strAA
Next
End Sub
Автор: The okk
Дата сообщения: 13.12.2006 12:38
Anton T
а ты точно ТАК код написал? Просто в таком виде
Цитата:

strAA = ls.Range("A1") 'Application.WorksheetFunction.CountA(ls.Range("A:A"))

'Application.WorksheetFunction.CountA(ls.Range("A:A")) должно восприниматься, как комментарий . Следовательно, остается строка кода: strAA = ls.Range("A1")
Если в ней меняем A1 на А:А (кстати, проверь - чтобы были латинские), Range уже не прокатит, поскольку будет в качестве результата давать не ячейку (читай - value, которое приводится к строковому типу), а именно Range (столбец), который не приводится к строковому типу .

В общем, процитируй код В ТОЧНОСТИ, как он у тебя записан в VBA.
Автор: Anton T
Дата сообщения: 13.12.2006 12:47

Цитата:
должно восприниматься, как комментарий

знаю, если убрать апостроф и
Цитата:
ls.Range("A1")
и видишь.

Цитата:
Если в ней меняем A1 на А:А (кстати, проверь - чтобы были латинские)

все латинские.

Цитата:
(читай - value, которое приводится к строковому типу), а именно Range (столбец), который не приводится к строковому типу

а понял, продложение следует...
Автор: The okk
Дата сообщения: 13.12.2006 13:13
Anton T
не факт, что правильно понял мысль, но попробуй так:
Код:
strAA = CStr(Application.WorksheetFunction.CountA(ls.Columns(1)))
Автор: Radeon9800Pro
Дата сообщения: 13.12.2006 15:11
Yuk
Огромное спасибо! Все великолепно работает надеюсь, если у меня еще появятся вопросы - я смогу их задать
Автор: aalleexxaa
Дата сообщения: 13.12.2006 20:18
еще вопрос:

для правильного запроса пишем:

Код: sSQL_t = "SELECT * FROM tovar where tovar.***=" & c1
Автор: Yuk
Дата сообщения: 13.12.2006 20:38
aalleexxaa

Цитата:
естественно подправив

А если не подправлять? Или подправить неестественно

В общем, рекомендую подучить SQL.



Добавлено:
mrdime
В Access можно экспортировать любую таблицу/запрос в Excel.
Если нужно экспортировать много таблиц или все, можно записать макрос.
Автор: Widoms
Дата сообщения: 14.12.2006 04:06
Всем привет

есть строчки .и.т.д
8426 УСТАНОВКА 2 32988576,00
18289440,32
160360 УCTAHOBKA 1 639191,00
551819,16

как итог подсчитать по строкам где есть наименование и где нету.
Подскажите макрос.
Автор: Yuk
Дата сообщения: 14.12.2006 06:50
Widoms
Пустые можно подсчитать так:
=СУММЕСЛИ($A$1:$A$4;"";$B$1:$B$4)

А непустые ... ну, например, вычесть итог по пустым из общей суммы.
Или обязательно надо макрос?
Автор: The okk
Дата сообщения: 14.12.2006 07:01
Yuk
Ты с ListView случайно не работал? Из того, что у меня под рукой, только этот контрол делает на форме список с границами.
Как тут добавлять/удалять элементы?
Автор: Yuk
Дата сообщения: 14.12.2006 07:09
The okk
Неа. Посмотри в гугле, полно примеров, если это он самый, конечно.

Автор: The okk
Дата сообщения: 14.12.2006 07:45
Yuk
Искал я в гугле. Только, когда открываю в обжект броузере этот ListView, не вижу там ни LV_add, ни ListViewItem, ничего, хотя бы отдаленно напоминающего add. Также тут нет ни намека на source и Items. Полный тупик.

Добавлено:
Стоп. Нашел . ListItems у него есть, а уж в нем Item'ы прячутся.

Добавлено:
Yuk
А не знаешь, можно сделать список значений из ссылок? - Чтобы при выборе (данные-проверка-список значений) в ячейке выбиралось бы не конкретное значение, а ссылка?
Т.е., например, столбец состоит из записей:
значение1
значение2
значение3
Если при проверке данных сослаться на этот столбец, подставляться будет именно значение, а я хочу, чтобы подставлялась ссылка на ячейку, где лежит это значение.
Это возможно?
Автор: mrdime
Дата сообщения: 14.12.2006 10:12
Yuk

"Штатных" средств для экспорта таблиц из Excel в Access нет. Есть надстройка AccessLink, но по ряду причин она мне не подходит.
Задача состоит в следующем: Есть таблицы с полностью одинаковой структурой в Excel которые периодически необходимо экспортировать в Access. В Access создан набор запросов который нужным образом анализирует данные из этих таблиц. Для этого мне необходимо хотя бы узнать синтаксис основных команд по созданию таблиц, баз Access из Excel на VBA.
Автор: Anton T
Дата сообщения: 14.12.2006 10:47
The okk
Я понимаю, но мне счет не нужен, а список строк имени.
Yuk
Как думаешь сделать список имен? Если не трудно, пиши.
Автор: The okk
Дата сообщения: 14.12.2006 11:54
Anton T
Что такое "список строк имени"?

Добавлено:
Изучаю контрол ListView. Хорошая вещь. Кому не хватает ListBox'а - рекомендую. Кто-нибудь знает, как сюда добавить сразу диапазон ячеек, а не по одной их втыкать через ListItems.Add?
Автор: Anton T
Дата сообщения: 14.12.2006 12:59
mrdime
Создай модуль КЛАССА и имением:
[more=CSVFileClass]

Код: Option Explicit

'CSVFileClass
'''''''''''''
'СВОЙСТВА
' ExportRange
' ImportRange

'МЕТОДЫ
' Import
' Export

Private RangeToExport As Range
Private ImportToCell As Range

Property Get ExportRange() As Range
Set ExportRange = RangeToExport
End Property

Property Let ExportRange(rng As Range)
Set RangeToExport = rng
End Property

Property Get ImportRange() As Range
Set ImportRange = ImportToCell
End Property

Property Let ImportRange(rng As Range)
Set ImportToCell = rng
End Property

Sub Export(CSVFileName)
' Экспортирует диапазон в файл DBF
Dim ExpBook As Workbook

If RangeToExport Is Nothing Then
MsgBox "Экспортируемый диапазон не определен"
Exit Sub
End If

On Error GoTo ErrHandle
Application.ScreenUpdating = False
Set ExpBook = Workbooks.Add(xlWorksheet)
RangeToExport.Copy
Application.DisplayAlerts = False
With ExpBook
.Sheets(1).Paste
.SaveAs FileName:=CSVFileName, FileFormat:=xlDBF4
.Close SaveChanges:=False
End With
Application.CutCopyMode = False
Application.ScreenUpdating = True
Application.DisplayAlerts = True
Exit Sub
ErrHandle:
ExpBook.Close SaveChanges:=False
Application.CutCopyMode = False
Application.ScreenUpdating = True
Application.DisplayAlerts = True
MsgBox "ОШИБКА " & Err & vbCrLf & vbCrLf & Error(Err), _
vbCritical, "Ошибка метода экспортирования"
End Sub

Sub Import(CSVFileName)
' Импортирует файл DBF в диапазон
Dim CSVFile As Workbook

If ImportToCell Is Nothing Then
MsgBox "Диапазон для импорта не определен"
Exit Sub
End If

If CSVFileName = "" Then
MsgBox "Не определено имч импортируемого файла"
Exit Sub
End If

On Error GoTo ErrHandle
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Workbooks.Open CSVFileName
Set CSVFile = ActiveWorkbook
ActiveSheet.UsedRange.Copy Destination:=ImportToCell
CSVFile.Close SaveChanges:=False
Application.ScreenUpdating = True
Application.DisplayAlerts = True
Exit Sub
ErrHandle:
CSVFile.Close SaveChanges:=False
Application.ScreenUpdating = True
Application.DisplayAlerts = True
MsgBox "ОШИБКА " & Err & vbCrLf & vbCrLf & Error(Err), _
vbCritical, "Ошибка метода импортирования"
End Sub
Автор: The okk
Дата сообщения: 14.12.2006 14:14
Anton T
хм... прочитал. Есть листы с названиями от А до Б. там в первом столбце фамилии, начинающиеся с это буквы. Надо вывести список всех фамилий. Так?
А в чем проблема? Твой код именно это и делает.
Только вместо обращения к первой ячейке (A1) надо пройтись по всем ячейкам:
Код:
Private Sub UserForm_Initialize()

Dim strAA As String
Dim RowCounter As Long
Dim ls As Worksheet

For Each ls In Worksheets
For RowCounter = 1 To ls.UsedRange.Rows.Count
strAA = ls.Cells(RowCounter, 1)
ListBox1.AddItem strAA
Next
Next

End Sub
Автор: mrdime
Дата сообщения: 14.12.2006 14:23
Anton T

Цитата:
З.Ы. Ексел не експортируют Аксесс(mdb)!

Ты не прав.

http://www.citforum.ru/programming/digest/excel_vba.shtml#3

К сожалению этот кусок кода у меня почему-то не работает, но очевидно из-за того, что я сразу переделал его под свои нужды и что-то не учел или же он со старта написан с ошибками.
Вопрос остается открытым...
Автор: Yuk
Дата сообщения: 14.12.2006 17:05
mrdime
Извиняюсь, стормозил. ДУмал про экспорт в обратную сторону.
Рекомендую посмотреть книжку Integrating Excel and Access.
Я здесь давал недавно ссылку.
http://forum.ru-board.com/topic.cgi?forum=93&topic=0461&start=120#5
Если уже затерли, сообщи.


Добавлено:
Anton T
По-моему, тебе The okk уже ответил. Или не устраивает?

Добавлено:
The okk
А где этот ListView можно взять?
Автор: RDVAS
Дата сообщения: 14.12.2006 18:02
Есть Help для VBA Office2003 на русском языке?
Автор: Anton T
Дата сообщения: 14.12.2006 18:35
Yuk
Устраиваю, но не все, там 1 столбец по фамилию и все, а надо все - имя, отечество и т.д.
Автор: Yuk
Дата сообщения: 14.12.2006 19:24
Anton T
Что-то я совсем запутался, что тебе надо.
Давай еще раз, с начала и поподробнее.
Если долго объяснять, может файл выложишь?
Автор: The okk
Дата сообщения: 15.12.2006 06:15
Yuk
Это майкрософтовский контрол, он у тебя должен быть. Лежит в system32\mscomctl.ocx
В VBA заходишь в tools - additional controls и там будет "Microsoft Listview Control" (у меня 6-я версия).

Добавлено:
Anton T
Т.е. в листах фамилия, имя и отчество в разных столбцах, а надо, чтобы в листбоксе было все в одном столбце - и имя и отчество и фамилия?
Тогда используй конкатенацию. Вместо strAA = ls.Cells(Rowcounter,1) пиши:
Код:
strAA = ls.Cells(Rowcounter,1) & " " & ls.Cells(Rowcounter,2) & " " & ls.Cells(Rowcounter,3)
Автор: Anton T
Дата сообщения: 15.12.2006 07:52
The okk
спасибо!

Цитата:
хотя, лучше не ставить каждый раз ls., а использовать With

ок.

Yuk
вот The okk он написал, правильно!

Добавлено:
Еще есть один вопрос. Как можно преобразовать 6420/43 в 6420 и 43?
Автор: The okk
Дата сообщения: 15.12.2006 08:44
Anton T
Идея там примерно такая:

Код:
Sub SplitNum(BaseNum As String) 'берем базовую строку
Dim FirstNum As Integer, SecondNum As Integer 'ее будем разделять на 2 числа

FirstNum = CInt(Left(BaseNum, InStr(1, BaseNum, "/") - 1)) 'первое число - это
' первые N-1 символов базовой строки, где N - номер символа "/" в базовой строке

SecondNum = CInt(Right(BaseNum, Len(BaseNum) - InStr(1, _
BaseNum, "/"))) 'второе число - это все, что после знака дроби.

End Sub
Автор: Anton T
Дата сообщения: 15.12.2006 10:42
The okk
Куда вставлять? в модуле, да и не запускается макрос?
Я так понял, в стольбце Н имеется 6420/43, надо разделять 6420 на столбце Н и 43 на столбце I. Правда, в строке много числовой записи надо разделять.
Автор: The okk
Дата сообщения: 15.12.2006 10:56
Anton T
в ТАКОМ виде - никуда. Смысла нет - даже если на вход ты что-то и дашь, процедура только изменит свои внутренние переменные. А вот если в этот код вставить доп. действия по размещению результата в ячейке или форме, тогда - другое дело.
Ты скажи толком, откуда брать эту дробь и куда совать её компоненты. Тогда напишу частное решение.
Автор: mrdime
Дата сообщения: 15.12.2006 14:28
Yuk

Книга судя по всему отменная, но ссылки - мертвые.
На Рапиде файл грохнули.
2-я открывает архив .rar к скачиванию, но ничего не качается - Браузер выдает, что сервер недоступен.
3-я (на зеркале) - выдает какую-то билиберду с просьбой регистрации, причем ни тени намека на нужный мне файл.
Автор: Yuk
Дата сообщения: 15.12.2006 17:56
mrdime
_http://fileho.com/download/cf52fe879187/iea.zip.html

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

Предыдущая тема: Стоит ли переходить с Билдера на Делфи?


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