Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Программирование под Windows > Visual Basic
Перезагрузить страницу копирование данных через ListBox в Excel
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
And_rey And_rey вне форума
Member
 
Сообщений: 13
Сказал(а) спасибо: 3
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 16.11.2015
По умолчанию копирование данных через ListBox в Excel - 16.11.2015, 16:17

Подскажите как правильно написать код, пример файла вкладываю. В общем
есть файл с 2-мя страницами, "каталог" и "заказ". Нажав "оформить заказ" нужно при выбрать позицию, при необходимости изменить размеры и поставить количество. Нужно копировать выбранную строку на другую страницу, но в другом порядке следования столбцов. (пример результата на странице заказ). Заранее спасибо.
Миниатюры
1.jpg  
Вложения
Тип файла: zip Книга1-1.zip (19.5 Кб, 9 просмотров)
Ответить с цитированием
  (#2 (permalink)) Старый
pashulka pashulka вне форума
Member
 
Сообщений: 1,872
Сказал(а) спасибо: 2
Поблагодарили 57 раз(а) в 53 сообщениях
Регистрация: 11.03.2005
По умолчанию 16.11.2015, 20:55

Если не принимать во внимание тот факт, что количество должно быть целым и больше 0, то можно и так :
VB Код:
Private Sub UserForm_Initialize()
    ListBox1.ColumnCount = 5
    ListBox1.ColumnHeads = True
    With Application.Range("Каталог")
         ListBox1.RowSource = .Offset(1).Resize(.Rows.Count - 1).Address '(External:=True)
   End With
End Sub

Private Sub CommandButton1_Click()
    Dim iRow1&, iRow2&
    iRow1 = ListBox1.ListIndex
   
    If iRow1 = -1 Then MsgBox "Выберите товар": Exit Sub
   
    With ThisWorkbook.Worksheets("Заказ")
         iRow2 = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
         .Cells(iRow2, 1) = ListBox1.List(iRow1, 0) 'Товар
        .Cells(iRow2, 5) = ListBox1.List(iRow1, 2) 'Цена
        .Cells(iRow2, 4) = ListBox1.List(iRow1, 1) 'Цвет
        .Cells(iRow2, 6) = Val(TextBox3)           'Количество
        .Cells(iRow2, 2) = IIf(Len(TextBox1), Val(TextBox1), ListBox1.List(iRow1, 3)) 'Длина
        .Cells(iRow2, 3) = IIf(Len(TextBox2), Val(TextBox2), ListBox1.List(iRow1, 4)) 'Высота
   End With
End Sub
Ответить с цитированием
Пользователь сказал cпасибо:
And_rey (16.11.2015)
  (#3 (permalink)) Старый
And_rey And_rey вне форума
Member
 
Сообщений: 13
Сказал(а) спасибо: 3
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 16.11.2015
По умолчанию 16.11.2015, 22:42

Да, все получилось. Подскажите еще, как на ListBox можно поместить картинку к каждому товару? Допустим в таблице "каталог" в столбце G будут находится рисунки товаров, как их правильно вставить?
Ответить с цитированием
  (#4 (permalink)) Старый
And_rey And_rey вне форума
Member
 
Сообщений: 13
Сказал(а) спасибо: 3
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 16.11.2015
По умолчанию 16.11.2015, 23:00

И еще, для товара есть длина и высота по умолчанию, хотелось бы при выделении строки в с товаром ListBox, эти размеры появлялись бы в TextBox, их можно или поменять, или оставить, только указам количество. Спасибо.
Ответить с цитированием
  (#5 (permalink)) Старый
pashulka pashulka вне форума
Member
 
Сообщений: 1,872
Сказал(а) спасибо: 2
Поблагодарили 57 раз(а) в 53 сообщениях
Регистрация: 11.03.2005
По умолчанию 16.11.2015, 23:16

На мой взгляд, проще :
- расположить картинки в отдельной папке
- изменить имена файлов так, чтобы они совпадали с названием товара
- использовать какой-нибудь элемент управления, который может показывать картинки, например, Image
- по мере необходимости, загружать картинки, используя следующий синтаксис Image1.Picture = LoadPicture("C:\Папка_с_картинками\Имя_файла.gif")

Это позволит существенно уменьшить вес рабочей книги, ибо вся графика будет храниться отдельно.

Если же отделить котлету от мух нельзя, то есть несколько различных вариантов :
1) Создать на рабочем листе для каждой картинки свой Label или Image и хранить её там
2) Создать пустую диаграмму, по мере необходимости, копировать туда картинку, экпортировать диаграмму (ибо из всех Shape только у неё есть метод .Export) и загружать полученную картинку в Image
3) Тот же алгоритм, только вместо диаграммы, использовать функции WinAPI ()
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
pashulka pashulka вне форума
Member
 
Сообщений: 1,872
Сказал(а) спасибо: 2
Поблагодарили 57 раз(а) в 53 сообщениях
Регистрация: 11.03.2005
По умолчанию 16.11.2015, 23:21

Цитата:
Сообщение от And_rey Посмотреть сообщение
хотелось бы при выделении строки в с товаром ListBox, эти размеры появлялись бы в TextBox
VB Код:
Private Sub ListBox1_Click()
    With ListBox1
         If .ListIndex = -1 Then Exit Sub
         TextBox1 = .List(.ListIndex, 3)
         TextBox2 = .List(.ListIndex, 4)
    End With
End Sub

Цитата:
Сообщение от And_rey Посмотреть сообщение
... их можно или поменять, или оставить, только указам количество
Можно изначально установить у этих текстовых полей (длина, высота) значение свойства .Enabled как False, а затем, менять его, в зависимости от наличия/отсутствия данных в третьем поле (кол-во)

Последний раз редактировалось pashulka; 16.11.2015 в 23:27
Ответить с цитированием
  (#7 (permalink)) Старый
And_rey And_rey вне форума
Member
 
Сообщений: 13
Сказал(а) спасибо: 3
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 16.11.2015
По умолчанию 17.11.2015, 15:00

Подскажите, хочу вставить в функцию для кнопки такой текст
With Application.Range("Каталог")
.Cells(iRow1 + 2, 4) = Val(TextBox1) 'Длина
.Cells(iRow1 + 2, 5) = Val(TextBox2) 'высота
End With

В общем функция теперь выглядит так:

Private Sub CommandButton1_Click()
Dim iRow1&, iRow2&, iRow3&
iRow1 = ListBox1.ListIndex


If iRow1 = -1 Then MsgBox "Выберите товар": Exit Sub

With Application.Range("Каталог")
.Cells(iRow1 + 2, 4) = Val(TextBox1) 'Длина
.Cells(iRow1 + 2, 5) = Val(TextBox2) 'высота
End With


With ThisWorkbook.Worksheets("Заказ")
iRow2 = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
.Cells(iRow2, 1) = ListBox1.List(iRow1, 0) 'Товар
.Cells(iRow2, 5) = ListBox1.List(iRow1, 2) 'Цена
.Cells(iRow2, 4) = ListBox1.List(iRow1, 1) 'Цвет
.Cells(iRow2, 6) = Val(TextBox3) 'Количество
.Cells(iRow2, 2) = IIf(Len(TextBox1), Val(TextBox1), ListBox1.List(iRow1, 3)) 'Длина
.Cells(iRow2, 3) = IIf(Len(TextBox2), Val(TextBox2), ListBox1.List(iRow1, 4)) 'Высота
End With
End Sub

Т.е хочу чтобы, вписав размеры, они заменились в каталоге и включились в заказ. В итоге строчка для Длины работает, а вторя, для высоты, не сохраняется, остается значение по умолчанию. Почему так?
Ответить с цитированием
  (#8 (permalink)) Старый
pashulka pashulka вне форума
Member
 
Сообщений: 1,872
Сказал(а) спасибо: 2
Поблагодарили 57 раз(а) в 53 сообщениях
Регистрация: 11.03.2005
По умолчанию 17.11.2015, 16:00

VB Код:
Private StopChange As Boolean

Private Sub UserForm_Initialize()
    TextBox1.Enabled = False
    TextBox2.Enabled = False
    ListBox1.ColumnCount = 5
    ListBox1.ColumnHeads = True
    With Application.Range("Каталог")
         ListBox1.RowSource = .Offset(1).Resize(.Rows.Count - 1).Address '(External:=True)
   End With
End Sub

Private Sub ListBox1_Click()
    With ListBox1
         If .ListIndex = -1 Or StopChange = True Then Exit Sub
         TextBox1 = .List(.ListIndex, 3)
         TextBox2 = .List(.ListIndex, 4)
         TextBox3 = "0" 'Or ""
   End With
End Sub

Private Sub TextBox3_Change()
    TextBox1.Enabled = CBool(TextBox3.TextLength)
    TextBox2.Enabled = TextBox1.Enabled 'CBool(TextBox3.TextLength)
End Sub

Private Sub CommandButton1_Click()
    Dim iRow1&, iRow2&
    iRow1 = ListBox1.ListIndex
   
    If iRow1 = -1 Then MsgBox "Выберите товар": Exit Sub
   
    StopChange = True
    With Application.Range("Каталог")
        .Cells(iRow1 + 2, 4) = Val(TextBox1) 'Длина
       .Cells(iRow1 + 2, 5) = Val(TextBox2) 'Высота
   End With
    StopChange = False 'Not StopChange
   
    With ThisWorkbook.Worksheets("Заказ")
         iRow2 = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
         .Cells(iRow2, 1) = ListBox1.List(iRow1, 0) 'Товар
        .Cells(iRow2, 5) = ListBox1.List(iRow1, 2) 'Цена
        .Cells(iRow2, 4) = ListBox1.List(iRow1, 1) 'Цвет
        .Cells(iRow2, 6) = Val(TextBox3)           'Количество
        .Cells(iRow2, 2) = Val(TextBox1)           'Длина
        .Cells(iRow2, 3) = Val(TextBox2)           'Высота
   End With
End Sub
Ответить с цитированием
Пользователь сказал cпасибо:
And_rey (17.11.2015)
  (#9 (permalink)) Старый
And_rey And_rey вне форума
Member
 
Сообщений: 13
Сказал(а) спасибо: 3
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 16.11.2015
По умолчанию 17.11.2015, 17:44

Цитата:
Сообщение от pashulka Посмотреть сообщение
Если же отделить котлету от мух нельзя, то есть несколько различных вариантов :
1) Создать на рабочем листе для каждой картинки свой Label или Image и хранить её там
2) Создать пустую диаграмму, по мере необходимости, копировать туда картинку, экпортировать диаграмму (ибо из всех Shape только у неё есть метод .Export) и загружать полученную картинку в Image
3) Тот же алгоритм, только вместо диаграммы, использовать функции WinAPI ()
Может тогда подскажите как правильно вставить рисунки для такого варианта? Объем книги не имеет значения, конечно хотелось бы чтобы картинки были на против каждой строки, но можно и при выделении строки показывать только одну картинку.
Миниатюры
2.jpg  
Ответить с цитированием
  (#10 (permalink)) Старый
pashulka pashulka вне форума
Member
 
Сообщений: 1,872
Сказал(а) спасибо: 2
Поблагодарили 57 раз(а) в 53 сообщениях
Регистрация: 11.03.2005
По умолчанию 17.11.2015, 18:03

ListBox изначально не предназначен для вывода картинок построчно.
Если Вы не хотите использовать простые пути, а именно, хранение графики отдельно, то здесь можно найти пример, позволяющий получить желаемое изображение, причём как с использованием временного файла, так и без оного.
Ответить с цитированием
  (#11 (permalink)) Старый
And_rey And_rey вне форума
Member
 
Сообщений: 13
Сказал(а) спасибо: 3
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 16.11.2015
По умолчанию 17.11.2015, 20:42

Спасибо, буду пробовать разобраться.
Ответить с цитированием
  (#12 (permalink)) Старый
And_rey And_rey вне форума
Member
 
Сообщений: 13
Сказал(а) спасибо: 3
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 16.11.2015
По умолчанию 18.11.2015, 09:44

Не хочу сильно надоедать, но нужна еще помощь. Т.к товаров в каталоге будет много, нужно группировать их по разделам, при нажатии на "раздел" отображать в ListBox1 только товары для этого раздела. Я группе товаров раздела присвоил имя (раздел 1 и раздел2) эти имена отображаю в Listbox2. через RowSource.
Также хотелось бы один TextBox для значения длина, заменить на ComboBox1 (в каталоге товаров тоже сделан список через проверку данных), принцип работы остается тот же, при выделении товара, появляются только те значения в списке, которые назначены для этого товара, это значение можно заменить, при нажатии "включить в заказ" заменяется длина и в каталоге и включается в заказ. Заранее спасибо.
Миниатюры
1.jpg  
Вложения
Тип файла: zip Книга1-1.zip (25.3 Кб, 12 просмотров)
Ответить с цитированием
Ads
  (#13 (permalink)) Старый
And_rey And_rey вне форума
Member
 
Сообщений: 13
Сказал(а) спасибо: 3
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 16.11.2015
По умолчанию 18.11.2015, 22:04

Тема все еще актуальна, решил сделать поиск по разделам вот так для ListBox2

Private Sub ListBox2_Click()
Dim iidx As Long
Dim s As String
iidx = ListBox2.ListIndex
If iidx = -1 Then Exit Sub

s = ListBox2.List(iidx)
ListBox1.RowSource = Range(Replace(s, " ", "_")).Address
End Sub

Все в принципе работает, но если у меня активен лист "Каталог", то .Address, берется с этого листа. Если же форма открыта и при активном листе заказа .Address берется уже с листа "Заказ". Как это избежать, хочу иметь возможность работать с формой и на однм листе ни на втором.
Ответить с цитированием
  (#14 (permalink)) Старый
pashulka pashulka вне форума
Member
 
Сообщений: 1,872
Сказал(а) спасибо: 2
Поблагодарили 57 раз(а) в 53 сообщениях
Регистрация: 11.03.2005
По умолчанию 18.11.2015, 22:55

Цитата:
Сообщение от And_rey Посмотреть сообщение
Если же форма открыта и при активном листе заказа .Address берется уже с листа "Заказ". Как это избежать, хочу иметь возможность работать с формой и на однм листе ни на втором.
Избежать очень просто - достаточно задать себе вопрос, а зачем автор, использовав свойство .Address оставил комментарий. Затем прочитать справку, касательно данного свойства, и использовать .Address(External:=True)
Ответить с цитированием
  (#15 (permalink)) Старый
pashulka pashulka вне форума
Member
 
Сообщений: 1,872
Сказал(а) спасибо: 2
Поблагодарили 57 раз(а) в 53 сообщениях
Регистрация: 11.03.2005
По умолчанию 18.11.2015, 23:04

Второй вариант может заключаться в том, что Вы самостоятельно укажите рабочий лист, т.е. Каталог1!A1:A10
Ответить с цитированием
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
VBA в Excel ? listbox mari.apple Visual Basic 0 29.10.2012 03:43
Копирование таблиц из excel в word junkey Visual Basic 2 23.01.2012 21:45
VBA:MS Word - MS Excel копирование текста Glenader Visual Basic 9 27.01.2011 13:53
Копирование ячеек через заданный интевал времени doubter Visual Basic 3 30.11.2007 21:57
Копирование данных из одной базы данных в другую LordMatrix C++ Builder 2 22.05.2006 18:01
При попытке вывода данных в Excel через OLE выдает ошибку доступа к памяти WWWovan C++ Builder 2 05.04.2006 16:44
VBA+Excel & ListBox VBAser Visual Basic 7 11.01.2006 03:27
Excel: поиск и вывод отобранных значений в ListBox keksm Visual Basic 7 22.09.2005 12:54
Копирование данных как осуществить Sergey5186 .NET 1 21.06.2005 10:30
копирование данных из Excel в Access imported_любовь Visual Basic 3 31.05.2004 15:26
Копирование данных из программы на VC++ FlyDead Visual C++ 0 14.10.2003 15:01
Супербыстрая выгрузка в Excel данных через С++ Anonymous C++ Builder 3 17.07.2003 20:19



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов