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

Тема в разделе "Visual Basic", создана пользователем FireBall1991, 26 июн 2007.

Статус темы:
Закрыта.
  1. FireBall1991

    FireBall1991 Гость

    Здраствуйте!
    Мне в короткие сроки надо написать программу на 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>
     
  3. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    <!--QuoteBegin-????+26:06:2007, 16:27 -->
    <span class="vbquote">(???? @ 26:06:2007, 16:27 )</span><!--QuoteEBegin-->что за формат такой
    [snapback]70655" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    Аффтар что напутал Гугл такой формат нашёл - но это явно не то что надо
    Слив не защитан :)
     
  4. FireBall1991

    FireBall1991 Гость

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

    FireBall1991 Гость

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

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

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

    Tanya Гость

    Есть прайс лист где в 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
     
  7. FireBall1991

    FireBall1991 Гость

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


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

    Tanya Гость

    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()

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

    FireBall1991 Гость

    Tanya

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

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

    Tanya Гость

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

    FireBall1991 Гость

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

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

    Tanya Гость

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

    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
     
  13. FireBall1991

    FireBall1991 Гость

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

    FireBall1991 Гость

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

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

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

    FireBall1991 Гость

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

    Tanya Гость

    Если в смысле формата ячейки, то
    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 в экономике и финансах" автор А.Гарнаев,
    вроде бы неплохая.
    Удачи
     
  17. FireBall1991

    FireBall1991 Гость

    С ячейками в А и В не получилось. точнее с ячейками столбика B всё нормально а вот с А проблема. В документе пока его не закрыл первый столбик считается числовым. но при открытии его заново в ячейке стоит число и он ему заново определяет формат. определяет как число. и весь столбик потом считает числом
     
  18. Normann

    Normann Well-Known Member

    Регистрация:
    9 авг 2007
    Сообщения:
    168
    Симпатии:
    2
    <!--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]
    А руками нельзя задать формат поля и сохранить?
     
  19. FireBall1991

    FireBall1991 Гость

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

    Normann Well-Known Member

    Регистрация:
    9 авг 2007
    Сообщения:
    168
    Симпатии:
    2
    Ну тогда задавай формат поля программно при открытии документа (Workbook_Open). А вообще не совсем понятно о чем у тебя идет речь, лучше бы ты выложил код, а еще лучше весь исходник.
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей