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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.02.2009, 22:33   #1
Dux
Delphi Master
Форумчанин Подтвердите свой е-майл
 
Аватар для Dux
 
Регистрация: 31.03.2008
Сообщений: 803
По умолчанию Как удалить все строки в Excel содержащие..

Столкнулся с проблемой, необходимо удалить все строки в Excel таблице, в которых в первом столбце содержится символ "х"? Помогите советом
Dux вне форума Ответить с цитированием
Старый 04.02.2009, 22:53   #2
Тупой
Форумчанин
 
Аватар для Тупой
 
Регистрация: 26.12.2008
Сообщений: 146
По умолчанию

Я бы макрос написал...
Вот чтото типа процедуры проверки существованя "х" - латинской прописной буквы икс.
Код:
Function isExistX(s As String) As Boolean
Dim i As Integer

isExistX = False

For i = 1 To Len(s) - 1
    If Asc(Mid(s, i)) = 120 Then
        isExistX = True
        Exit Function
    End If
Next i
End Function
Потом можно написать чтото типа
Код:
Sub KillStringsWithX()
Dim i As Integer
Dim j As Integer

j = selection.row
For i = 1 To ActiveSheet.UsedRange.Rows.Count
   If (isExistX(Cells(i, j)) = True) Then
       row("i:i").Select
       Selection.ClearContents
   End If 
Next i
End Sub
Для работы последней процедуры нужно, чтобы все косячные строчки находились др под другом, а ячейки с символом "х" одна под другой, причем самую верхнюю ячейку нужно выбрать вручную.
"Hello, world!" - 17 errors 56 warnings

Последний раз редактировалось Тупой; 04.02.2009 в 22:58.
Тупой вне форума Ответить с цитированием
Старый 04.02.2009, 22:58   #3
Dux
Delphi Master
Форумчанин Подтвердите свой е-майл
 
Аватар для Dux
 
Регистрация: 31.03.2008
Сообщений: 803
По умолчанию

Спасибо, но я наверно неправильно сформулировал задачу. Необходимо это сделать из Дельфи..
Dux вне форума Ответить с цитированием
Старый 04.02.2009, 23:18   #4
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Необходимо это сделать из Дельфи..
Так ты в соответствующий раздел форума и обращайся за помощью...

По объектной модели Excel мы тебе можем ещё что-то подсказать (как получить какое-то свойство какого-то объекта),
а как реализовать это всё на Дельфи - тут мы тебе ничем не поможем...

Алгоритм поиска символа в ячейке тебе уже подсказали...
Но можно сделать и проще:
Код:
Sub test()
    Set Sheet = ActiveSheet ' объект Sheet - это обрабатываемый лист Excel
    For Each Row In Sheet.UsedRange.Rows
        If Row.Cells(1) Like "*x*" Then Row.Delete
    Next
End Sub
Тебе осталось эти 3 строки кода перевести на Дельфи.
EducatedFool вне форума Ответить с цитированием
Старый 04.02.2009, 23:23   #5
Dux
Delphi Master
Форумчанин Подтвердите свой е-майл
 
Аватар для Dux
 
Регистрация: 31.03.2008
Сообщений: 803
По умолчанию

Пробую так, но видать где-то ошибка:

Код:
 for I2 := 0 to 200 do
   begin
    if XL.Cells[I2,1].value='x' then  begin XL.Rows[i2].delete;end;
   end;
Dux вне форума Ответить с цитированием
Старый 04.02.2009, 23:37   #6
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Вместо for I2 := 0 to 200 do
напиши for I2 := 1 to 200 do

Строки в Excel нумеруются с единицы.

Ну а правильнее будет так:
Код:
for I2 := 1 to XL.UsedRange.Rows.Count do
begin
if XL.Cells[I2,1].value=    'x' then  begin XL.Rows[i2].delete;end;
end;

Последний раз редактировалось EducatedFool; 04.02.2009 в 23:39.
EducatedFool вне форума Ответить с цитированием
Старый 05.02.2009, 00:46   #7
Dux
Delphi Master
Форумчанин Подтвердите свой е-майл
 
Аватар для Dux
 
Регистрация: 31.03.2008
Сообщений: 803
По умолчанию

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

Последний раз редактировалось Dux; 05.02.2009 в 00:58.
Dux вне форума Ответить с цитированием
Старый 05.02.2009, 00:57   #8
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
строка номер 5 в которой находится символ "х" не удаляется
1. Этот символ можно записать кириллицей и латиницей (в русском и английском алфавите эти символы похожи по начертанию) - возможно, причина в этом.

2. До или после этого символа присутствует пробел - ты сравниваешь значение ячейки с символом (XL.Cells[I2,1].value= 'x'), а я, чтобы этого избежать, предлагал определять наличие этого символа внутри ячейки: If Row.Cells(1) Like "*x*" Then


(добавлено)
Понял, в чём проблема.
Надо уменьшать счётчик на единицу при удалении строки.

Должно получиться что-то вроде этого: (не помню, можно ли в Дельфи изменять переменную цикла изнутри самого цикла...)
Код:
for I2 := 1 to XL.UsedRange.Rows.Count do
begin
if XL.Cells[I2,1].value=    'x' then  begin XL.Rows[i2].delete; i2:= i2 - 1;end;
end;
Или прогонять цикл в обратную сторону: (ошибки в операторах сами исправите...)
Код:
for I2 := XL.UsedRange.Rows.Count to 1 step -1 do
begin
if XL.Cells[I2,1].value=    'x' then  begin XL.Rows[i2].delete;end;
end;

(добавлено)
Забыл совсем...
В дельфи нет аналога оператора step
И переменную внутри цикла трогать нельзя - вылетит ошибка Assignment to FOR-Loop variable 'i'.

Ну, тут уже Ваша очередь что-нибудь изобретать...

Последний раз редактировалось EducatedFool; 05.02.2009 в 01:14.
EducatedFool вне форума Ответить с цитированием
Старый 05.02.2009, 01:00   #9
Dux
Delphi Master
Форумчанин Подтвердите свой е-майл
 
Аватар для Dux
 
Регистрация: 31.03.2008
Сообщений: 803
По умолчанию

Значение "x" добавляется автоматически (при определенном условии), а не в ручную, так, что разница символов исключена... в сообщении выше я описал проблему более точно..

Здесь пример файла из которого надо удалить строки:
book.xls

Последний раз редактировалось Dux; 05.02.2009 в 01:05.
Dux вне форума Ответить с цитированием
Старый 05.02.2009, 05:51   #10
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Есть еще более простой вариант (см. вложение. Запустите макрос "DelRows"). Вообще без организации цикла. Вот код, удаляющий строки, в столбце "A" которых значение "x", примененный во вложении:
Код:
Sub DelRows()

    Dim Sname As String, i As Long
    Application.ScreenUpdating = False: Application.DisplayAlerts = False
    Sname = ActiveSheet.Name: Sheets.Add.Name = "Temp": Sheets(Sname).Activate
    i = Cells(Rows.Count, "A").End(xlUp).Row + 1: Cells(i, "A") = "x"
    Columns("A").ColumnDifferences(Comparison:=Cells(i, "A")).EntireRow.Copy Sheets("Temp").[A1]
    Sheets(Sname).Delete: Sheets("Temp").Name = Sname

End Sub
P.S. При большом количестве строк, этот вариант значительно быстрее.
Чем шире угол зрения, тем он тупее.

Последний раз редактировалось SAS888; 05.02.2009 в 05:54. Причина: Добавлено
SAS888 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Excel. как удалить из таблицы все гиперссылки? и запретить что бы URL ими становились 9go Microsoft Office Excel 2 17.01.2009 10:19
Удалить из строки S1 первую, последнюю, все подстроки совпадающие с S2 ТРОЯН=) Паскаль, Turbo Pascal, PascalABC.NET 1 10.12.2008 23:28
Удалить из строки все группы букв вида abcd Григорийpnz Паскаль, Turbo Pascal, PascalABC.NET 5 27.11.2008 12:48
Удалить из строки все группы вида abcd Григорийpnz Паскаль, Turbo Pascal, PascalABC.NET 8 18.11.2008 19:40
Надо в RichEdit Удалить все строки между двумя пустыми Stas))) Компоненты Delphi 7 28.05.2007 16:49