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

» Excel VBA

Автор: Gtto
Дата сообщения: 20.12.2006 12:12
Огромная просьба в помощи.
я не знаю куда писать в гугле нашёл этот форум....
дело такое есть книга в ней порадка 200 листов, все листы идентичны по заполнению, НО представляют из себя небольшие журналы перемещения оборудования (т.е. в них заполняются строки с датой и прочими характеристиками в 5 столбцов).
нужно сделать итоговую ведомость. я её частично сделал, но не могу заставить выбирать из конкретного листа (т.е. из каждого по порядку) последнюю заполненную строку (т.е. последнюю запись в журнале)... помогите очень надо.
Автор: The okk
Дата сообщения: 20.12.2006 12:13
Новый элемент перед выделенным вставить оказалось довольно просто:

Код: Listview1.Listitems.Add(SelectedItem.Index)
Автор: Gtto
Дата сообщения: 20.12.2006 12:31
возможно не правильно выразился..
перенести значения из 4х ячеек в одной строке каждого листа на 1й (ну на итоговый..)
а унать какую именно строку надо - последнюю запоненную (т.е. после нужной строки лист не заполнен)
Автор: The okk
Дата сообщения: 21.12.2006 08:19
Кто-нибудь с ListView вообще работал?
Добавляю элемент:
ListItems.Add(1) = Cells(1,1)
Listitems.Item(1).SubItems(1) = Cells(1,2)
Потом пытаюсь сортировать по второму столбцу:
Sortkey = Family
Sorted = True
Реакции - ноль.
Если сортирую по первому столбцу:
Sortkey = TabNum
Sorted = True
, сортирует нормально.
Почему не работает сортировка по второму столбцу?

Добавлено:
И вообще, не могу понять, почему у SubItem'ов свойств нет и свойства Item'ов они не наследуют. Как ими управлять? Должно же у них что-то меняться, кроме значения.

Добавлено:
И при копировании они не подцепляются - копирую Item, а его SubItems приходится отдельно копировать.
Автор: Anton T
Дата сообщения: 21.12.2006 19:35
Gtto

Цитата:
порадка 200 листов

Откуда берет 200 листов???
Максимум 99.

The okk
Yuk
Все в порядке. Вот смтри рисунок, который The okk написал код в предыдущем странице, но выглядить не порядок:

А вот Yuk выглядить хорошо, но не могу сделать отображать все листы в списке:



Сейчас 3850/18, а надо разделить на 3850 и на 18:


ЗЫ. Если вами надо просмотреть код в форме, могу скинут...


Добавлено:
Вот код для формы h--p://files.people.overclockers.ru/AntonT/excelvbaform.rar
Распакуй в любом каталоге, загрузи из надстройки и открывается панель"Моя панель" над панелью "Форматирование".
Автор: SERGE_BLIZNUK
Дата сообщения: 22.12.2006 00:36
Anton T
Цитата:
Откуда берет 200 листов???
Максимум 99.
Вы не правы. Зависит от версии. в Excel 2003 в одной книге максимум 255 листов.


Добавлено:
Gtto
Цитата:
перенести значения из 4х ячеек в одной строке каждого листа на 1й (ну на итоговый..)
как раз над вашим постом уважаемый The okk привёл код, который проходит по всем (!) листам вашей книги (хоть 255 ;-)) и находит в них последнюю стоку. Допишите код обработки:
"'тут пишешь, что ты хочешь сделать с этой строкой"
например так (только не забудьте исправить строку для итогов и имя итогового листа (в примере ниже это "Лист1":
Код:
Sub stroka()
Dim list As Worksheet
Dim stroka As Long

' Строчка в первом листе, начиная с которой будут идти итоговые значения
StrokaForSaved = 3

For Each list In Worksheets
'получил номер максимальной строки на листе

stroka = list.Range("A65536").End(xlUp).Row
'тут пишешь, что ты хочешь сделать с этой строкой
If list.Name <> "Лист1" Then
For i = 1 To 4 'сколько стобцов нужно переносит в итоговый лист
Worksheets("Лист1").Cells(StrokaForSaved, i).Value = list.Cells(stroka, i).Value
Next i
StrokaForSaved = StrokaForSaved + 1
End If

Next
End Sub
Автор: The okk
Дата сообщения: 22.12.2006 07:11
Anton T
Дык, сказал бы, что надо, чтобы выглядело нормально. Лови код:

Код:
Private Sub UserForm_Initialize()
Dim RowCounter As Long
Dim ls As Worksheet

For Each ls In Worksheets 'в каждом листе
For RowCounter = 1 To ls.UsedRange.Rows.Count 'проходим по всем строкам
With ListView1 'и в ListView
.Gridlines = True 'рисуем сетку (ибо удобно!)
With .ListItems
.Add = ls.Cells(RowCounter, 1) 'добавляем элемент (Фамилию)
.Item(.Count).SubItems(1) = ls.Cells(RowCounter,2) 'и его подэлементы
.Item(.Count).Subitems(2) = ls.Cells(RowCounter,3) 'и т.д. ...
End With
End With
Next
Next

End Sub
Автор: Aladdinych
Дата сообщения: 22.12.2006 07:37
Есть две проблемы

1. FileCopy "D:\b.txt", "c:\"

Почему-то выдает "Path not found" хотя файл на диске D есть. Диск С тоже есть.

2. Из модуля Workbook_open создается еще одна книга. Указатель на нее хранится в переменной newdoc. Эта переменная в разделе general объявлена как Public.
Мне нужно из модуля CommandButton_Click закрыть книгу newdoc. Как получить доступ к переменной newdoc из этого модуля? Я пробовал делать ЭтаКнига.newdoc.close. По певому клику все срабатывает. По второму клику получаю почему-то "Object required".
Как победить проблему?

Добавлено:
Да, забыл CommandButton находится на Лист1.
Автор: The okk
Дата сообщения: 22.12.2006 07:42
Aladdinych
1. FileCopy "D:\b.txt", "c:\b.txt"

2. Не факт, что правильно тебя понял, но если ты уверен, что делаешь правильно:

Код:
On Error Resume Next 'забить на ошибки
ЭтаКнига.newdoc.close
On Error GoTo 0 'перестать забивать на ошибки
Автор: Aladdinych
Дата сообщения: 22.12.2006 09:02
The okk
Еще вопрос у меня по клику на кнопке запускается архиватор

Shell ("rar ....") и т.д.
а за ней идет Filecopy aaa.rar, c:\aaa.rar
Выкидывается ошибка Permission denied
Если выполнить Filecopy с некоторой задержкой то копирование выполняется нормально.
Как проверить файл, занят он другим процессом или нет?
Автор: The okk
Дата сообщения: 22.12.2006 09:40
Aladdinych
может, я опять не понял замысла, но почему бы просто не проверять - есть ошибка или нет?
Код:
Povtor:
On Error Goto Povtor 'если ошибка, попробовать еще раз
Filecopy aaa.rar, c:\aaa.rar
On Error Goto 0
Автор: Troitsky
Дата сообщения: 22.12.2006 09:48
The okk

Цитата:
Povtor:
On Error Goto Povtor 'если ошибка, попробовать еще раз
Filecopy aaa.rar, c:\aaa.rar
On Error Goto 0

Так можно и в бесконечный цикл войти
Автор: The okk
Дата сообщения: 22.12.2006 10:06
Troitsky
Если ошибка возникает только по причине занятости файла, бесконечного цикла не будет. Другое дело - при копировании могут возникнуть ошибки, вызванные другими факторами (не найден путь и т.д.). Но в таком случае проблема решается просто - надо контролировать не только наличие ошибки, но и ее номер.
Код:
Povtor:
On Error Resume Next 'если ошибка, попробовать еще раз
Filecopy aaa.rar, c:\aaa.rar
If Err = номер_ошибки GoTo Povtor
On Error Goto 0
Автор: weg
Дата сообщения: 22.12.2006 10:21
Помогите кто может. Сделал как смог первый свой макрос, а он ругается.
Есть столбец с текстом. В каждой ячейки записана одна строка. Длина строк может быть очень большой(> 1000 символов). Так вот.
Задача в том чтобы отредактировать текст таким образом, чтобы.
1) если строка длинее 230 символов, то создать ячейку со здвигом вниз и все символы начиная с 231-го перенести в неё, а в конец предыдущей ячейки (на 231-ю позицию) вставить символ "\".
Короче, должен получиться столбец текста, строки в котором не длиньше 230 символов, а вместо знака переноса вставить "\"

Написал следующее. Не судите строго. Нужна помощь.



Sub Макрос1 ()

Dim addr As String
Dim a As String
Dim k As String
a = "A"
k = "\"

Dim L As Integer
Dim s As String
Dim x As Integer
Dim cut As String
Dim cut2 As String
L = 1
x = 1


Do Until L = 0
s = a + LTrim(Str(x))
Range("s").Select
L = ДЛСТР("s") <------даёт ошибку Compile error: Sub or Function not defined
If L > 230 Then
cut = ЛЕВСИМВ("s", 230)
cut2 = ПСТР("s", 231, L - 230)
Selection.Insert Shift:=xlDown
ActiveCell.FormulaR1C1 = cut + k
x = x + 1
s = a + LTrim(Str(x))
Range("s").Select
ActiveCell.FormulaR1C1 = cut2
x = x - 1
End If



Next x

Loop

End Sub
Автор: Troitsky
Дата сообщения: 22.12.2006 10:35
Aladdinych

Цитата:
Из модуля Workbook_open создается еще одна книга. Указатель на нее хранится в переменной newdoc. Эта переменная в разделе general объявлена как Public.
Мне нужно из модуля CommandButton_Click закрыть книгу newdoc. Как получить доступ к переменной newdoc из этого модуля? Я пробовал делать ЭтаКнига.newdoc.close. По певому клику все срабатывает. По второму клику получаю почему-то "Object required".
Как победить проблему?

Если область видимости переменной - глобальная в приложении, то почему бы не использовать такой код
Код: Sub newDocClose()
If newDoc Is Nothing Then
Exit Sub
Else
newDoc.Close
Set newDoc = Nothing
End If
End Sub
Автор: Anton T
Дата сообщения: 22.12.2006 11:12
The okk
И где взять ListView? В екселе не нашел, только ВБ.

НЕ РАБОТАЕТ РАЗДЕЛЕНИЯ! И куда в обычном модуле? Совсем неработает и в код листе тоже неработает.
Автор: The okk
Дата сообщения: 22.12.2006 11:13
weg
похвально! Пару советов:
1. Не используй Do Until. Всегда используй For Next. - Работает значительно быстрее.
2. Не используй select. Практически все действия можно выполнить без него (я пока знаю только одно исключение)
3. Не надо прописывать каждую переменную в отдельной строке. Можно же написать несколько в одну строку. Например:
Dim a As String, Dim k As String
Хотя, это уже кому как удобнее.

Добавлено:
Anton T
1. Открой свою форму. Tools - additional controls - и там выбирай Microsoft Listview Control.
2.
Цитата:
НЕ РАБОТАЕТ РАЗДЕЛЕНИЯ!

а на вход точно подаешь ячейку?
Прописывается в любой модуль. Потом из любого модуля можно вызвать. Например:
Код: Sub Calling()
Call SplitNum(Cells(1, 1))
End Sub
Автор: weg
Дата сообщения: 22.12.2006 11:23

Цитата:
Troitsky

[

Спасибо!
Теперь ошибка

Range("s").Select ------ Run-time error '1004': Method 'Range' of object '_Global' failed

Да... Что-то я вообще ничего не понимаю. С чем это связано?

Автор: The okk
Дата сообщения: 22.12.2006 11:50
Запись
Цитата:
Range("s")
в данном случае означает: вызвать метод Range со строковым параметром "s".
В скобки надо ставить либо переменную, либо значение типа Range.
Автор: Anton T
Дата сообщения: 22.12.2006 11:53
The okk

Цитата:
Открой свою форму. Tools - additional controls - и там выбирай Microsoft Listview Contro

Нету.


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

Вот! Спасибо! Работает! =)))
Автор: The okk
Дата сообщения: 22.12.2006 12:03
Anton T

Цитата:
Нету.

не может быть. Хотя бы старая версия должна быть. Файл msocomctl.ocx у тебя должен быть в \system32\. В этом файле все доп. майкрософтовские контролы TreeView и ListView.
Или в ранних версиях назывался типа Comctl.ocx или comctl32.ocx


Добавлено:
если искать неохота, скачай пример. Там на форме их две штуки. Можно оттуда скопировать
Автор: weg
Дата сообщения: 22.12.2006 13:05
УРА ЗАРАБОТАЛА!!!
ВСЕМ СПАСИБО!
Автор: The okk
Дата сообщения: 22.12.2006 13:12
weg
Поздравляю!
Автор: aks sv
Дата сообщения: 22.12.2006 13:36
The okk

В форме имеется ListBox, который заполняется с Листа1. Надо чтобы при нажатии на ОК данные из ListBox скопировались на Лист2. Подскажи, пожалуйста, что не правильно делаю?

Private Sub cmdOK_Click()
Application.ScreenUpdating = False
Worksheets("Лист2").Activate
Dim n As Integer
n = ListBox1.ListIndex
r = ListBox1.ListCount
For n = 0 To r
Cells(n, 1).Value = ListBox1.List(n)
Next n
Worksheets("Лист1").Activate
Unload Me
End Sub
Автор: The okk
Дата сообщения: 22.12.2006 14:44
aks sv
Ты уж скажи сразу, что не работает или выложи файл, а то тут мне остается только догадываться .
Код:
n = ListBox1.ListIndex' присвоить переменной n номер выделенного в данный момент элемента
r = ListBox1.ListCount 'присвоить переменной количество элементов
For n = 0 To r 'присвоить переменной n (где раньше лежал номер элемента) ноль!
Cells(n, 1).Value = ListBox1.List(n)
Next n
Автор: Anton T
Дата сообщения: 22.12.2006 18:13
The okk
Нашел дома, но на работе надо переустановить офис, какой-то глюк

Выдает ошибку 380:
Invalid property value
Короче, что делать?
Жду ответа.
Автор: The okk
Дата сообщения: 22.12.2006 19:54
Anton T

Цитата:
Нашел дома

Я же говорил - должен быть.

Цитата:
Выдает ошибку 380:
Invalid property value
Короче, что делать?

Скорее всего, ты не настроил ListView (а именно - не создал столбцы) . Я же говорил, что предварительно его надо настроить. Я мог бы это сделать и кодом, но руками это делается намного быстрее. Заходишь в Custom и на вкладке ColumnHeaders добавляешь столбцы (там же присваиваешь им ключи, текст и ширину).
Кроме того, не забудь .view = 3 - lvwReport. Иначе Subitems не будут видны.
Автор: Anton T
Дата сообщения: 22.12.2006 20:40
The okk
h--p://vbnet.mvps.org/index.html?code/comctl/lvcolumnhilite.htm много интересного

Добавлено:
А так же - h--p://www.microsoft.com/Rus/Msdn/Activ/MSVB/Archive/Interface/Technique/Default.mspx
Автор: aks_sv
Дата сообщения: 23.12.2006 10:35
The okk

Цитата:
Ты уж скажи сразу, что не работает или выложи файл, а то тут мне остается только догадываться


Весь список с ListBox вставляется в Лист2, но при этом матерится:

Run-time error '381':
Could not get the List property. Invalid property array index.


Добавлено:

The okk
и выделяет желтым строку
Cells(n, 1).Value = ListBox1.List(n)
Автор: Troitsky
Дата сообщения: 23.12.2006 13:39
The okk

Цитата:

Цитата: Next n
Надо:
Код: Next

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

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


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