Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1 2 След.
RSS
Несовпадение значений при выгрузке из массива, vba
 
При загрузке ячеек в массив и выгрузке - наблюдается несовпадение значений.
Есть более точный макрос, в котором эти несовпадения учтены?

 
KUDRIN,
1. хотелось бы понять, что от куда и куда
2. Например у вас С3, С4 использован апотроф, а это спец символ который принудительно говорит что значением текстовое и не отображается.
3. С13, С14 в исходном текст, а при вставке преобразуется в число, Отформатируйте как текст, не будет менять.
4. Формулы так вставлять нельзя.
 
более точного макроса нет
нужно:
а) понимать с какими данными работаем
б) понимать что за задача решается
в) и тогда написать абсолютно точный макрос, в результате работы которого все результаты окажутся там, где должны быть и том виде, который необходим
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
1. хотелось бы понять, что от куда и куда
C листа в массив, и из массива назад на лист.
Цитата
2. Например у вас С3, С4 использован апотроф, а это спец символ который принудительно говорит что значением текстовое и не отображается.
Как это не отображается, когда отображается ' сразу при открытии файла в C3 C4 слева от слова?

Цитата
4. Формулы так вставлять нельзя.
Значит массивы не годятся для загрузки в них данных, обработке и выгрузке назад на лист?
Цитата
более точного макроса нет
Ну на нет и суда нет, спасибо за ответы.
Цитата
а) понимать с какими данными работаем
Вот именно с теми данными, что на листе.
Цитата
б) понимать что за задача решается
Ускорение вывода результатов на лист, например через массив, как в данном случае.
Изменено: KUDRIN - 31 Мар 2018 20:09:06
 
Цитата
KUDRIN написал:
Значит массивы не годятся для загрузки в них данных, обработке и выгрузке назад на лист?
вывод смелый и совершенно безпочвенный
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
KUDRIN написал:
отображается ' сразу при открытии
да но в ячейке их две, одна то скрылась.
Цитата
KUDRIN написал:
загрузки в них данных,
данных, а не формул. Это немного разны вещи. Формула может быть данными, если обрабатывается как формула, а так, данные сырые - это константы и результаты вычислений формул.

Ну и #3, чтоб не повторяться.
 
Цитата
да но в ячейке их две, одна то скрылась.
Да, моя ошибка по C3, но в C4 всё же один апостроф.
Цитата
данных, а не формул. Это немного разны вещи.
Так если на листе вперемешку присутствуют и данные и формулы, как быть? Обращаться к каждой ячейке отдельно? Сейчас в рабочем файле именно так и работает, в чём тогда преимущество массивов для вывода на лист?
Изменено: KUDRIN - 31 Мар 2018 20:22:05
 
взять данные в массив, обработать каждое и вернуть массив с новыми данными обратно на лист гораздо быстрее,
чем
обращаться к каждой ячейке с помощью Cells или Range и обрабатывать по одной
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
KUDRIN написал:
в чём тогда преимущество массивов для вывода на лист
преимущество есть не во всех случаях, порой  это просто нельзя использовать, но в основном оно достигается  более оперативным доступу к данным массива, в сравнении к обращению к объекту, который имеет набор свойств избыточный для обработки.
 
Цитата
Ігор Гончаренко написал:
взять данные в массив, обработать каждое и вернуть массив с новыми данными обратно на лист гораздо быстрее, чем
Именно это я и сделал в примере, но данные выводятся на лист не точно. В этом и есть вопрос темы. Как сделать, чтобы при выводе из массива они не отличались от оригинальных.
Изменено: KUDRIN - 31 Мар 2018 20:33:14
 
KUDRIN, данные выводятся точно, но у Excel есть особенность. он любит навязывать помощь при изменении форматов и это в данном случае играет злую шутку над Вами.
 
Недавно был практикум на эту тему.
Честно говоря, ответ на последний вопрос из #10 меня тоже сильно интересует. Пока не нашел ничего лучшего, чем проверять результат после присваивания в случае, когда об элементах массива заранее нет информации. Достаточно быстро, но не красиво.
Владимир
 
sokol92, Думаю пока MS не сделает управление авто-форматированием при вводе доступным для изменений, задача почти не решаемая. Это сродни тянущейся с первых версий Excel невозможностью использовать стрелок лево/право при редакторе формул в УФ, проверке данных, именах. Давно всех бесит, но ничего не движется.  
 
Цитата
БМВ написал:
невозможностью использовать стрелок лево/право при редакторе формул в УФ
О да, с УФ у нас длительные дружественные и уважительные отношения как раз именно из-за этого.

sokol92, благодарю за ссылку
Изменено: KUDRIN - 31 Мар 2018 21:44:07
 
Доброе время суток
Цитата
БМВ написал:
Это сродни тянущейся с первых версий Excel невозможностью использовать стрелок лево/право при редакторе формул в УФ, проверке данных, именах
Э, а F2 нажимать пробовали?
 
Off. Наступили на больную мозоль (а я думал, что я один, клавиатурщик, много лет мучаюсь). А еще наябедничаю на метод Application.Inputbox. Мало того, что он страдает вышеупомянутым недугом, так еще и при длине первого параметра более 255 символов ведет себя неприлично.
Владимир
 
Цитата
Андрей VG написал:
а F2 нажимать пробовали?
Андрей опередил )) До определённого момента тоже страдал со стрелками, пока не подсказали, что F2 срабатывает и там )
 
Здравствуйте, Андрей и Юрий! Здорово!! Может быть еще что-нибудь интересное расскажете...
Владимир
 
Цитата
Андрей VG написал:
F2
О сколько нам открытий чудных......  :-) интересно , когда появилось, изначально или ... а то уже по привычке в ячейке формула, а потом копи/пэст. Хотя в провере данных чуть формула длинеее, то видимая область уж больно короткая.
 
Наполовину спасает Value2:
Код
Sub test1()
    a = [A1:D20].Value2
    [A1:D20].Value2 = a
End Sub

С формулами такой финт не проходит...
 
Цитата
Hugo написал:
Наполовину спасает Value2:
Может я что-то не так делаю? У меня всё те же 4 красных ячейки как и с Value
 
Да, беру слова обратно - перепутал результаты тестов...
Зачем вообще извраты?
 
Цитата
Hugo написал:
Зачем вообще извраты?
Ускорить обработку листа через обработку значений внутри массива, а не напрямую с ячеек.
То, что есть на листе - это значения, которые получились в результате обработки ячеек. А массив не может вывести те же самые значения на лист.
В частности, " 'слово " взято не с потолка, а потому что стоит апостроф в названии файла, а после обработки в массиве -  массив этот апостроф съедает.
Цитата
перепутал результаты тестов
Не мудрено, файл фактически одноразовый, после каждого теста нужно перезапускать или допиливать копипасту.
Изменено: KUDRIN - 31 Мар 2018 23:00:55
 
Если известно что и куда выводится, то что мешает перед выгрузкой форматировать области листа?
 
Цитата
KUDRIN написал:
массив не может вывести те же самые значения на лист
- вот как раз это он и может. А вот запомнить в каком виде их отображал эксель и это повторить - не может.
Но есть попытка - вот смотрите что с этими апострофами - на листе оба слова видны с одним, в массиве тоже:
     : a(3,3) : "'слово" : Variant/String
     : a(4,3) : "'слово" : Variant/String
Хотя если смотреть содержимое ячейки - в третьей строке два апострофа...
Изменено: Hugo - 1 Апр 2018 11:37:05
 
Цитата
Если известно что и куда выводится, то что мешает перед выгрузкой форматировать области листа?
стало похоже,
только test2 "сдвигает" значения в колонке B из-за смены форматирования
а в test1 в С13 и C14 появляются ошибки отображения числа как текст
Про апостроф. Может быть есть ещё спец знаки, которые нужно учитывать кроме него?
И "For Each aa In a" не работает, не меняет значения массива, хотя в то же время "For Each c In Range" отлично работает сразу с элементами и можно менять значения, пусть и относительно медленно.
Изменено: KUDRIN - 1 Апр 2018 17:12:41
 
Цитата
KUDRIN написал: И "For Each aa In a" не работает, не меняет значения массива
И не будет. Такая конструкция работает с элементами коллекций/объектов, а массив это переменная
Согласие есть продукт при полном непротивлении сторон.
 
В любом случае подразумевается, что данные исходного массива будут циклически обрабатываться перед копированием на лист.
В эту обработку несложно добавить фрагмент кода для корректировки текстовых значений массива с целью предотвращения их преобразования при копировании массива в диапазон с общим форматом ячеек.
Код
Sub SafeArrayToRange()
' ZVI:2018-04-02 https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=read&TID=103060
' Обработка массива для копирования на лист с предотвращением преобразования текстовых данных
  
  Dim ch As String
  Dim a(), i As Long, j As Long
  
  ' Скопировать данные в массив
  a() = Лист3.Range("A1:D20")
  
  ' Обработать данные массива
  For i = 1 To UBound(a)
    For j = 1 To UBound(a, 2)
      
      ' --> Здесь Ваша обработка элементов массива
      '     ...
      ' <-- Конец обработки
      
      ' --> Фрагмент кода для предотвращения преобразования текстовых данных в нетекстовые
      If VarType(a(i, j)) = vbString Then
        If Len(a(i, j)) > 0 Then
          ch = Mid$(a(i, j), 1, 1)
          If ch = "'" Then
            a(i, j) = "=""" & a(i, j) & """"
          ElseIf IsNumeric(a(i, j)) Or IsDate(a(i, j)) Then
            a(i, j) = "'" & a(i, j)
          End If
        End If
      End If
      ' <-- Конец фрагмента
      
    Next
  Next
  
  ' Скопировать данные массива на лист1 без преобразования текстовых данных
  With Лист1.Range("A1:D20")
    .NumberFormat = ""
    .Value = a()
  End With

End Sub
Vladimir Zakharov
Microsoft MVP – Excel
 
При желании можно упростить добавляемый фрагмент:
Код
      ' --> Фрагмент кода для предотвращения преобразования текстовых данных в нетекстовые
      If VarType(a(i, j)) = vbString Then
        If Len(a(i, j)) > 0 Then a(i, j) = "'" & a(i, j)
      End If
      ' <-- Конец фрагмента

Это исключит формулы в ячейках, но добавит (невидимый) символ "'" в начале всех ячеек с текстовыми значениями
Vladimir Zakharov
Microsoft MVP – Excel
 
ZVI, спасибо
Страницы: 1 2 След.
Читают тему (гостей: 3)