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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.01.2012, 15:50   #1
Bape}l{ka
Форумчанин
 
Аватар для Bape}l{ka
 
Регистрация: 25.05.2011
Сообщений: 249
По умолчанию как правильно завершить цикл?

привет всем еще раз!

надо: чтобы все цифры в таблице сдвинулись к левому краю, т.е. чтобы между ними не было пустых ячеек
есть код, но не совсем правильно работает - сдвигается первая цифра в строке, а последующие остаются на местах Т_Т

думаю все из-за Exit For, но ничего альтернативного в голову не приходит. подскажите, пожалуйста, как поправить

Код:
Sub SdvigVlevo()
    Dim x As Integer
    
    Call VBABrand.Subs_.DefinitionSelectionRowCol
    
    For Roww = FirstRow To MaxRow
        For Each iCell In Range(Cells(Roww, FirstCol), Cells(Roww, MaxCol))
            If Not IsEmpty(iCell) Then
                For x = 0 To (iCell.Columns.Count - FirstCol + 1)
                    If IsEmpty(Cells(Roww, FirstCol + x)) Then
                        Cells(Roww, FirstCol + x) = iCell.Value
                        iCell = ""
                        Exit For
                    End If
                Next x
            End If
        Next iCell
    Next Roww
    
End Sub
думала сделать через Do Until, но тоже что-то не то выходит

пример: пример сдвига.rar

Последний раз редактировалось Bape}l{ka; 12.01.2012 в 21:13.
Bape}l{ka вне форума Ответить с цитированием
Старый 12.01.2012, 15:56   #2
kuklp
Участник клуба
 
Регистрация: 02.05.2010
Сообщений: 1,390
По умолчанию

Почему без этих многочисленных циклов в цикле не удалить все пустые в диапазоне со сдвигом влево?
Код:
Sub SdvigVlevo()
    Call VBABrand.Subs_.DefinitionSelectionRowCol
    Range(Cells(FirstRow, FirstCol), Cells(MaxRow, MaxCol)).SpecialCells(4).Delete Shift:=xlToLeft
End Sub
mailto: kuklp60@gmail.com, ящики для благодарностей:
WM Z206653985942, R334086032478, U238399322728

Последний раз редактировалось kuklp; 12.01.2012 в 16:04.
kuklp вне форума Ответить с цитированием
Старый 12.01.2012, 16:03   #3
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

может так?
Код:
activesheet.cells.specialcells(xlcelltypeblanks).delete Shift:=xlToLeft
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 12.01.2012, 17:17   #4
Bape}l{ka
Форумчанин
 
Аватар для Bape}l{ka
 
Регистрация: 25.05.2011
Сообщений: 249
По умолчанию

удалять нельзя, т.к. я применяю это не для всех данных на листе, а только для части, а остальное должно остаться на своих местах

по вашим способам сдвигается по всей строке

но вы подали идею - может как-то сделать СДВИГ?? но у меня сдвигать именно значения не получается.. в прошлый раз я вырезала-вставляла. но в данном случае при cut-paste тоже нужен будет цикл и остается та же проблема Т_Т

люди, хеелп!

Последний раз редактировалось Bape}l{ka; 12.01.2012 в 17:48.
Bape}l{ka вне форума Ответить с цитированием
Старый 12.01.2012, 17:46   #5
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Код:
Sub SdvigVlevo()
  Call VBABrand.Subs_.DefinitionSelectionRowCol
  for r = firstrow to maxrow
    c = range(cells(r,firstcol), cells(r,maxcol)).SpecialCells(4).count
    if c > 0 then range(r,maxcol+1).resize(1, c).Insert Shift:=xlToRight
  next
  Range(Cells(FirstRow, FirstCol), Cells(MaxRow, MaxCol)).SpecialCells(4).Delete Shift:=xlToLeft
End Sub
подойдет так?

чтобы удалить чего-нибудь ненужное, надо сначала добавить чего-нибудь ненужное
(с) КотМатроскин
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете

Последний раз редактировалось IgorGO; 12.01.2012 в 17:56.
IgorGO вне форума Ответить с цитированием
Старый 12.01.2012, 17:51   #6
nilem
Форумчанин
 
Регистрация: 25.04.2010
Сообщений: 616
По умолчанию

или (без удаления ячеек)
Код:
Sub SdvigVlevo()
Dim x, i&, j&, k&
Dim FirstRow&, MaxRow&, FirstCol&, MaxCol&
Application.ScreenUpdating = False

Call VBABrand.Subs_.DefinitionSelectionRowCol
x = Range(Cells(FirstRow, FirstCol), Cells(MaxRow, MaxCol)).Value
For i = 1 To UBound(x, 1)
    k = 1
    For j = 1 To UBound(x, 2)
        If Not IsEmpty(x(i, j)) Then
            x(i, k) = x(i, j): If k < j Then x(i, j) = Empty
            k = k + 1
        End If
    Next j
Next i
Range(Cells(FirstRow, FirstCol), Cells(MaxRow, MaxCol)).Value = x

Application.ScreenUpdating = True
End Sub
nilem вне форума Ответить с цитированием
Старый 12.01.2012, 18:06   #7
Bape}l{ka
Форумчанин
 
Аватар для Bape}l{ka
 
Регистрация: 25.05.2011
Сообщений: 249
По умолчанию

на вот этой строке выдает ошибку, что object or with block not set

Код:
c = Range(Cells(r, FirstCol), Cells(r, MaxCol)).SpecialCells(4).Count
а если так, то tipe mismatch на count Т_Т
Код:
Set c = Application.Range(Cells(r, FirstCol), Cells(r, MaxCol)).SpecialCells(4).Count
ладна.. я еще поэкспериментирую Т_Т
вот пример:
пример сдвига.rar
Bape}l{ka вне форума Ответить с цитированием
Старый 12.01.2012, 18:10   #8
Bape}l{ka
Форумчанин
 
Аватар для Bape}l{ka
 
Регистрация: 25.05.2011
Сообщений: 249
По умолчанию

nilem, а как вы присваиваете значение диапазону??

Код:
x = Range(Cells(FirstRow, FirstCol), Cells(MaxRow, MaxCol)).Value
Range(Cells(FirstRow, FirstCol), Cells(MaxRow, MaxCol)) - это ведь не одна ячейка. или я чего-то не знаю?
Bape}l{ka вне форума Ответить с цитированием
Старый 12.01.2012, 18:16   #9
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

извините:
Код:
  Dim r As Integer, c As Integer
  Call Subs_.DefinitionSelectionRowCol 'ActiveWorkbook.ActiveSheet.
  For r = FirstRow To MaxRow
    c = Range(Cells(r, FirstCol), Cells(r, MaxCol)).SpecialCells(4).Cells.Count
    If c > 0 Then Cells(r, MaxCol + 1).Resize(1, c).Insert Shift:=xlToRight
  ...
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете

Последний раз редактировалось IgorGO; 12.01.2012 в 18:37.
IgorGO вне форума Ответить с цитированием
Старый 12.01.2012, 18:18   #10
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Код:
x = Range(Cells(FirstRow, FirstCol), Cells(MaxRow, MaxCol)).Value
- это значения диапазона берутся в массив.
Далее массив обрабатывается, и "присваиваете значение диапазону" вот здесь:
Код:
Range(Cells(FirstRow, FirstCol), Cells(MaxRow, MaxCol)).Value = x
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подмена оконной процедуры, Как правильно завершить? eduard93 Win Api 0 08.09.2011 16:45
Как правильно задать цикл? BingoBongo Общие вопросы Delphi 12 07.05.2011 09:09
Как правильно завершить поток cosmic_call Общие вопросы Delphi 2 13.02.2011 05:32
Как правильно завершить поток Des Общие вопросы Delphi 5 08.05.2009 20:56
Как корректно завершить цикл? Iren Microsoft Office Excel 4 02.11.2007 09:58