Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.01.2012, 06:54   #11
subluna
Пользователь
 
Регистрация: 08.01.2012
Сообщений: 14
По умолчанию

и код перерисовала вот так:
Код:
Sub FindererALL2()
Dim FD, firstAddress, adrs, actList, OriginalRange As String
actList = ActiveSheet.Name 'на активном листе
ActiveSheet.Shapes(Application.Caller).Select 'клик по синей кнопке, получили значение надписи
FD = Selection.Characters.Text ' и присвоили переменной FD
If FD = "" Then Exit Sub ' если кнпк ОТМЕНА - отказ от поиска
Sheets("Ãëàâíûé îôèñ").Select 'перешли на лист с базой
Dim c As Range: Set c = Range("C:C").Find(FD) ' поиск №каб если ничего нету - выход из макроса
If c Is Nothing Then MsgBox "Оборудование по " & FD & " не найдено", vbExclamation: Exit Sub 'с сообщением НЕТУ НИЧЕГО
firstAddress = c.Address 'иначе - поехали перебирать
c.Select
OriginalStr = ""
Do
    adrs = adrs & vbLf & c.Address(0, 0)
    n = c.Row
      OriginalRange = OriginalRange & vbLf & Range("B" & n) & " " & Range("D" & n) & " " & Range("e" & n) & " " & Range("f" & n) & " " & Range("h" & n) & " " & Range("g" & n) & " " & Range("q" & n) & " " & Range("r" & n) ' и напихивать в офигеть какую длиную строку значения ячеек
    Union(Selection, c).Select
    Set c = Range("c:c").FindNext(c)
Loop While c.Address <> firstAddress ' и так пока условие выполняется
Sheets(actList).Select ' перешли на лист с кнопками
MsgBox "Значение """ & FD & """ найдено в ячейке:" & adrs, vbOKOnly
MsgBox "Значению """ & FD & """ соответствуют:" & OriginalRange, vbInformation
End Sub
но КАК КАК ЖЕ мне построить из найденных строк таблицу в ListBox?
з.ы. хочу добавить, что если бы не ваш форум, я б ето не нарисовала! СПАСИБО!
з.з.ы. А Игорю - отдельное спасибо, что пароль на макросы так и не прислал, за то я по научилась немного )
subluna вне форума Ответить с цитированием
Старый 09.01.2012, 10:57   #12
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Такой полуфабрикат:
Код:
Option Explicit

Sub tt()
    Dim x As Range: Application.ScreenUpdating = False
    Dim a(), FD
    FD = InputBox("ВВЕДИТЕ ИСКОМОЕ СЛОВО ИЛИ ЧИСЛО", "Поиск оборудования")
    If FD = "" Then Exit Sub    ' если кнопк ОТМЕНА - отказ от поиска
    Rows.Hidden = False
    Set x = [C:C].Find(FD, , , xlWhole)
    If Not x Is Nothing Then
        [C:C].ColumnDifferences(x).EntireRow.Hidden = True
        a = ActiveSheet.UsedRange.SpecialCells(xlCellTypeVisible).Value
        Rows.Hidden = False
    End If
    Application.ScreenUpdating = True
End Sub
Теперь массив а можно выгрузить куда угодно, например в листбокс.
Для этого его можно объявить публично, а не в этом макросе, и потом использовать в форме.
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 09.01.2012 в 11:46. Причина: EntireRow явно лишнее было...
Hugo121 вне форума Ответить с цитированием
Старый 09.01.2012, 11:38   #13
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Т.е. так:
Код:
Option Explicit

Public a()

Sub tt()
    Dim x As Range: Application.ScreenUpdating = False
    Dim FD
    FD = InputBox("ВВЕДИТЕ ИСКОМОЕ СЛОВО ИЛИ ЧИСЛО", "Поиск оборудования")
    If FD = "" Then Exit Sub    ' если кнопк ОТМЕНА - отказ от поиска
    Rows.Hidden = False
    Set x = [C:C].Find(FD, , , xlWhole)
    If Not x Is Nothing Then
        [C:C].ColumnDifferences(x).EntireRow.Hidden = True
        a = ActiveSheet.UsedRange.SpecialCells(xlCellTypeVisible).Value
        Rows.Hidden = False
    End If
    UserForm1.Show
    Application.ScreenUpdating = True
End Sub
И в форме:
Код:
Private Sub CommandButton1_Click()
Me.Hide
tt
End Sub

Private Sub UserForm_Activate()
    ListBox1.List = a
    ListBox1.ColumnCount = UBound(a, 2)
End Sub
Предварительно на существующую форму добавьте листбокс ListBox1.
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 09.01.2012 в 11:55. Причина: EntireRow явно лишнее было...
Hugo121 вне форума Ответить с цитированием
Старый 09.01.2012, 12:48   #14
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

На случай, если ничего не найдётся, можно поступить так:
перед формированием массива из найденного, можно сделать массив с одной записью:

Код:
    ReDim a(1 To 1, 1 To 1)
    a(1, 1) = "Нет данных!!!"
Тогда форма покажет этот массив, если не будет другого.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 09.01.2012, 13:47   #15
subluna
Пользователь
 
Регистрация: 08.01.2012
Сообщений: 14
По умолчанию

Спасибо, Hugo121!!
сейчас попробую))
Здоровско так у вас тут, никто не тыкает носом в непрофессионализм, все помогают. Я так рада была сегодня, когда код заработал и даже немного с ListBox'ом поэкспериментила ))
subluna вне форума Ответить с цитированием
Старый 09.01.2012, 13:58   #16
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Приятно видеть, когда человек старается что-то сделать сам, и видно, что помогаешь с толком.
Не то, что некоторые бездельники - сделайте мне, я сам никогда это использовать не буду... А потом сидят в офисах, на калькуляторе считают... как и обещали
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 10.01.2012, 15:06   #17
subluna
Пользователь
 
Регистрация: 08.01.2012
Сообщений: 14
По умолчанию


вот так теперь выглядит процедура:
Код:
Option Explicit ' разрешаем неявное объявление переменных чтоб потом не догадываться чего в процедуру не передали
Public a() ' объявляем публичную переменную в которую  запись будем писать для запуска в любом модуле
Public actList As String ' объявляем публичную переменную в которую  запись будеми писать для запуска в любом модуле

Sub ttab() ' процедура ttab
    Dim x As Range, FD ' объявили переменные
    Application.ScreenUpdating = False 'запретили автообновление окна приложения_
                                       'чтобы окна не моргали
   actList = ActiveSheet.Name 'запомнили активный лист
  ActiveSheet.Shapes(Application.Caller).Select 'клик по синей кнопке, получили значение надписи
   FD = Selection.Characters.Text ' и присвоили переменной FD
If FD = "" Then Exit Sub ' если кнпк ОТМЕНА - отказ от поиска
    Sheets("Главный офис").Select 'перешли на лист с базой
    Set x = [C:C].Find(FD, , , xlWhole) ' назначаем перем х область яч столбец С _
                                        ' и ищем вхождение FD полное совпадение (xlWhole)
    If Not x Is Nothing Then 'если в х написалось чегот найденное то
       [C:C].ColumnDifferences(x).EntireRow.Hidden = True 'скрываем все строки не попавшие в сравнение
        Rows("1:1").SpecialCells(xlCellTypeConstants).EntireColumn.Hidden = True 'скрываем все ненужные столбцы
       a = ActiveSheet.UsedRange.SpecialCells(xlCellTypeVisible).Value 'и передаем в публичную переменную фсе что осталось
       UserForm2.ListBox1.ColumnHeads = True
       UserForm2.ListBox1.List = a
       UserForm2.Label2.Caption = FD
        Rows.Hidden = False ' а теперь покажем фсе строки опять
        Columns.Hidden = False ' а теперь покажем фсе столбцы опять

    End If 'ну и завершим проверку
    UserForm2.Show 'покажем форму с ListBox'ом
    Sheets(actList).Select ' перешли на лист с кнопками
    Application.ScreenUpdating = True 'а теперь пусть окна ёкселя моргают при вызовах методов
End Sub
и код формы:
Код:
Private Sub CommandButton1_Click()
Me.Hide
End Sub

Private Sub ListBox1_Click()
ColumnHeads = True
ColumnCount = 8
ColumnWidths = "20;15;4;12;7;2;8;16"
End Sub
но в ListBox заголовки столбцов передать не могу. они в row5 на листе с базой, а в переменную a передается только видимая область. можно как то эту область расширить, чтобы туда всегда первой попадала row5?
Изображения
Тип файла: jpg про VBA и listBox1.JPG (36.6 Кб, 14 просмотров)
Вложения
Тип файла: rar задача10012012-последнее изменение.rar (127.1 Кб, 7 просмотров)
subluna вне форума Ответить с цитированием
Старый 10.01.2012, 16:08   #18
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Если заголовки столбцов постоянны (как это обычно бывает), то их можно заранее написать на форме в виде Labels. А можно и динамически.
Можно создать другой массив чуть повыше, заполнить его первую строку заголовками (взять отдельным ходом с листа или просто забить известные надписи), далее переложить данные из массива a.
Можно после 'скрываем все ненужные столбцы - СТРОКИ!!! открыть первую строку с заголовками, и уж потом брать видимые в массив
Можно ещё что-нибудь придумать...
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 10.01.2012, 17:04   #19
subluna
Пользователь
 
Регистрация: 08.01.2012
Сообщений: 14
По умолчанию

Код:
Rows("5:5").Hidden = False
       Rows("1:1").SpecialCells(xlCellTypeConstants).EntireColumn.Hidden = True 'скрываем все ненужные столбцы
       a = ActiveSheet.UsedRange.SpecialCells(xlCellTypeVisible).Value 'и передаем в публичную переменную фсе что осталось
и на листе с базой картинка правильная а в ListBox передается тольк row5
Hygo121, голубчик, где я туплю?
у меня опять ночь уже(
subluna вне форума Ответить с цитированием
Старый 10.01.2012, 17:23   #20
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Нда, в массив так данные не берутся - только первая строка, т.е. первый слитный диапазон... Не знал.
У кого какие предложения? Как сделать дальше оптимально?
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Процедура с параметром MD1 Паскаль, Turbo Pascal, PascalABC.NET 1 29.11.2011 18:25
Процедура с параметром и без параметра admin22 Паскаль, Turbo Pascal, PascalABC.NET 2 27.09.2011 15:44
Процедура с изменяемым параметром Utkin Общие вопросы Delphi 11 30.11.2010 14:41
Процедура с параметром динамическим массивом. VintProg Общие вопросы Delphi 12 11.06.2010 13:12
Ajax - вызывает ошибку в IE kalexi JavaScript, Ajax 2 04.05.2010 17:03