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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.11.2011, 20:04   #1
Onni
Форумчанин
 
Аватар для Onni
 
Регистрация: 28.12.2008
Сообщений: 134
По умолчанию VBA как указать пустую ячейку?

имеется код
Код:
Sub Êíîïêà2_Ùåë÷îê()

Dim n As Integer
Dim g As Integer

g = 1
n = 1

Do While Ëèñò1.Cells(n, 1) <> ""                               (*)
    
    g = n
    Do
        If Ëèñò1.Cells(n, 1) = Ëèñò1.Cells(g, 2) Then
        Ëèñò1.Cells(n, 5) = Ëèñò1.Cells(g, 3)
        GoTo Flag
        Else: Ëèñò1.Cells(n, 5) = 0
        End If
    g = g + 1
    Loop Until Ëèñò1.Cells(g, 2) <> ""                        (**)
Flag:
n = n + 1
Loop

End Sub
как задать в строке * и ** что ячейка должна быть пустой?
Вообще код правильный, несет хоть какой нибудь смысл?
Onni вне форума Ответить с цитированием
Старый 25.11.2011, 23:33   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Код несёт какой-то смысл)
Вот если бы вы сказали, что вам всё-таки нужно, и прикрепили пример файла,
мы бы предложили вам куда более быстрый и понятный код.

В вашем же случае, скорее всего, надо заменить <> на = в строке
Код:
Loop Until Ëèñò1.Cells(g, 2) <> ""
EducatedFool вне форума Ответить с цитированием
Старый 25.11.2011, 23:41   #3
Onni
Форумчанин
 
Аватар для Onni
 
Регистрация: 28.12.2008
Сообщений: 134
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Код несёт какой-то смысл)
Вот если бы вы сказали, что вам всё-таки нужно, и прикрепили пример файла,
мы бы предложили вам куда более быстрый и понятный код.

В вашем же случае, скорее всего, надо заменить <> на = в строке
Код:
Loop Until Ëèñò1.Cells(g, 2) <> ""
Ну радует что хоть он какой то смысл несет)

Заменила, не получается. Как вообще можно указать в условии что ячейка пустая?
Onni вне форума Ответить с цитированием
Старый 25.11.2011, 23:55   #4
VictorM
Старожил
 
Аватар для VictorM
 
Регистрация: 15.05.2008
Сообщений: 2,058
По умолчанию

Цитата:
Как вообще можно указать в условии что ячейка пустая?
ну наверное так
IsEmpty(cell)
или
SpecialCells(xlBlanks)
вот здесь еще посмотрите Как определить пустая или нет ячейка
"Дайте людям рыбы, и вы накормите их на весь день; научите их ловить рыбу - и вы накормите их на всю жизнь"
"Большое спасибо" - Z261597841314, R208907249777, U447361470499

Последний раз редактировалось VictorM; 25.11.2011 в 23:57.
VictorM вне форума Ответить с цитированием
Старый 26.11.2011, 00:16   #5
alex77755
Форумчанин
 
Аватар для alex77755
 
Регистрация: 14.02.2009
Сообщений: 753
По умолчанию

Можно пойти по другому пути: сначала определить посленюю занятую строку столбца(Cells(Rows.Count, 1).End(xlUp).Row), а потом: For Next
помогу решить контрольные VB6, VBA (недорого)
Alex77755@mail.ru
alex77755 вне форума Ответить с цитированием
Старый 27.11.2011, 18:12   #6
Onni
Форумчанин
 
Аватар для Onni
 
Регистрация: 28.12.2008
Сообщений: 134
По умолчанию

У меня не получается даже с вашими советами.
Кому не сложно посмотрите пожалуйста ещё раз....

Код:
Sub Êíîïêà2_Ùåë÷îê()

Dim n As Integer
Dim g As Integer

g = 2
n = 2

Do While IsEmpty(Cells(n, 1)) = True
    
    g = n
    Do
        If Data.Cells(n, 1) = Data.Cells(g, 2) Then
        Data.Cells(n, 5) = Data.Cells(g, 3)
        GoTo Flag
        Else: Data.Cells(n, 5) = 0
        End If
    g = g + 1
    Loop Until IsEmpty(Cells(g, 1)) = True
Flag:
n = n + 1
Loop

End Sub

Задание в след. :Нужно написать макрос который выполнял бы задачу: имеется столбцы A,B - они заполнены датами. далее С и Е. Е пустой, С заполнен. Нужно сравнить А с В так что если для ячейки А имеется равная в В, то Е=С(для строки в которой находиться сравниваемая ячейка А), а если нет то Е=0.
Проблема в том что в А значений больше чем в В. Я хотела условие цикла поставить как пустую ячейку, но чтобы я не ставила либо получается ошибка либо после первого же while - а работа заканчивается.
Onni вне форума Ответить с цитированием
Старый 27.11.2011, 18:42   #7
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Чувствую, можно сделать быстро на словаре/коллекции и массивах, но без примера делать - дело не благодарное в большинстве случаев...
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 27.11.2011, 18:45   #8
VictorM
Старожил
 
Аватар для VictorM
 
Регистрация: 15.05.2008
Сообщений: 2,058
По умолчанию

Цитата:
имеется столбцы A,B - они заполнены датами. далее С и Е. Е пустой,
А может лучше сам этот файлик, с "заполненными датами" выложите?
А то опять не так будет, или даты не те, или столбцы или еще что...
Бывало уже
"Дайте людям рыбы, и вы накормите их на весь день; научите их ловить рыбу - и вы накормите их на всю жизнь"
"Большое спасибо" - Z261597841314, R208907249777, U447361470499
VictorM вне форума Ответить с цитированием
Старый 27.11.2011, 19:54   #9
Onni
Форумчанин
 
Аватар для Onni
 
Регистрация: 28.12.2008
Сообщений: 134
По умолчанию

только вы потом если подправите, объясните как сделали. и в чем загвоздка была...
Вложения
Тип файла: rar task1_1.rar (57.6 Кб, 11 просмотров)
Onni вне форума Ответить с цитированием
Старый 27.11.2011, 20:18   #10
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Код:
Sub Кнопка2_Щелчок()
    Dim a(), b(), i&

    a = Range([c2], Range("A" & Rows.Count).End(xlUp)).Value
    ReDim b(1 To UBound(a), 1 To 1)

    With CreateObject("Scripting.Dictionary")
       ' .CompareMode = vbTextCompare 'это тут лишнее, но может пригодиться при сравнении строк

        For i = 1 To UBound(a)
            .Item(a(i, 1)) = a(i, 3)
        Next
        
        For i = 1 To UBound(a)
            b(i, 1) = .Item(a(i, 2))
        Next

        [e2].Resize(UBound(b)) = b

    End With

End Sub
Нули не вписывал - это можно сперва одним проходом по массиву сделать, но зачем?
Процентный формат тоже кодом не ставится - но можно добавить.
Пояснения нужны? Вроде даже пояснять нечего - см. помощь по словарям.
Или вот, рекомендую: http://www.excelworld.ru/forum/3-313-1


P.S. Кажется, условия перепутал - тогда так:
Код:
        For i = 1 To UBound(a)
            .Item(a(i, 2)) = a(i, 3)
        Next
        
        For i = 1 To UBound(a)
            b(i, 1) = .Item(a(i, 1))
        Next
или вариант 3:
Код:
        For i = 1 To UBound(a)
            .Item(a(i, 2)) = 1
        Next
        
        For i = 1 To UBound(a)
        If .exists(a(i, 1)) Then b(i, 1) = a(i, 3)
        Next
Кажется, правильно должно быть 3 ...
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 27.11.2011 в 20:38.
Hugo121 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужен Макрос для ввода данных в перую пустую ячейку диапазона valik65 Microsoft Office Excel 4 16.12.2010 16:01
Вернуть пустую ячейку Ruben Microsoft Office Excel 3 05.02.2010 16:20
Копирование данных на первую пустую ячейку kzld Microsoft Office Excel 8 15.07.2009 14:06
вставка формулы в ячейку (vba) pride Microsoft Office Excel 5 13.07.2009 09:26
Как в функции СЧЁТЕСЛИ указать критерий в виде ссыки на ячейку? CaustiC Microsoft Office Excel 1 05.12.2008 07:16