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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.05.2009, 16:06   #1
Иванов_ДМ
Пользователь
 
Регистрация: 17.02.2009
Сообщений: 96
По умолчанию Краткий список в нужный диапазон

Помогите, плиз, разобраться с макросом!
Нужно, чтобы макрос проверил столбец А в листе "Масс1НСРКол" и поместил краткий список значений (без повторов) в лист "СжМасс1КолБр" в столбец А, начиная с 13-й строки. Проблема в том, что он почему-то помещает их в диапазон, начиная с 10-й строки, снося имеющиеся в строках 10-12 данные.
Помогите побороть его!!!
Вложения
Тип файла: rar Макрос 1011.rar (16.2 Кб, 17 просмотров)
Иванов_ДМ вне форума Ответить с цитированием
Старый 18.05.2009, 16:15   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

Замените строку Range([A13], Cells(UBound(b, 1) + 1, "A")).Value = b

на строку Range([A13], Cells(UBound(b, 1) + 12, "A")).Value = b
или на строку [A13].Resize(UBound(b, 1)).Value = b
EducatedFool вне форума Ответить с цитированием
Старый 18.05.2009, 16:19   #3
Иванов_ДМ
Пользователь
 
Регистрация: 17.02.2009
Сообщений: 96
По умолчанию

Большое спасибо!
А почему он тогда начинал именно с 10-й?
Иванов_ДМ вне форума Ответить с цитированием
Старый 18.05.2009, 16:25   #4
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

Цитата:
А почему он тогда начинал именно с 10-й?
Строка Range([A13], Cells(UBound(b, 1) + 1, "A")).Value определяет диапазон для вставки по первой и последней ячейкам этого диапазона.

Одна из ячеек была всегда [A13], а вторая - в столбце A в строке UBound(b, 1) + 1
UBound(b, 1) - это количество обрабатываемых значений (в файле примера равно девяти)

Вот и получалось, что вставка производилась в диапазон с A13 по A10
EducatedFool вне форума Ответить с цитированием
Старый 18.05.2009, 16:33   #5
Иванов_ДМ
Пользователь
 
Регистрация: 17.02.2009
Сообщений: 96
По умолчанию

Теперь все понятно, спасибо!
Иванов_ДМ вне форума Ответить с цитированием
Старый 18.05.2009, 17:13   #6
Иванов_ДМ
Пользователь
 
Регистрация: 17.02.2009
Сообщений: 96
По умолчанию

Еще один вопрос: В макросе используются данные из листа Масс1НСРКол столбца A.
А если данные нужно взять из столбца скажем C, то что нужно поменять в макросе?
СК
Иванов_ДМ вне форума Ответить с цитированием
Старый 18.05.2009, 17:33   #7
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

Код:
Sub МассивБрендыКол()
    НомерСтолбца = 6: НомерПервойСтроки = 3    ' откуда берём данные
    НомерСтолбцаДляВставки = 7: НомерПервойСтрокиДляВставки = 2    ' куда вставляем данные

    Dim i As Long, j As Long, x As New Collection, a, b()
    Application.ScreenUpdating = False
    Sheets("СжМасс1КолБр").Activate
    Range(Cells(НомерПервойСтрокиДляВставки, НомерСтолбцаДляВставки), Cells(Rows.Count, НомерСтолбцаДляВставки)).ClearContents
    With Sheets("Масс1НСРКол")
        a = .Range(.Cells(НомерПервойСтроки, НомерСтолбца), .Cells(Rows.Count, НомерСтолбца).End(xlUp)).Value
    End With
    ReDim b(1 To UBound(a, 1), 1 To 1): j = 1
    For i = 1 To UBound(a, 1)
        If a(i, 1) <> "" Then
            On Error Resume Next: x.Add a(i, 1), CStr(a(i, 1))
            If Err = 0 Then
                b(j, 1) = a(i, 1): j = j + 1
            Else: On Error GoTo 0
            End If
        End If
    Next
    Cells(НомерПервойСтрокиДляВставки, НомерСтолбцаДляВставки).Resize(UBound(b, 1)).Value = b
End Sub
EducatedFool вне форума Ответить с цитированием
Старый 18.05.2009, 18:31   #8
Иванов_ДМ
Пользователь
 
Регистрация: 17.02.2009
Сообщений: 96
По умолчанию

Спасибо, все работает!!!
Иванов_ДМ вне форума Ответить с цитированием
Старый 28.07.2009, 21:23   #9
Иванов_ДМ
Пользователь
 
Регистрация: 17.02.2009
Сообщений: 96
По умолчанию

Educated Fool, а подскажите пожалуйста, как в этом коде сделать так, чтобы он помещал данные в диапазон "B2" и далее по столбцам направо (а не по строкам вниз), ну то есть транспонировал их в строку?
Заранее спасибо!
Иванов_ДМ вне форума Ответить с цитированием
Старый 28.07.2009, 21:51   #10
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

Например, так:
Код:
Sub Заполнение()
    Dim cell As Range, ra As Range: Application.ScreenUpdating = False
    Dim coll As New Collection: On Error Resume Next
    Set ra = Range([A3], Range("A" & Rows.Count).End(xlUp))
    For Each cell In ra.Cells
        Err.Clear: coll.Add cell, cell & "z"
        If Err.Number <> 457 Then Cells(2, coll.Count + 1) = cell
    Next cell
End Sub

Sub Очистка()
    [b2:iv2].ClearContents
End Sub
EducatedFool вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не открывается нужный файл Ruska882009 Операционные системы общие вопросы 4 24.05.2009 21:30
Ищу нужный тип строки Altera Общие вопросы Delphi 10 27.04.2009 08:36
Найти краткий путь в лабиринте foz Помощь студентам 1 15.04.2009 21:41
Указать нужный тип переменной KiDoki Общие вопросы Delphi 3 06.10.2008 17:11
Как написать в коде чтобы диапазон А копировался как значение в диапазон В. Dorvir Microsoft Office Excel 12 23.05.2008 22:11