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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.04.2010, 18:37   #31
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию

Я попробовал макрос из поста №14, предварительно вставив число на лист. При отработке макроса оно все же затирается.
Насчет смены формата файла я думал, но пока до этого не дошли руки

Последний раз редактировалось motorway; 26.04.2010 в 18:40.
motorway вне форума Ответить с цитированием
Старый 27.04.2010, 06:54   #32
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Цитата:
Я попробовал макрос из поста №14, предварительно вставив число на лист. При отработке макроса оно все же затирается.
Нет. Это не так. Макрос вставляет данные только в те ячейки, адреса которых присутствуют в текстовой строке. Если в этой строке есть адрес какой-нибудь ячейки и значение для этого адреса = "пусто", то, естественно, макрос поместит это значение на лист и "затрет" имеющиеся данные. По-моему, так и требовалось. Если нужно, чтобы пустые значения не вносились в ячейки (не смотря на то, что их адреса встречаются в текстовой строке), то в коде макроса из поста № 14 строку
Код:
arr(r, c) = data(z + 1)
замените на
Код:
If data(z + 1) <> "" Then arr(r, c) = data(z + 1)
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 07.05.2010, 02:10   #33
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию

SAS888, а не подскажете, что добавить к коду, чтобы не обновлялись значения из 1 строки (если они находятся в ячейках 1 строки)? Не сильно ли это затормозит код? В принципе, такую проверку я могу сделать на PHP на сервере, когда отсылаются данные в Эксел. Но, может быть, здесь быстрее будет.
И еще обнаружилась неприятная вещь - в случае присутствия на листе т.н. объединенных ячеек не работает очистка диапазона методом Range.ClearContents, которую я выполняю перед вставкой данных. Что с этим можно сделать, чтобы быстро очищалось, если есть такие ячейки на листе?

Последний раз редактировалось motorway; 07.05.2010 в 02:44.
motorway вне форума Ответить с цитированием
Старый 07.05.2010, 07:10   #34
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Цитата:
чтобы не обновлялись значения из 1 строки
Если я правильно понял, то данные 1-й строки обновлять не нужно, даже если их содержит текстовая строка. Так? Тогда строку кода, о которой я говорил в посте № 32, замените на
Код:
If data(z + 1) <> "" And r <> 1 Then arr(r, c) = data(z + 1)
Цитата:
в случае присутствия на листе т.н. объединенных ячеек не работает очистка диапазона методом Range.ClearContents, которую я выполняю перед вставкой данных
Не совсем понятно. Во-первых, если Вы перед вставкой данных очищаете диапазон, то зачем нужно сохранять имеющиеся на листе данные? Во-вторых, например, код
Код:
Cells.ClearContents
очистит содержимое всех ячеек активного листа не зависимо от того, есть ли объединенные ячейки или нет. В-третьих, если Вам нужно разъединить объединенные ячейки активного рабочего листа, можно выполнить код
Код:
 Cells.UnMerge
Естественно, что лист и диапазон можно выбирать произвольно.
Опишите эту проблему более подробно (лучше с примером). Может быть проблема возникает не при очистке диапазона, а при вставке данных в диапазон, содержащий объединенные ячейки?
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 07.05.2010, 18:02   #35
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию

Да, насчет 1 строки так, спасибо.
Насчет очистки - в общем, в некоторых функциях она нужна и присутствует и выполняется так, к примеру:
Код:
For i = 1 To (Worksheets.Count - 1)
        Set Sh = Worksheets(i)
        rownum = Row_Get(Sh)
        colnum = Col_Get(Sh)
        If (rownum >= 2 And colnum >= 2) Then
            Set TRange = Range(Sh.Cells(2, 2), Sh.Cells(rownum, colnum))
        Else
            If (rownum = 1 Or colnum = 1) Then
                Set TRange = Range(Sh.Cells(2, 2), Sh.Cells(2, 2))
            End If
        End If
        
        TRange.ClearContents
        
    Next i
И всплывает ошибка: 1004 Изменить часть объединенной ячейки невозможно. Указывает на строку с TRange.ClearContents.
Возможно, и в каких-то других функциях об. ячейки могут доставить проблемы. Например, у меня был двойной цикл по ячейкам (i,j). А если такой ячейки уже нет из-за объединения, могут возникнуть проблемы тоже.
motorway вне форума Ответить с цитированием
Старый 08.05.2010, 01:53   #36
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию

И еще можно как-то сделать, чтобы данные вставлялись из файла по умолчанию в Общем формате и, может быть, если есть на конце %, то в процентном? А то я попробовал вставку из файла - там куда-то запятые "дюются" и формат становится числовым для некоторых чисел

Последний раз редактировалось motorway; 08.05.2010 в 01:59.
motorway вне форума Ответить с цитированием
Старый 09.05.2010, 17:59   #37
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию

Еще вопрос: можно ли как-то установить у всех ячеек, присутствующих в строке, цвет, но так, чтобы это не сильно влияло на скорость? Раньше я это делал для каждой ячейки, что могло отнимать время. Здесь же мы сразу массив вставляем. Можно ли у этих ячеек изменить цвет, допустим, на синий?
motorway вне форума Ответить с цитированием
Старый 11.05.2010, 09:05   #38
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Ошибка при очистке объединенных ячеек в Вашем случае будет возникать только в том случае, если в объединении участвуют ячейки либо 1-й строки, либо 1-го столбца. Т.к. ошибка возникает, то это именно так.
Предлагаю макрос, который очистит все ячейки кроме 1-го столбца и 1-й строки. Макрос будет корректно работать, если в каждом листе книги есть хотя бы по 1 значению в 1-й строке и 1-м столбце не считая ячейки "A1". И еще. Не совсем понял, какие значения возвращают Ваши функции Row_Get(Sh) и Col_Get(Sh). Можно ли удалять данные из ячеек за пределами возвращаемых функциями значений? Так или иначе, попробуйте следующий код:
Код:
Sub RangeClear()
    Dim ws As Worksheet, c As Range, r As Range, arrC(), arrR()
    For Each ws In Sheets
        Set c = Intersect(ws.UsedRange, ws.Columns(1)): arrC = c.Value
        Set r = Intersect(ws.UsedRange, ws.Rows(1)): arrR = r.Value
        ws.Cells.ClearContents
        c.Value = arrC: r.Value = arrR
    Next
End Sub
Если требуется, добавьте дополнительные проверки.

Цитата:
чтобы данные вставлялись из файла по умолчанию в Общем формате и, может быть, если есть на конце %, то в процентном? А то я попробовал вставку из файла - там куда-то запятые "дюются" и формат становится числовым для некоторых чисел
При формировании массива из диапазона ячеек и последующей вставке значений массива в диапазон имеющий общий формат средствами VBA, все запятые и точки в числах будут восприниматься как разделитель целой и дробной части. Лучше, перед такой процедурой, для всех ячеек требуемого диапазона установить текстовый формат, проделать операции с массивами, затем установить требуемые форматы для ячеек, возможно с корректировкой результата. Приведите пример того, что дано и того, в каком виде это должно выглядеть в ячейках. С % тоже не понятно. Также нужен пример.

Цитата:
можно ли как-то установить у всех ячеек, присутствующих в строке, цвет, но так, чтобы это не сильно влияло на скорость?
Нет. Нельзя. Цвет ячейки - это одно из свойств ячейки, которое можно установить только при непосредственном обращении. Можно, например, формировать диапазон ячеек листа, который затем окрашивать, но, так или иначе, работа с ячейками листа существенно "тормозит" (хотите - попробуем).
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 11.05.2010, 21:48   #39
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию

Row_Get(Sh) и Col_Get(Sh) возвращают последнюю заполненную строку и столбец на листе, так что там должно всё удаляться.
Насчет форматов пока что небольшая пауза, если понадобится, напишу еще. Смысл в том, чтобы при присвоении ячейке значения оно было в том виде, которое передается, а не менялось. Иногда в принципе может потребоваться и другой вариант.
С цветом - хуже, потом тоже попробую.
Ваш код выдает ошибки, может, я что-то не то делаю? Object variable or with block variable not set. Либо Type mismatch. В общем, пока что я с объединенными ячейками справился, просто убрав их. Пока что проблема не так актуальна

Последний раз редактировалось motorway; 11.05.2010 в 21:52.
motorway вне форума Ответить с цитированием
Старый 11.05.2010, 21:59   #40
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию

Вот попробовал изменить цвет у 20000 ячеек:
Код:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Range("U1").Value = Time
For i = 1 To 1000
For j = 1 To 20
Cells(i, j).Font.Color = RGB(255, 51, 0)
Next
Next
Range("U2").Value = Time
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub
Срабатывает за 1 секунду. Так что не верьте тем, кто говорит, что в Швейцарии плохая погода Вроде бы не так долго делается. Или тормоза начинаются в случае списка ячеек?
motorway вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
задачи: на двумерные массивы,обработку строк,обработку текстовых файлов. (Паскаль) Yaro Помощь студентам 2 12.11.2009 12:55
Как ускорить попиксельную обработку изображения Дамир Общие вопросы .NET 1 02.11.2009 12:40
Сравнение текста InStr() SoFuWa Microsoft Office Excel 7 22.07.2009 14:38
Сравнение Instr(), Строчине и прописные буквы SoFuWa Microsoft Office Excel 2 30.05.2009 16:20