Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Выбрать дату в календареВыбрать дату в календаре

Страницы: 1 2 3 4 5 6 След.
Работа с другим файлом. Назначенное сочетание клавиш мешает макросу
 
Пришла пора спрашивать совета.

Думалось прицепить обработку в надстройку или Personal. Обнаружил такую неприятность...
Открываем другой файл (расширение не важно), берем данные (в примере ничего не берем), закрываем. Обычная работа с Workbooks.Open:
Код
Sub testtest_()
    Dim sFName As String
    
    With Application.FileDialog(msoFileDialogFilePicker)
        If .Show = False Then
            MsgBox "Файл не выбран!", 48, "Ошибка": End
        Else
            sFName = .SelectedItems(1)
        End If
    End With
    
    ' With Application: .ScreenUpdating = False: .DisplayAlerts = False: End With
    With Workbooks.Open(Filename:=sFName)
        .Close
    End With
    ' With Application: .ScreenUpdating = True: .DisplayAlerts = True: End With
    
    MsgBox "OK", 64, ""
End Sub
Запуск из редактора или кнопкой - без проблем, код отрабатывет полностью.
Если запускать назначенными клавишами (Ctrl+Shift+q) - вываливается после открытия другого файла.

Set wBook = Workbooks.Open(Filename:=sFName), отключение обновления экрана, окно выбора файла в отдельной процедуре, небольшая задержка перед/после открытия файла  - то же самое, без изменений - файл открылся и процедура завершилась (без ошибок).

Почему и как обойти проблему?
Прошу помощи.
Win10, Office2010
О байтах
 
Цитата
БМВ написал: надо бережно относится к ресурсам даже если это пара байт :-)
Даже если один!
Цитата, взятая из одной из тем, обязала меня поделиться. Это не на высокоуровневых блоками штамповать. Проникнитесь филигранностью работы )
История одного байта
Определение границ цикла for/next
 
При разборе кода возник вопрос и поставил под сомнение то, что границы цикла определяются перед первым шагом и не изменяются.

Удаляем лишние листы (цикл1):
Код
    For i = Sheets.Count To 2 Step -1
        Sheets(i).Delete
    Next i

А вот прямым ходом (цикл2):
Код
    For i = 2 To Sheets.Count
        Sheets(2).Delete
    Next i

Теперь вместо Sheets.Count подставим переменную. Первому циклу все равно, второй, естественно, вывалится в ошибку  (цикл3):
Код
    k = Sheets.Count
    
    For i = 2 To k
        Sheets(i).Delete
    Next i

Вот и вопрос: как работает прямой цикл (цикл2) при уменьшении количества листов? Переопределяется верхний предел?

Ноги растут отсюда
DblClick в ListBox вызывает выделение другого элемента списка
 
Какая-то непонятка, прошу помочь разобраться.

Вызов формы - DblClick на первой строке.
На форму в  ListBox выводится список наименований столбцов (шапка таблицы). DblClick на элементе списка - соответствующий столбец на листе скрывается/отображается
Это работает.

Но при этом кавардак с выделениями в списке, хотя список каждый раз пересматривается.
Например, скрываем столбец  3 - галка на нем не ставится, но ставится на первом. Показываем третий - на нем ставится галка (хотя должа быть снята).
Если форму переоткрыть - выделены все нормально.
Код
' скрыти/отображение столбцов
Private Sub lbList_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Dim i As Long
    With lbList
        i = .ListIndex: If i = -1 Then Exit Sub
        If .ListCount = 0 Then Cancel = True
        
'        Application.ScreenUpdating = False
        rRng(i + 1).EntireColumn.Hidden = Not rRng(i + 1).EntireColumn.Hidden
'         Application.ScreenUpdating = True
    End With
    
'    Application.Wait Time:=Now + TimeValue("0:00:01")
    Call ChangeList ' к перезаписи списка
End Sub 

На 14 строке (вызов Call ChangeList) поставить точку  останова. Если запустить процедуру и  после остановки продолжить по F5 - список отображается корректно. Уже и задержку ставить пробовал, и  перезапись rRng  -  не помогает.
Не вижу какой-то мелочи или действительно проблема?


Полный код формы
Жесткий диск умер. А ведь он предупреждал!
 
Повествование о небольшой глупости.

С месяц тому на ноуте появилась проблема. Перестал определяться винт. Головка несколько секунд чего-то пытается найти (слышно прощелкивания), потом сообщение о том, что нет диска, с которого систему загрузить. Прогреется, подумает, решит, что достаточно повредичал, и через несколько перезагрузок запускается.
Видя такое дело, сохранил всю информацию на внешний накопитель. Получил новый диск, загрузил систему. Потом определил, что немного поднятая задница диска  (старого) позволяет ему работать без напряга и система загружается с пол-оборота.
До субботнего вечера работал со старым HD, временами - backup. Иногда - попытки включения несколько раз... Почему не перешел сразу на новый? Со временем, как обычно, появляется мусор, файлы раскиданы не там и не те... В общем, нужно в порядок приводить. А это время...

Так вот. Субботний вечер. Срочная работа и сложная. При тестировании файл зависает надолго. Сначала бы backup'уть.. Но так как до этого боролся с зацикливанием, грешил на программу.  Два часа убил в поисках бесконечных циклов - нет! Поздно, но догадался отправить на проверку. Результат обработки - 20 секунд.
Понятно. Диск в предсмертных судорогах. Надо бы сохранить последние дни, а он, негодник, зажал информацию и сам зажался - все виснет. Выключение. Диск гарячущий. Немного остыл - опять его в ноут. Пробы запустить. А он только беззлобно щелкает. Умраю, мол. Или умер.

Беда небольшая. 4 или 5 дней восстанавливаю из почты, Скайпа. Но все-таки что-то потеряно.
Первое. Всем.
Зная о полезности и нужности создания архивов и видя проблемы, не нужно надеяться на "авось пронесет".
Второе. Мне.
Вдруг кто чего посоветует. Отдавать спецам - не стоит оно тех затрат. Пока что обнаружил потерю одной работы. Не успел отправить и пол-дня пропало. Надо с нуля сделать. Какие-то записи, какие-то файлы...  Не очень болезненная потеря. Взять увесистый молоток - так не настолько я расстроен. Советы типа "остудить в холодильнике" или "прогреть в микроволновке" читал :)  
Мне бы его реанимировать на 10 минут. Ну, не получится - и ладно.

На всякий случай: место работы - ноут Lenovo G580, фамилия его -  ST 1000 LM024. С 2012 года трудился, светлая ему память :)
Randomize + Rnd генерирует одинаковые числовые последовательности
 
Здравствуйте. Разрешите обратиться? Спасибо, обращаюсь :)

Реальная задача: покер, раздача карт на 2 или более игроков, количество вариантов (строк) любое (задается).
На основе задачи состряпал пример - 10 случайных уникальных чисел в строке. Два доп. столбца (A:B) - для помощи в подсчете повторов. Повторы (все дублированные) считаются в L2. Третий доп. столбец (справа, M) показывает позицию дубля строки. Галка - условие запуска ГСЧ (вкл/выкл)
Для уменьшения размера файла формулы в доп. столбцах удалены. Растянуть на нужное количество строк.

Обнаружил непонятное поведение Randomize: генератор случайных величин помогает создавать одинаковые числовые последовательности! и хочу понять причину этой ошибки

Варианты 1-2.
UDF не используем. Случайные значения получаем в основном макросе, Randomize  есть/нет.
Результат - повторов не обнаружено.

Вариант 3.
UDF используем. Без Randomize
Результат - повторов не обнаружено.
-------------- дальше интереснее --------------------------------------------------------------------------------
Вариант 4.
UDF используем. Randomize включаем напрямую, без условия Randomize вкл/выкл.
Результат - повторы строк зашкаливают. На 1000 вариантов строк с дублями - более 800

Вариант 5.
UDF используем. Randomize включаем через условие "Randomize вкл/выкл."
Результат - повторы есть, но на порядок меньше - не более 80

Еще наблюдение (проверять на варианте 4, там нагляднее).
Количество дублей одной строки зависит от количества строк. Это понятно - больше вариантов, больше вероятность повтора. Интересно другое: дубли повторяются через определенный промежуток. Количество строк в промежутке зависит от количества выводимых значений в одной строке! 10 значений - дубль через 26 строк, 6 значений - через 47-49 строк, при 4 значениях - через 81-82 строки...

Вопросы. Как объяснить такое нехорошее поведение генератора (вар. 4 и 5)?
1. Почему при включении генератора отдельной UDF последовательности дублируются?
2. Почему при включении Randomize через If дублей гораздо меньше?
3. Почему дубли повторяются через определенный промежуток?
код

Win7, Office-10, 32-bit
Работа с массивами. Размерности массивов
 
Если размерность массива не задана при объявлении, то  ее можно менять при использовании.
О вредном GoTo
 
Когда-то, когда макросы были страшные, "GO-TO!!!" звучало как глас из Мордора, макросописцев считал чародеями ), оператор обсуждался то ли в отдельной теме, то ли параллельно с другим вопросом...
Противники, готовьте помидоры (все равно не долетят, разобьются о личное_мнение).

Цитата из темы основного форума:
Цитата
Irregular Expression написал: существуют тонны написанных книг о вреде GoTo
... и относятся они в большей степени к языкам более высокого уровня.
Догмы - они тоже вредны бывают. Тем, у кого "Windows маздай", "GoTo отстой", "Наша Галя круче всех" и проч., без рассуждений и доводов, лучше проходить мимо. Принимается только трезвый взгляд на жизнь (под небольшим градусом тоже допускается :)).

Негатив от безусловного перехода какой? Правильно, нарушается структура, можно потерять нить... Но! Справедливо это для больших процедур, длинных листингов. В макросах, в которых в видимой части экрана наблюдаем и выход, и строку перехода, большой беды от GoTo нет. Или в кодах, где заведомо известно, куда нас понесет (например, к выходу из процедуры).
Второй минус  использования безусловного перехода - человек привыкает его использовать. А это может быть большим препятствием для работы с более продвинутыми язуками (не уверен, только логический вывод из собственных размышлений)

Бесспорно, выходить из одиночного цикла лучше по Exit For.
Кстати, прямо при написании возникла интересная мысль: Exit For по факту - тот же же безусловный переход, но четко привязанный к месту применения и к строке перехода. Из той же песочницы прочие Exit'ы. Получается, что все они - операторы безусловного перехода!
И книжки пишут, и опытные товарищи советуют вложенные циклы применять по минимуму - медленно работают. Но не всегда (даже очень часто) не получается следовать этому правилу. Выходить наружу из внутреннего цикла можно по флагу, но это дополнительная проверка (если три цикла - две проверки). Гораздо удобнее сказать: а пошел бы ты на GoTo :)

Сам не сторонник применения GoTo, но и отказываться от него в VBA не стоит. Это как с летучими функциями листа: если есть замена не хуже, то всякие СМЕЩ, ДВССЫЛ применять не нужно. Но ведь есть случаи, когда без них не обойтись или замена будет хуже.

Использую безусловный переход в двух случаях (больше с ходу не вспомнил):
1. В начале процедуры для выхода из нее при проверках . Т.е. всегда понятно, что GoTo - это завершение и переход следует искать недалеко от End Sub.Да и зачем искать, если понятно? :) Нет, не замена Exit Sub.
Например, нужно открыть другой файл. Отключаем сообщения, обновление экрана, открываем книгу... и тут проверки на наличие листа, корректность данных, поиск таблицы и проч. Просто Exit Sub не получится - нужно включить отключенное. Наставить каскад If - код разрастается и становится менее читабельным. GoTo здорово помогает.
2. В этих самых циклах. Здесь использую очень редко. Тоже применяю флаги или разделение циклов. Но иногда бывает. Если точка перехода - вот она, рядом, и любой другой пользователь увидит ее без напряга. А еще комментарий подвесить и имя понятное дать...

Ага, вспомнил еще одну "штучку" - обработчик ошибок (вообще, его бы тоже пореже задействовать). Куда-то же люди переходят: On Error GoTo.... И это советует кто? Разработчик! (если бы не советовал, придумал бы другой флаг).

Так что книги читать очень полезно, но и думать не запрещается )
Получить номер цвета при градиентной заливке
 
Всем привет.
И у меня созрел вопрос. Обнаружил странность при получении номеров цветов при градиентной заливке.

Залиты две ячейки: одна градиентной, вторая - одноцветной заливкой. Вторая только для сравнения. Нажимаем кнопку "записать" - номера цветов записываются в ячейки:
Код
Sub RecordColor()
    With Range("C5").Interior.Gradient.ColorStops
        Range("D5").Value = .Add(0).Color ' цвет1 градиентной
        Range("E5").Value = .Add(1).Color ' цвет2 градиентной
    End With
    
    Range("D6").Value = Range("C6").Interior.Color ' цвет ячейки
End Sub

Странности начинаются, если кнопку нажимать повторно:
         
- второе срабатывание макроса вызывает подсветку цветов градиентной заливки белым и изменение номера первого цвета (ячейка D5) на 16777215;
- третий проход видимых изменений не вызывает;
- четвертый раз макрос меняет номер второго цвета (ячейка E5) на 16777215;
- пятый - подсветка белым пропадает;
- шестой - подсветка появляется;
- на седьмой раз макрос показывает правильный номер первого цвета;
- далее номер опять меняется, при последующих запусках подсветка то появляется, то пропадает, номера цветов могут определиться нормально, а могут как 16777215 (зависимости от чего-либо не обнаружил)
Запись номеров в ячейки другого листа и запуск кода из другого листа на результат не повлияли.

Прошу помочь разобраться. Вопросов два:
1. Правильно ли определяю номер цвета?
2. Что происходит? (на другой машине не проверял)
ZX-Spectrum - сегодня ему 35
 
35 лет назад, 23 апреля 1982, появился ZX Spectrum
Цитата
Все эти игры умещались либо в 48, либо в 128 Кб оперативной памяти.
Даже меньше, ибо система забирала часть по  себя.
А еще можно было писать программы на BASIC

Бум радиолюбительства! В 80-х  на территории Советского Союз первый компьютер с цветной графикой, который можно было собрать в домашних условиях из доступных деталей. У меня до сих пор хранится один из собранных и запаянная плата под планарку (так и не довел до запуска). А вот телевизора и магнитофона уже нет :)
Смещение вставляемого объекта относительно ячейки
 
Случайно обнаружил непонятное смещение картинок при формировании каталога с рисунками.

Каталог. Вставляем блоки строк для каждого наименования, в блоках копируемых ячеек размещаем информацию и картинки. Обработка запускается с другого листа.
Если лист каталога активируется до вставки рисунков, проблем нет, картинки ложатся "согласно купленным билетам". Если вставку производить при неактивном листе, рисунки по вертикали смещаются на небольшую величину. Высота строк на другом листе на величину смещения не влияет.

В примеретоко один рисунок, строки копируются до 500-й (в первых строках смещение незаметно). В рабочем файле разные рисунки смещаются на одинаковую величину.
Папка с рисунком должна находиться рядом с файлом-обработчиком.

Есть ли объяснение такому смещению?
код
Тип переменной Byte в цикле с отрицательным шагом вызывает ошибку
 
Обнаружил странность, которую не могу объяснить
Код
Sub DelSheets()
'Dim i As Long
Dim i As Byte
    With ThisWorkbook
        For i = .Sheets.Count To 2 Step -1
            .Sheets(i).Delete
        Next i
    End With
End Sub

Переменная типа Byte. В таком варианте  - ошибка Owerflow. Проверил, листов точно не больше 255 :)
При типе переменной Integer, Long переполнения нет.
Копирование данных из активного листа в другую книгу, код из книги работает, не работает из надстройки
 
Прошу помочь разобраться.
Макрос при запуске из книги работает, при запуске з надстройки - не хочет.

В папке четыре файла.
склад - книга для записи данных.
шаблон - книга с макросом. Данные из активного листа записываются в склад. Код работает.

надстройка - файл надстройки с макросом, идентичным макросу в шаблоне
В рабочем варианте из шаблона создается отдельная книга копия, в ячейку А3 записывается путь к папке. Здесь книга уже создана
копия - из этой книги вызывается код надстройки - Ctrl+Shift+A. Надстройка открывает файл склад и... все, макрос умывает руки и выходит.
В пошаговом проходе (F8) надстройка работает.

Для проверки разархивировать папку и разместить ее на диске С, подключить надстройку.
Возможно, открывать ничего не нужно и ошибка найдется в коде:
[ Закрыто] Дополнение к правилам этой ветки
 
Цитата
kovtunenkoandrey:
Уважаемый модератор,а где написано, что для принятия участия я должен приносить форуму пользу? Считаете мое участие нарушением правил форума, исключите мой ответ или заблокируйте. Как создаются форумы и поддерживаются я в курсе, у вас есть вышеописанная возможность.
1. Вы хотите получить материальную выгоду на этом ресурсе. При этом отняв эту выгоду у тех, кто этого заслужил, кто принес ресурсу пользу, помогая безвозмездно в основных ветках форума. Такое нужно прописывать в правилах?
2. Вас здесь не знают. Какой у Вас уровень подготовки, как Вы выполняете работы - неведомо. Вполне возможно, что такая темная лошадка принесет вред ресурсу.

Поэтому - сначала проявить себя, а потом иметь возможность выполнять работы платно.
Грустный праздник
 
Был разговор еще до Нового года… Саша наотрез отказался размещать тему о помощи.
Сейчас он редкий гость на форумах.

17 февраля День рождения Саши (ikki)
Считаю, не будет большим преступлением, если обнародую часть преписки в Скайпе. Небольшие зарисовки на тему… Читайте.
Просить помощь ikki отказался, но в День рождения можно ведь сделать человеку подарок? Даже доброе слово – тоже подарок.
Кошелек ikki: Яндекс.Деньги
см. ниже

Скрытый текст
Mac изменил шрифт на пользовательской форме
 
Разработка 2014 года. Работали, не тужили... Пока не отправили файл на Мас.
Там с файлом поработали. Как пользователи (VBA запаролен). Файл вернули. В итоге имеем такую форму пользователя

Шрифт Tahoma остался. Но внешне - совсем не Tahoma

Что с кодировкой?
Такое может случиться не только на Мак'е?
Есть ли пилюля от этой болезни?
Пароль на защиту листа и работа автофильтра
 
На форуме обсуждалось несколько раз, но решения не нашел.
В  коде прописать защиту листа, на котором разрешить работу автофильтра. Это и макрорекодер умеет:
Код
.Protect DrawingObjects:=True, Contents:=True, _
                                Scenarios:=True, AllowFiltering:=True

Проблема в том, что нужна защита с паролем.
.Protect ("пароль") не устанавливает параметры защиты.

Обходной путь1.
До обработки  установить защиту листа с разрешением работы автофильтра, снять защиту. Лист запоминает предыдущие установки и при защите .Protect ("пароль") автофильтр на защищенном листе работать будет.
Обходной путь2.
Лузер советовал устанавливать параметры при открытии книги.

Может, кто знает прямую дорогу?
Инсульт - дело нешуточное
 
Сообщение в личке:
Цитата
У меня очень сложный вопрос. Описать не могу, могу рассказать голосом.
Хочу попросить материальной помощи через сайт, рассказать ситуацию и насколько это позволяет политика сайта.
Связались, поговорили… Просил написать, т.к. сам не может.

Михаил С. Из Пятигорска. Многие знают его по Планете, хороший специалист Excel.
У Михаила в апреле случился инсульт, отнялись ноги. Сейчас разговаривает осмысленно, заикается. Писать-читать не получается – после одного-двух предложений теряется смысл прочитанного.

Живет с матерью 80 лет, доходы на данный момент – пенсия матери. Естественно, для восстановления нужны лекарства. Обратиться за помощью не к кому...

Вот такая-вот грустная ситуация.
Обращаюсь ко всем неравнодушным: если есть возможность, помогите человеку.
Если будут вопросы - ко мне в личку или (у кого есть связь) Михаилу на телефон.

Реквизиты (лучше карта, т.к. электронные деньги еще выводить нужно):
- карта Сбербанка
             4276 8600 1439 0518
- ЯД     41001136675053
- WM   R389613894253
          Z206607432412
          E139368654205
QiWi     9097715387
Ошибка округления ОКРУГЛВВЕРХ?, ГПР (ВПР, ИНДЕКС)+ОКРУГЛВВЕРХ=ошибка
 
Тема-источник
Пример, созданный в чистом файле, прикрепляю здесь. В ту тему можно и не ходить.
=ГПР(ОКРУГЛВВЕРХ(0,71;1);$D$2:$H$3;2;)
Почему ошибка при, казалось бы, правильном округлении?
Если вместо функции округления поставить константу, все работает.
С ВПР и ИНДЕКС та же ошибка
Отсутствие библиотеки форм в Офисе, подключение Microsoft Forms 2.0 Object Library
 
В Excel-2010 сделал файл с формой, отправил человеку. У него при попытке открытия файла вылетает с ошибкой весь Excel.
Разобрался: отсутствует библиотека форм Microsoft Forms 2.0 Object Library
Скопировал свою FM20.DLL (Excel-2010), подключил  пользователю на Excel-2007. Excel не вылетает, но при попытке вызова формы - ошибка (см. рисунок).

FM20.DLL из Excel-2010 не подходит? Что-то еще нужно подключить?
Кто подскажет, кто научит?
Передать фокус из немодальной формы на лист
 
Перечитал все форумы и справочники, сходил ко всем гадалкам... (далее текст о том, какой я несчастный и неумеха и "помогитезарадибогавекпомнитьбуду")    :)  

В общем, прошу помощи. Не нашел, как передать фокус из немодальной формы на лист.
Cells().Select выделяет, но не "проваливается".
Желаемое: выделить ячейку из формы, вручную записать в нее число, Enter
Расширение виртуального массива с данными
 
Вопрос теоретический (без файла): о расширении массива, заполненного данными, по вертикали.
Нередко бывает, что размер массива задать сразу не представляется возможным - неизвестен объем информации.
По горизонтали понятно - ReDim Preserve... [добавить_"столбцы"]. По вертикали - не пройдет фокус.

Пример: извлечение данных из множества папок с множеством файлов.
Вариант1. Можно, конечно, пробежаться по всем файлам, посчитать выгрузку... Не оптимально.
Вариант2. Создать заведомо большущий массив. Плохой вариант:
а) можно промахнуться и до еще большего размера данных не дотянуть;
б) можно очень сильно "перетянуть" (а мы же за оптимизацию!).
Вариант3. Создать массив с жестким размером и периодически, при заполнении, выгружать данные.
Немного лучше, но нужно отслеживать и последнюю строку в уже заполненной таблице, и заполняемость массива, сбрасывая периодически счетчик "строк" массива.
Вариант4. Создаем "лежачий" массив: по горизонтали пишем "строки", по вертикали "столбцы". Работаем с ReDim Preserve. Перед выгрузкой циклом "ставим на ноги".
Такой способ неплохо работает при небольшом массиве (например, отслеживание и регистрация ошибок извлечения). На большом по скорости не проверял, но, в любом случае, присутствует дополнительная обработка массива.

Может, есть еще пути решения? Именно с массивами. Dictionary не предлагать. Не умею.
Копировать в код VBA символы в формате Юникод, иероглифы превращаются в знаки вопроса
 
Бойтесь данайцев... датчан, заказывающих работы  :)  
Скандинавы - они такие... У них в алфавите есть буквы, которые по нашему - совсем не буквы:
navn på fødevare. , veterinærafdeling eller kødkontrol
angives vandmærkepapirnummer

Все бы ничего, читать я это все не собираюсь, переводить тоже. Но файлы формировать надо. И как Вы догадались, что с датским текстом?  :)  

Пробовал копировать/вставлять текст при разной раскладке, результат один и тот же: вместо неведомых нам символов вставляются знаки вопроса:
Opkr?vning for nedenst?ende certifikater
На лист символы копируются нормально, но редактор их не принимает.

Как помочь сначала мне, позже - потомкам викингов?
Задержка сообщения об обновлении в теме
 
И я свое добавлю.
Подписка.
Раньше сообщения на почту приходили моментально. Вчера - вообще больше часа.
Сегодня быстрее, но все равно с задержкой.
Ошибка активации листа при открытии книги
 
Кто поможет, кто избавит?  :)  

Внутреннее имя листа изменено.
Вот такой супер-код:
Код
Private Sub Workbook_Open()
    wsWorker.Activate
End Sub
Работает. Но если файл копировать и открывать уже новый, ошибка:

Откуда такой гонор у вновь созданного? Или это мой Офис характер показывает?
Файл ковырялся-изменялся-дорабатывался (здесь он пустой) - может, поломался?  :)
Есть такая штука - 1С
 
Ну, вот. Дожил я... начал осваивать 1С. Не как пользователь. И пользователем никогда не был. Программист - это звучит гордо!  :)  
Зачем пишу? Для таких же, как я пару дней назад  :)  

Лет n тому возникало желание познакомиться поближе (тогда и Excel'я не знал). Ушло желание. Не так давно опять пришло.
Несколько раз пытался сам вникнуть. Открывал конфигуратор (там так редактор называется), смотрел-пытался... никак.

Раньше думалось, что 1С - это готовая разработка с возможностью некоторых изменений (форму отчета исправить, накладную переделать). Оно-то так - Предприятие, Бухгалтерия... Бери и пользуйся. Оказывается, не только это.
1С - платформа. А готовое пользовательское решение (или конфигурация) - то, что можно на этой платформе сотворить. Как движок форума или игрушки  :)  
Т.е. изначально - пустое окно программы.

Первые впечатления.
Там редактор кода называется конфигуратор. Корень дерева - конфигурация, которая ветвится на кучу малу всяческих нужностей (около 20 ): константы, списки, реестры, формы, планы, отчеты... которые в свою очередь могут ветвиться... которые дальше могут ветвиться...
Код можно писать на русском, можно на английском (не пробовал). То, что операторы на русском, и еще такие, поначалу очень сбивает:
ДилогОткрытияФайла=Новый ДиалогВыбораФайла(Режим)
ОбластьШапки.Параметры.РД=Формат(РабочаяДата, "ДЛФ=DD" )
Из плюсов:
- язык во многом похож на VBA. Это намного облегчает познание;
- готовые шаблоны форм, которые можно дорабатывать;
- построение печатных форм...
Как я понял (пока что): программирование в 1С - больше конструктор, чем написание кода. Возможно, ошибаюсь, время покажет. Но зато какую базу данных соорудить можно!

Пока интересно.
Отображение данных в создаваемом .csv
 
Прошу объяснить нехорошее поведение то ли данных, то ли формата файла.

Создаю программно .csv файл трех разных видов:
Код
Sub СreateCSV()
Dim ArrData
Dim sPath As String
    ArrData = Range("A2:C5").Value
    sPath = ThisWorkbook.Path & "\"
    
    With Workbooks.Add
        .Sheets(1).Cells(1, 1).Resize(4, 3).Value = ArrData
        .SaveAs Filename:=sPath & "док", FileFormat:=xlCSVMSDOS, CreateBackup:=False
        .Close
    End With
    
    With Workbooks.Add
        .Sheets(1).Cells(1, 1).Resize(4, 3).Value = ArrData
        .SaveAs Filename:=sPath & "мак", FileFormat:=xlCSVMac, CreateBackup:=False
        .Close
    End With
    
    With Workbooks.Add
        .Sheets(1).Cells(1, 1).Resize(4, 3).Value = ArrData
        .SaveAs Filename:=sPath & "разд", FileFormat:=xlCSV, CreateBackup:=False
        .Close
    End With
End Sub
С DOS  понятно - кириллицу не видит, рисует "кракозяблики".
CSVMac преобразовывает одну букву "я" - делает ее большой, "Ковровое" пишет ""Љовровое". Не родное, ясно.

Больше других подходит формат файла "разделители-запятые". Но и тут не все гладко.
Числа в исходных данных сохранены как текст. Если число не целое, с запятой, в .csv вставляется с кавычками, как текст (в примере число 2,5). То же с текстом, в котором есть числа, например:
Ковровое 4142 - 3,0 м/10,0/5,0 мм вставляется с кавычками. Прошу объяснить, почему так. Как быть, на каком этапе  менять?
Обратиться к листу по кодовому имени
 
И так, и эдак... То ли отдохнуть пора?

У листа есть видимое имя, есть кодовое: wsList(Листище)
В данной книге можно работать и с одним, и с другим:
With Worksheets("Листище")
With wsList
Открываем другую книгу:
Код
Dim wBook As Object
...
    Set wBook = Workbooks.Open(Filename:=ThisWorkbook.Path & "\" & Имя_Книги_ с_Листищем) 
    
    With wBook        
With wBook.sheets("Листище")
With wBook.sheets(1)

 Вот тут проблема. Хочу обратиться к листу не по номеру и не через видимое имя (переместили или переименовали...). Не поддается.
Прошу направить на путь истинный.
парсинг ячеек с помощью функции пользователя, используется программа для парсинга datacol
 
Оказывается! Не все так просто с парсингом.
Кто подскажет, кто поможет?
Исходное:
а) программа для парсинга datacol;
б) функция пользователя для сцепки данных из ячеек, в надстройке.

=функция(A1;B1...) - ссылки на 6 разбросанных по строке ячеек. Функция на листе работает послушно, что у нее просишь, то и показывает.
Проблема при использовании программой парсинга. datacol вставляет функцию в ячейку.
Тоже работает, но не очень послушно. Парсит во всех строках данные той строки, которая указана в функции (как будто ссылки абсолютные).
При этом функции листа при использовании этой самой  datacol (она формулу в ячейку строки вставляет) работают правильно.

Вот и добрались до вопроса: как заставить (нежно попросить) программу парсинга?
Возможно, не так прописывают строку в программе... Я там дуб дубом,  только функцию писал, а работать с ней другим.
Цветовая заливка дублей в разных столбцах
 
Прошу помощи-подсказки.
Пример очень упрощенный, но неприятность сохранена.
Несколько столбцов с заполненными ячейками. Неинформативные строки для удобства скрыты.
Задача: найти дубли значений в других столбцах и закрасить эти пары.
Берем ячейку, сравниваем со всеми значениями по очереди. При совпадении красим.

Проблемные ячейки (C37 и D4) выделены красным шрифтом: значение одинаковое - 3838682. Закрашиваются только после повторного запуска макроса.
Если комментировать строку, срабатывает нормально:
If .Cells(ii + 1, jj).Interior.Color <> 15773696 Then ArrCount(1, jj) = ArrCount(1, jj) - 1
Даже не вся строка виновата, только изменение значения ArrCount(1, jj).
Заменил в цикле (For ii = 2 To lRws) на переменную lRws - не помогло.

Что я упустил из виду?
Страницы: 1 2 3 4 5 6 След.
Наверх