Программа на Vb для Excel

  • Автор темы FireBall1991
  • Дата начала
Статус
Закрыто для дальнейших ответов.
F

FireBall1991

Гость
#1
Здраствуйте!
Мне в короткие сроки надо написать программу на VB для EXCEL. Мои знания по программированию это обычный BASIC до вложенных циклов (в школе дальше пока не прошли). Тоесть как её написать я не знаю. Есть конечно очень размытое представление, но его мало. :(

Есть прайс лист где в 1 столбике написан код товара а в 9 покупатель забивает кол-во товара которое ему надо.
Надо каким либо способом отсеять строчки с товаром который не заказали и затем сохранить документ в формат *.dbf.

Вроде бы всё это звучало легко, но даже почитав некоторые учебники(правда бегло) не получается...
Помогите пожалуйста :)
 
?

????

Гость
#2
<!--QuoteBegin-FireBall1991+26:06:2007, 13:26 -->
<span class="vbquote">(FireBall1991 @ 26:06:2007, 13:26 )</span><!--QuoteEBegin-->и затем сохранить документ в формат *.dba.
[snapback]70617" rel="nofollow" target="_blank[/snapback]​
[/quote]<br>что за формат такой?<br>
 
F

FireBall1991

Гость
#4
Извините за неточности. Я попозже уточню.
Можно тогда помочь не учитывая конвертирование???
Оччень надо.
 
F

FireBall1991

Гость
#5
Тогда помогите просто ответив на несколько вопросов. Пожалуйста!
1 Какая команда на Visual Basic позволяет посчитать кол-во строчек в таблице EXCEL??? Напишите пожалуйста команду так как она должна вводиться в программу.

2 Как в Excel обозначаются ячейки??? Вроде бы как A1 B7 и т.д. Но мне надо будет чтобы цифра после буквы обозначалась переменной. Как это должно выглядеть???

3 Скажите пожалуйста функции с помощью которых можно например ячёйке H2 присвоить значение ячеки
F6 и потом удалить ячейку F6. Напишите пожалуйста не чисто функции а вместе с оформлением.
Заранее благодарен.
 
T

Tanya

Гость
#6
Есть прайс лист где в 1 столбике написан код товара а в 9 покупатель забивает кол-во товара которое ему надо.
Надо каким либо способом отсеять строчки с товаром который не заказали и затем сохранить документ в некоторый формат.

Будем решать так:
на активном листе есть 9 колонок (или больше, но девятая служит для заполнения количества товара)
Выбираем из этого листа, только те записи, где в колонке 9 указано некоторое число,
означающее количество заказанного товара. Считаем, что здесь должно быть указано
положительное значение, иначе проверку на наличие записей нужно переписать :)
Эти записи переносим на новый лист, который в конце сохраняем в формате dbf (или txt)

Sub Zakaz()
Dim i As Integer, iStart As Integer, iFinish As Integer, Cols As Integer
Dim NewSheet As Worksheet, OldSheet As Worksheet, j As Integer, s As String

iStart = 1
Set OldSheet = ActiveSheet
iFinish = OldSheet.UsedRange.Rows.Count - iStart - 1
If iFinish < iStart Then
MsgBox "Нет данных для просмотра"
Else
Cols = OldSheet.UsedRange.Columns.Count

'1) Проверяем сумму, заказанного товара в колонке 9
'Если она = 0, то заказ не сделан - сохранять нечего!
'при этом считаем, что отрицательных значений здесь не может быть
If Application.WorksheetFunction.Sum( _
OldSheet.Range(OldSheet.Cells(iStart, Cols), _
OldSheet.Cells(iFinish, Cols))) > 0 Then
'Добавляем новый лист - для сбора результата
Set NewSheet = ActiveWorkbook.Worksheets.Add(OldSheet)
'печатаем на этом листе строку заголовка
PrintRow OldSheet, NewSheet, iStart, iStart, Cols

'счетчик строк на новом листе
j = 1
For i = iStart + 1 To iFinish
'проверка наличия записи в колонке 9
s = OldSheet.Cells(i, 9).Value
If IsNumeric(s) Then
'да указано число - записываем строку на новый лист
'перход на следующую свободную строку листа-результата
j = j + 1
PrintRow OldSheet, NewSheet, i, j, Cols
'Else
'иначе, считаем, что заказа нет - 0
End If
Next i
'запись в формате dbf
NewSheet.SaveAs "d:\Zakaz.dbf", xlDBF4
'запись в формате txt
'NewSheet.SaveAs "d:\Zakaz.txt", xlTextWindows
Else
MsgBox "Нет заказанного товара!", vbOKOnly + vbInformation, "Сообщение"
End If
End If
End Sub

Function PrintRow(FromSh As Worksheet, Sh As Worksheet, iRow As Integer, jRow As Integer, Cols As Integer)
'Функция будет переносить строку iRow из активного листа в строку jRow листа Sh
'(количество колонок - Cols)
Sh.Range(Sh.Cells(jRow, 1), Sh.Cells(jRow, Cols)).Value = _
FromSh.Range(FromSh.Cells(iRow, 1), FromSh.Cells(iRow, Cols)).Value
End Function
 
F

FireBall1991

Гость
#7
Tanya
Спасибо огромное... Но ещё пара деталей...
Мне сказали что лучше переделать... В данном коде копируется целая строчка из Excel.
Сказали что нужно чтобы в новом документе второй столбик из прайса копировался в первый, четвёртый во второй, а девятый в третий... При этом начинаться всё должно со второй строчки. А в первой должны быть заголовки . первый столбик: "CODE". Второй: "NAME" и третий это " AMOUNT".
Можете помочь??? попробовал сам но не получилось... Извините пожалуйста что загружаю вас но на самом деле надо. :D


P.S. И если совсем не сложно то можете дать материал как создать в документе Excel кнопку которая будет открывать документ с записаным в него макросом и выполнять его.
ПОЖАЛУЙСТА!!!
ЗАРАНЕЕ БЛАГОДАРЕН!
 
T

Tanya

Гость
#8
Sub Zakaz()
Dim i As Integer, iStart As Integer, iFinish As Integer, Cols As Integer
Dim NewSheet As Worksheet, OldSheet As Worksheet, j As Integer, s As String

iStart = 1
Set OldSheet = ActiveSheet
iFinish = OldSheet.UsedRange.Rows.Count - iStart - 1
If iFinish < iStart Then
MsgBox "Нет данных для просмотра"
Else
Cols = OldSheet.UsedRange.Columns.Count

'1) Проверяем сумму, заказанного товара в колонке 9
'Если она = 0, то заказ не сделан - сохранять нечего!
'при этом считаем, что отрицательных значений здесь не может быть
If Application.WorksheetFunction.Sum( _
OldSheet.Range(OldSheet.Cells(iStart, Cols), _
OldSheet.Cells(iFinish, Cols))) > 0 Then
'Добавляем новый лист - для сбора результата
Set NewSheet = ActiveWorkbook.Worksheets.Add(OldSheet)
'печатаем на этом листе строку заголовка
NewSheet.Cells(1,1).Value = "CODE"
NewSheet.Cells(1,2).Value = "NAME"
NewSheet.Cells(1,3).Value = "AMOUNT"


'счетчик строк на новом листе
j = 1
For i = iStart + 1 To iFinish
'проверка наличия записи в колонке 9
s = OldSheet.Cells(i, 9).Value
If IsNumeric(s) Then
'да указано число - записываем строку на новый лист
'перход на следующую свободную строку листа-результата
j = j + 1
PrintRow OldSheet, NewSheet, i, j
'Else
'иначе, считаем, что заказа нет - 0
End If
Next i
'запись в формате dbf
NewSheet.SaveAs "d:\Zakaz.dbf", xlDBF4
'запись в формате txt
'NewSheet.SaveAs "d:\Zakaz.txt", xlTextWindows
Else
MsgBox "Нет заказанного товара!", vbOKOnly + vbInformation, "Сообщение"
End If
End If
End Sub

Function PrintRow(FromSh As Worksheet, Sh As Worksheet, iRow As Integer, jRow As Integer)
'Функция будет переносить строку iRow из активного листа в строку jRow листа Sh
Sh.Cells(jRow, 1).Value = FromSh.Cells(iRow, 2).Value
Sh.Cells(jRow, 2).Value = FromSh.Cells(iRow, 4).Value
Sh.Cells(jRow, 3).Value = FromSh.Cells(iRow, 9).Value
End Function


P.S.
Открываем книгу, в которой будет кнопка, далее в меню Сервис - Настройка, в открывшемся окошке на вкладке Панели инструментов выбираем Элементы управления. Закрываем окошко.
Должна появиться новая панелька с различными элементами управления - выбираем Кнопку(указатель мыши изменится на крест) и в нужном месте листа рисуем кнопку
Щелкаем правой кнопкой мыши на кнопке выбираем команду Объект CommfndButton - Edit и изменяем надпись на кнопке
Снова щелкаем правой кнопкой мыши на кнопке выбираем команду Исходный текст - будет открыт редактор Visual Basic, в котором нужно будет написать макрос-обработчик нажатия кнопки, например:

Private Sub CommandButton1_Click()
Workbooks.Open("d:\Path\book.xls")
Run "book.xls!nn"
End Sub

Естественно, должен существовать файл d:\Path\book.xls и в нем должен быть макрос nn()

Возвращаемся в книгу и на панели элементов управления выключаем режим конструктора - самая первая кнопка на панели.
Нажимаем на созданную кнопку и проверяем результат
 
F

FireBall1991

Гость
#9
Tanya

Макрос теперь работает так как надо... Всё супер...
Осталась последняя проблемка. Кнопка.
Написал всё как ты сказала.
1. Открывается ещё одна таблица (именно в которой макрос), а этого не надо.
2 Макрос выполняется для открытого документа Excel в котором находиться. В данном случае в Book. А в Book и намёка нет на прайс какой либо.

Может можно как нить макрос в отдельный файл упаковать, чтобы он никак не был связан с какими либо таблицами, а при нажатии на кнопку программа его открывала и выполняла??? В самом прайсе макроса не должно быть. В нём только кнопка.
 
T

Tanya

Гость
#10
Можно свои макросы записать в отдельный файл, и сохранить как надсройку Excel (*.xla)
затем в меню сервис-надстройки по кнопке Обзор найти и выбрать этот файл
Теперь этого этот файл будет загружаться при открытии Excel, оставаясь невидимым
Следующий шаг - создание кнопки на панели инструментов, для этого в меню
Сервис-Настройка перейти на вкладку Команды, в списке Категории выбрать Макросы,
а в меню Команды выбрать Настраиваемая кнопка и перетянуть на панель инструментов.
Не закрывая окно Настройка нажать правой кнопкой мыши на добавленной кнопке - появится контекстное меню.
В этом меню можно изменить название кнопки, которое будет служить всплывающей подсказкой;
изменить значок на кнопке или оставить только название кнопки без значка и (самое главное!)
назначить макрос, который будет выполняться при нажатии на этой кнопке
Для этого выбираем команду Назначить макрос ... - откроется окно и в этом окне в поле Имя макроса ввести название своего макроса и нажать кнопку ОК. Теперь можно закрыть окно Настройка.
Теперь все должно работать (если я достаточно понятно описала :)))
 
F

FireBall1991

Гость
#11
Здравствуйте ещё раз.
Наврал я когда сказал что осталась только одна проблемка... Вот она последняя.. Это уже точно последняя...
Должна быть кнопка при нажатии на которую должно появиться окно "обзор" в котором надо выбрать документ Excel. В выбранном документе должен выполниться макрос. Макрос который должен выполниться у меня есть. Напишите пожалуйста код который надо повесит на кнопку.
Пожалуйста помогите.
Заранее благодарен

P.S. Tanya То что ты описала работает отлично. Но если например сеть компьютерная, то чтобы у всех была эта кнопка надо на каждом компьютере проделывать такую операцию???
 
T

Tanya

Гость
#12
само собой нужно на каждом компе проделывать такую операцию :)

Sub nn()
Dim i
With Application.FileDialog(msoFileDialogOpen)
.FilterIndex = 3
If .Show = -1 Then
On Error Resume Next
For Each i In .SelectedItems
Workbooks.Open i
Application.Run "MyMacro"
If Err Then Err.Clear
Next i
End If
End With
End Sub

MyMacro - имя запускаемого макроса

P.S. Очень и очень рекомендую почитать соответствующую литературу,
потому что, боюсь вопросы возникнут снова
хотя бы просто справку по VBA
 
F

FireBall1991

Гость
#13
Tanya
Спасибо. Если бы была возможность добавил бы к репутации твоей голосов 10.
 
F

FireBall1991

Гость
#14
Tanya
Ты оказалась права...
Не получается сделать так чтобы макрос жестко задал типы столбиков.
Первый и второй должны быть символьными а 3 числовым.

И ещё. Программа сохраняет файл в определённое место. А можно сделать так чтобы пользователь сам выбирал куда и под каким именем сохранить??? Если то ПОЖАЛУЙСТА...

P.S. Можешь дать ссылки на хорошие учебники по VB??? только не онлайн. А то если честно мне уже стыдно вопросы сюда писать. Помоги пожалуйста
Заранее благодарен!
 
F

FireBall1991

Гость
#15
НУ пожалуйста помогите...
Если потом ещё будут вопросы я не буду уже их задавать... Пожалуйста помогите
 
T

Tanya

Гость
#16
Не получается сделать так чтобы макрос жестко задал типы столбиков.
Первый и второй должны быть символьными а 3 числовым.
Если в смысле формата ячейки, то
ActiveSheet.Range("C:C").NumberFormat = "0.00" ' 2 знака после запятой
ActiveSheet.Range("C:C").NumberFormat = "0" ' округленние до целого
ActiveSheet.Range("C:C").NumberFormat = "#,0.000" ' 3 знака после запятой с разделителями разрядов
ActiveSheet.Range("A:B").NumberFormat = "@" ' текст

А можно сделать так чтобы пользователь сам выбирал куда и под каким именем сохранить
Можно, но нужно искать как :)
будет что-то подобное открытию файлов:
Application.FileDialog(msoFileDialogOpen)
только не msoFileDialogOpen, а, возможно msoFileDialogSave или msoFileDialogSaveAs
а дальше нужно открывать хелп и смотреть что к чему

Ссылок на хорошие учебники дать не могу, но по-моему сейчас много книг Excel+VBA
скорее всего они подойдут.
Хотя, вот у нас на работе есть книга "Excel, VBA, Internet в экономике и финансах" автор А.Гарнаев,
вроде бы неплохая.
Удачи
 
F

FireBall1991

Гость
#17
ActiveSheet.Range("C:C").NumberFormat = "0.00" ' 2 знака после запятой
ActiveSheet.Range("C:C").NumberFormat = "0" ' округленние до целого
ActiveSheet.Range("C:C").NumberFormat = "#,0.000" ' 3 знака после запятой с разделителями разрядов
ActiveSheet.Range("A:B").NumberFormat = "@" ' текст
С ячейками в А и В не получилось. точнее с ячейками столбика B всё нормально а вот с А проблема. В документе пока его не закрыл первый столбик считается числовым. но при открытии его заново в ячейке стоит число и он ему заново определяет формат. определяет как число. и весь столбик потом считает числом
 

Normann

Well-Known Member
09.08.2007
168
2
#18
<!--QuoteBegin-FireBall1991+14:08:2007, 12:29 -->
<span class="vbquote">(FireBall1991 @ 14:08:2007, 12:29 )</span><!--QuoteEBegin-->С ячейками в А и В не получилось. точнее с ячейками столбика B всё нормально а вот с А проблема. В документе пока его не закрыл первый столбик считается числовым. но при открытии его заново в ячейке стоит число и он ему заново определяет формат. определяет как число. и весь столбик потом считает числом
[snapback]75283" rel="nofollow" target="_blank[/snapback]​
[/quote]
А руками нельзя задать формат поля и сохранить?
 
F

FireBall1991

Гость
#19
А руками нельзя задать формат поля и сохранить?
1. даже если это делать руками то всё равно при открытии документа dbf он заново определяет числовой формат вместо текстового.
2. Надо чтобы всё делалось в макросе и участие человека было минимальным.
 

Normann

Well-Known Member
09.08.2007
168
2
#20
Ну тогда задавай формат поля программно при открытии документа (Workbook_Open). А вообще не совсем понятно о чем у тебя идет речь, лучше бы ты выложил код, а еще лучше весь исходник.
 
Статус
Закрыто для дальнейших ответов.