Содержание
- Вставка рабочего листа Excel в форму или отчет
- Формы ввода данных в Microsoft Excel
- Применение инструментов заполнения
- Способ 1: встроенный объект для ввода данных Excel
- Способ 2: создание пользовательской формы
Вставка рабочего листа Excel в форму или отчет
С помощью таких элементов управления, как Свободная рамка объекта и Присоединенная рамки объекта, в формах и отчетах Access можно отображать не только различные графические объекты, но и листы Microsoft Excel.
Так же как и рисунок, лист Microsoft Excel можно внедрить в форму или отчет или связать его с ними. При этом вставленный лист автоматически сохраняется в файле базы данных и всегда является доступным. Если обновить такой объект в форме или отчете, он будет изменен только в базе данных. Если лист Microsoft Excel связан, его можно просматривать и вносить изменения в форме или отчете. При этом изменения cохраняются в исходном файле объекта, а не в файле базы данных. Файл объекта можно обновлять независимо от базы данных. Последние изменения будут выведены на экран при следующем открытии формы или отчета. Связывание объектов удобно при работе с очень большими файлами, которые нежелательно включать в файл базы данных, а также с файлами, используемыми в нескольких формах и отчетах. Если связанный файл объекта перемешен, необходимо повторно установить с ним связь.
Рассмотрим возможность вставки листа Microsoft Excel в форму и отчет Microsoft Access с помощью свободной рамки объекта. Чтобы вставить новый лист Microsoft Excel в форму Microsoft Access, необходимо:
- Открыть форму или отчет в режиме Конструктора.
- Добавить в нее элемент управления Свободная рамка объекта (Unbound Object Frame). При этом в окне Microsoft Access выбрать переключатель Создать новый (Create New), а в списке Тип объекта (Object Type) выбрать Лист Microsoft Excel (Microsoft Excel Worksheet) (рис. 15.10). Если файл XLS уже создан, выберите переключатель Создать из файла (Create From File) и введите путь и имя нужного файла.
Рис. 15.10. Окно Microsoft Access при вставке нового листа Microsoft Excel в форму Microsoft Access с помощью свободной рамки объекта
- Когда в форме появится элемент управления, в котором отображается пустая таблица Excel, введите в нее данные (это можно сделать прямо в режиме Конструктора) (рис. 15.11). Если вы вставляли готовый файл, то сразу будет отображена таблица Excel (рис. 15.12).
Рис. 15.11. Ввод данных на лист Microsoft Excel в режиме Конструктора форм Microsoft Access
Рис. 15.12. Использование свободной рамки объекта для вставки существующего листа Microsoft Excel в форму Microsoft Access
- Чтобы сделать доступным изменение данных на листе в режиме Формы, установите значение свойства Доступ (Enabled) для вставленного элемента управления равным Да (Yes), а свойство Блокировка (Locked) — Нет (No).
Увидеть данные, расположенные на листе Microsoft Excel, можно, открыв форму в режиме Формы. Чтобы иметь возможность изменять или добавлять данные на лист, нужно дважды щелкнуть кнопкой мыши на листе Microsoft Excel в форме (рис. 15.13).
Рис. 15.13. Ввод данных на лист Microsoft Excel в режиме Формы
При работе с отчетами Microsoft Access следует выполнять аналогичную пошаговую процедуру. Увидеть данные, расположенные на листе Microsoft Excel, можно, открыв отчет в режиме просмотра.
Рис. 15.14. Использование присоединенной рамки объекта для вставки листа Microsoft Excel в форму Microsoft Access
Рассмотрим теперь возможность вставки листов Microsoft Excel с помощью присоединенной рамки объекта. В этом случае листы Excel будут храниться в записях таблицы Access (более разумным представляется хранить не сами таблицы, а ссылки на них, т. е. не внедрять листы Excel, а связывать их с таблицей Access). Сначала в таблице должно быть создано поле типа Объект OLE (OLE Object), которое будет содержать листы Excel. Затем в форме, отображающей записи этой таблицы, должен быть создан элемент Присоединенная рамка объекта (Bound Object Frame), связанный с этим полем. Вставка листа Microsoft Excel в поле таблицы или формы может быть выполнена с помощью команды меню Вставка, Объект (Insert, Object), как это уже описывалось ранее. На рис. 15.14 и 15.15 представлены примеры вставки листа Microsoft Excel в форму и отчет Access.
Рис. 15.15. Использование присоединенной рамки объекта для вставки листов Microsoft Excel в отчет Microsoft Access
Источник
Формы ввода данных в Microsoft Excel
Для облегчения ввода данных в таблицу в Excel можно воспользоваться специальными формами, которые помогут ускорить процесс заполнения табличного диапазона информацией. В Экселе имеется встроенный инструмент позволяющий производить заполнение подобным методом. Также пользователь может создать собственный вариант формы, которая будет максимально адаптирована под его потребности, применив для этого макрос. Давайте рассмотрим различные варианты использования этих полезных инструментов заполнения в Excel.
Применение инструментов заполнения
Форма заполнения представляет собой объект с полями, наименования которых соответствуют названиям колонок столбцов заполняемой таблицы. В эти поля нужно вводить данные и они тут же будут добавляться новой строкой в табличный диапазон. Форма может выступать как в виде отдельного встроенного инструмента Excel, так и располагаться непосредственно на листе в виде его диапазона, если она создана самим пользователем.
Теперь давайте рассмотрим, как пользоваться этими двумя видами инструментов.
Способ 1: встроенный объект для ввода данных Excel
Прежде всего, давайте узнаем, как применять встроенную форму для ввода данных Excel.
- Нужно отметить, что по умолчанию значок, который её запускает, скрыт и его нужно активировать. Для этого переходим во вкладку «Файл», а затем щелкаем по пункту «Параметры».
- В открывшемся окне параметров Эксель перемещаемся в раздел «Панель быстрого доступа». Большую часть окна занимает обширная область настроек. В левой её части находятся инструменты, которые могут быть добавлены на панель быстрого доступа, а в правой – уже присутствующие.
В поле «Выбрать команды из» устанавливаем значение «Команды не на ленте». Далее из списка команд, расположенного в алфавитном порядке, находим и выделяем позицию «Форма…». Затем жмем на кнопку «Добавить».
Способ 2: создание пользовательской формы
Кроме того, с помощью макроса и ряда других инструментов существует возможность создать собственную пользовательскую форму для заполнения табличной области. Она будет создаваться прямо на листе, и представлять собой её диапазон. С помощью данного инструмента пользователь сам сможет реализовать те возможности, которые считает нужными. По функционалу он практически ни в чем не будет уступать встроенному аналогу Excel, а кое в чем, возможно, превосходить его. Единственный недостаток состоит в том, что для каждого табличного массива придется составлять отдельную форму, а не применять один и тот же шаблон, как это возможно при использовании стандартного варианта.
- Как и в предыдущем способе, прежде всего, нужно составить шапку будущей таблицы на листе. Она будет состоять из пяти ячеек с именами: «№ п/п», «Наименование товара», «Количество», «Цена», «Сумма».
- Далее нужно из нашего табличного массива сделать так называемую «умную» таблицу, с возможностью автоматического добавления строчек при заполнении соседних диапазонов или ячеек данными. Для этого выделяем шапку и, находясь во вкладке «Главная», жмем на кнопку «Форматировать как таблицу» в блоке инструментов «Стили». После этого открывается список доступных вариантов стилей. На функционал выбор одного из них никак не повлияет, поэтому выбираем просто тот вариант, который считаем более подходящим.
- Затем открывается небольшое окошко форматирования таблицы. В нем указан диапазон, который мы ранее выделили, то есть, диапазон шапки. Как правило, в данном поле заполнено все верно. Но нам следует установить галочку около параметра «Таблица с заголовками». После этого жмем на кнопку «OK».
- Итак, наш диапазон отформатирован, как «умная» таблица, свидетельством чему является даже изменение визуального отображения. Как видим, помимо прочего, около каждого названия заголовка столбцов появились значки фильтрации. Их следует отключить. Для этого выделяем любую ячейку «умной» таблицы и переходим во вкладку «Данные». Там на ленте в блоке инструментов «Сортировка и фильтр» щелкаем по значку «Фильтр».
Существует ещё один вариант отключения фильтра. При этом не нужно даже будет переходить на другую вкладку, оставаясь во вкладке «Главная». После выделения ячейки табличной области на ленте в блоке настроек «Редактирование» щелкаем по значку «Сортировка и фильтр». В появившемся списке выбираем позицию «Фильтр». 

Второй столбец объекта ввода данных оставим пока что пустым. Непосредственно в него позже будут вводиться значения для заполнения строк основного табличного диапазона.

















В поле «Name» тоже можно заменить название на более удобное. Но это не обязательно. При этом допускается использование пробелов, кириллицы и любых других знаков. В отличие от предыдущего параметра, который задает наименование листа для программы, данный параметр присваивает название листу, видимое пользователю на панели ярлыков.
Как видим, после этого автоматически изменится и наименование Листа 1 в области «Project», на то, которое мы только что задали в настройках.

Sub DataEntryForm()
Dim nextRow As Long
nextRow = Producty.Cells(Producty.Rows.Count, 2).End(xlUp).Offset(1, 0).Row
With Producty
If .Range(«A2»).Value = «» And .Range(«B2»).Value = «» Then
nextRow = nextRow — 1
End If
Producty.Range(«Name»).Copy
.Cells(nextRow, 2).PasteSpecial Paste:=xlPasteValues
.Cells(nextRow, 3).Value = Producty.Range(«Volum»).Value
.Cells(nextRow, 4).Value = Producty.Range(«Price»).Value
.Cells(nextRow, 5).Value = Producty.Range(«Volum»).Value * Producty.Range(«Price»).Value
.Range(«A2»).Formula = «=IF(ISBLANK(B2), «»»», COUNTA($B$2:B2))»
If nextRow > 2 Then
Range(«A2»).Select
Selection.AutoFill Destination:=Range(«A2:A» & nextRow)
Range(«A2:A» & nextRow).Select
End If
.Range(«Diapason»).ClearContents
End With
End Sub
Но этот код не универсальный, то есть, он в неизменном виде подходит только для нашего случая. Если вы хотите его приспособить под свои потребности, то его следует соответственно модифицировать. Чтобы вы смогли сделать это самостоятельно, давайте разберем, из чего данный код состоит, что в нем следует заменить, а что менять не нужно.
Итак, первая строка:
«DataEntryForm» — это название самого макроса. Вы можете оставить его как есть, а можете заменить на любое другое, которое соответствует общим правилам создания наименований макросов (отсутствие пробелов, использование только букв латинского алфавита и т.д.). Изменение наименования ни на что не повлияет.
Везде, где встречается в коде слово «Producty» вы должны его заменить на то наименование, которое ранее присвоили для своего листа в поле «(Name)» области «Properties» редактора макросов. Естественно, это нужно делать только в том случае, если вы назвали лист по-другому.
Теперь рассмотрим такую строку:
nextRow = Producty.Cells(Producty.Rows.Count, 2).End(xlUp).Offset(1, 0).Row
Цифра «2» в данной строчке означает второй столбец листа. Именно в этом столбце находится колонка «Наименование товара». По ней мы будем считать количество рядов. Поэтому, если в вашем случае аналогичный столбец имеет другой порядок по счету, то нужно ввести соответствующее число. Значение «End(xlUp).Offset(1, 0).Row» в любом случае оставляем без изменений.
Далее рассмотрим строку
If .Range(«A2»).Value = «» And .Range(«B2»).Value = «» Then
«A2» — это координаты первой ячейки, в которой будет выводиться нумерация строк. «B2» — это координаты первой ячейки, по которой будет производиться вывод данных («Наименование товара»). Если они у вас отличаются, то введите вместо этих координат свои данные.
Переходим к строке
В ней параметр «Name» означат имя, которое мы присвоили полю «Наименование товара» в форме ввода.
.Cells(nextRow, 2).PasteSpecial Paste:=xlPasteValues
.Cells(nextRow, 3).Value = Producty.Range(«Volum»).Value
.Cells(nextRow, 4).Value = Producty.Range(«Price»).Value
.Cells(nextRow, 5).Value = Producty.Range(«Volum»).Value * Producty.Range(«Price»).Value
наименования «Volum» и «Price» означают названия, которые мы присвоили полям «Количество» и «Цена» в той же форме ввода.
В этих же строках, которые мы указали выше, цифры «2», «3», «4», «5» означают номера столбцов на листе Excel, соответствующих колонкам «Наименование товара», «Количество», «Цена» и «Сумма». Поэтому, если в вашем случае таблица сдвинута, то нужно указать соответствующие номера столбцов. Если столбцов больше, то по аналогии нужно добавить её строки в код, если меньше – то убрать лишние.
В строке производится умножение количества товара на его цену:
.Cells(nextRow, 5).Value = Producty.Range(«Volum»).Value * Producty.Range(«Price»).Value
Результат, как видим из синтаксиса записи, будет выводиться в пятый столбец листа Excel.
В этом выражении выполняется автоматическая нумерация строк:
If nextRow > 2 Then
Range(«A2»).Select
Selection.AutoFill Destination:=Range(«A2:A» & nextRow)
Range(«A2:A» & nextRow).Select
End If
Все значения «A2» означают адрес первой ячейки, где будет производиться нумерация, а координаты «A» — адрес всего столбца с нумерацией. Проверьте, где именно будет выводиться нумерация в вашей таблице и измените данные координаты в коде, если это необходимо.
В строке производится очистка диапазона формы ввода данных после того, как информация из неё была перенесена в таблицу:
Не трудно догадаться, что («Diapason») означает наименование того диапазона, который мы ранее присвоили полям для ввода данных. Если вы дали им другое наименование, то в этой строке должно быть вставлено именно оно.
Дальнейшая часть кода универсальна и во всех случаях будет вноситься без изменений.
После того, как вы записали код макроса в окно редактора, следует нажать на значок сохранения в виде дискеты в левой части окна. Затем можно его закрывать, щелкнув по стандартной кнопке закрытия окон в правом верхнем углу.


В нашем случае, например, логично будет дать ей имя «Добавить». Переименовываем и кликаем мышкой по любой свободной ячейке листа.



В Экселе существует два способа применения формы заполнения данными: встроенная и пользовательская. Применение встроенного варианта требует минимум усилий от пользователя. Его всегда можно запустить, добавив соответствующий значок на панель быстрого доступа. Пользовательскую форму нужно создавать самому, но если вы хорошо разбираетесь в коде VBA, то сможете сделать этот инструмент максимально гибким и подходящим под ваши нужды.
Источник
Содержание
- Применение инструментов заполнения
- Способ 1: встроенный объект для ввода данных Excel
- Способ 2: создание пользовательской формы
- Вопросы и ответы
Для облегчения ввода данных в таблицу в Excel можно воспользоваться специальными формами, которые помогут ускорить процесс заполнения табличного диапазона информацией. В Экселе имеется встроенный инструмент позволяющий производить заполнение подобным методом. Также пользователь может создать собственный вариант формы, которая будет максимально адаптирована под его потребности, применив для этого макрос. Давайте рассмотрим различные варианты использования этих полезных инструментов заполнения в Excel.
Применение инструментов заполнения
Форма заполнения представляет собой объект с полями, наименования которых соответствуют названиям колонок столбцов заполняемой таблицы. В эти поля нужно вводить данные и они тут же будут добавляться новой строкой в табличный диапазон. Форма может выступать как в виде отдельного встроенного инструмента Excel, так и располагаться непосредственно на листе в виде его диапазона, если она создана самим пользователем.
Теперь давайте рассмотрим, как пользоваться этими двумя видами инструментов.
Способ 1: встроенный объект для ввода данных Excel
Прежде всего, давайте узнаем, как применять встроенную форму для ввода данных Excel.
- Нужно отметить, что по умолчанию значок, который её запускает, скрыт и его нужно активировать. Для этого переходим во вкладку «Файл», а затем щелкаем по пункту «Параметры».
- В открывшемся окне параметров Эксель перемещаемся в раздел «Панель быстрого доступа». Большую часть окна занимает обширная область настроек. В левой её части находятся инструменты, которые могут быть добавлены на панель быстрого доступа, а в правой – уже присутствующие.
В поле «Выбрать команды из» устанавливаем значение «Команды не на ленте». Далее из списка команд, расположенного в алфавитном порядке, находим и выделяем позицию «Форма…». Затем жмем на кнопку «Добавить».
- После этого нужный нам инструмент отобразится в правой части окна. Жмем на кнопку «OK».
- Теперь данный инструмент располагается в окне Excel на панели быстрого доступа, и мы им можем воспользоваться. Он будет присутствовать при открытии любой книги данным экземпляром Excel.
- Теперь, чтобы инструмент понял, что именно ему нужно заполнять, следует оформить шапку таблицы и записать любое значение в ней. Пусть табличный массив у нас будет состоять из четырех столбцов, которые имеют названия «Наименование товара», «Количество», «Цена» и «Сумма». Вводим данные названия в произвольный горизонтальный диапазон листа.
- Также, чтобы программа поняла, с каким именно диапазонам ей нужно будет работать, следует ввести любое значение в первую строку табличного массива.
- После этого выделяем любую ячейку заготовки таблицы и щелкаем на панели быстрого доступа по значку «Форма…», который мы ранее активировали.
- Итак, открывается окно указанного инструмента. Как видим, данный объект имеет поля, которые соответствуют названиям столбцов нашего табличного массива. При этом первое поле уже заполнено значением, так как мы его ввели вручную на листе.
- Вводим значения, которые считаем нужными и в остальные поля, после чего жмем на кнопку «Добавить».
- После этого, как видим, в первую строку таблицы были автоматически перенесены введенные значения, а в форме произошел переход к следующему блоку полей, который соответствуют второй строке табличного массива.
- Заполняем окно инструмента теми значениями, которые хотим видеть во второй строке табличной области, и снова щелкаем по кнопке «Добавить».
- Как видим, значения второй строчки тоже были добавлены, причем нам даже не пришлось переставлять курсор в самой таблице.
- Таким образом, заполняем табличный массив всеми значениями, которые хотим в неё ввести.
- Кроме того, при желании, можно производить навигацию по ранее введенным значениям с помощью кнопок «Назад» и «Далее» или вертикальной полосы прокрутки.
- При необходимости можно откорректировать любое значение в табличном массиве, изменив его в форме. Чтобы изменения отобразились на листе, после внесения их в соответствующий блок инструмента, жмем на кнопку «Добавить».
- Как видим, изменение сразу произошло и в табличной области.
- Если нам нужно удалить, какую-то строчку, то через кнопки навигации или полосу прокрутки переходим к соответствующему ей блоку полей в форме. После этого щелкаем по кнопке «Удалить» в окошке инструмента.
- Открывается диалоговое окно предупреждения, в котором сообщается, что строка будет удалена. Если вы уверены в своих действиях, то жмите на кнопку «OK».
- Как видим, строчка была извлечена из табличного диапазона. После того, как заполнение и редактирование закончено, можно выходить из окна инструмента, нажав на кнопку «Закрыть».
- После этого для предания табличному массиву более наглядного визуального вида можно произвести форматирование.
Способ 2: создание пользовательской формы
Кроме того, с помощью макроса и ряда других инструментов существует возможность создать собственную пользовательскую форму для заполнения табличной области. Она будет создаваться прямо на листе, и представлять собой её диапазон. С помощью данного инструмента пользователь сам сможет реализовать те возможности, которые считает нужными. По функционалу он практически ни в чем не будет уступать встроенному аналогу Excel, а кое в чем, возможно, превосходить его. Единственный недостаток состоит в том, что для каждого табличного массива придется составлять отдельную форму, а не применять один и тот же шаблон, как это возможно при использовании стандартного варианта.
- Как и в предыдущем способе, прежде всего, нужно составить шапку будущей таблицы на листе. Она будет состоять из пяти ячеек с именами: «№ п/п», «Наименование товара», «Количество», «Цена», «Сумма».
- Далее нужно из нашего табличного массива сделать так называемую «умную» таблицу, с возможностью автоматического добавления строчек при заполнении соседних диапазонов или ячеек данными. Для этого выделяем шапку и, находясь во вкладке «Главная», жмем на кнопку «Форматировать как таблицу» в блоке инструментов «Стили». После этого открывается список доступных вариантов стилей. На функционал выбор одного из них никак не повлияет, поэтому выбираем просто тот вариант, который считаем более подходящим.
- Затем открывается небольшое окошко форматирования таблицы. В нем указан диапазон, который мы ранее выделили, то есть, диапазон шапки. Как правило, в данном поле заполнено все верно. Но нам следует установить галочку около параметра «Таблица с заголовками». После этого жмем на кнопку «OK».
- Итак, наш диапазон отформатирован, как «умная» таблица, свидетельством чему является даже изменение визуального отображения. Как видим, помимо прочего, около каждого названия заголовка столбцов появились значки фильтрации. Их следует отключить. Для этого выделяем любую ячейку «умной» таблицы и переходим во вкладку «Данные». Там на ленте в блоке инструментов «Сортировка и фильтр» щелкаем по значку «Фильтр».
Существует ещё один вариант отключения фильтра. При этом не нужно даже будет переходить на другую вкладку, оставаясь во вкладке «Главная». После выделения ячейки табличной области на ленте в блоке настроек «Редактирование» щелкаем по значку «Сортировка и фильтр». В появившемся списке выбираем позицию «Фильтр».
- Как видим, после этого действия значки фильтрации исчезли из шапки таблицы, как это и требовалось.
- Затем нам следует создать саму форму ввода данных. Она тоже будет представлять собой своего рода табличный массив, состоящий из двух столбцов. Наименования строк данного объекта будут соответствовать именам столбцов основной таблицы. Исключение составляют столбцы «№ п/п» и «Сумма». Они будут отсутствовать. Нумерация первого из них будет происходить при помощи макроса, а расчет значений во втором будет производиться путем применения формулы умножения количества на цену.
Второй столбец объекта ввода данных оставим пока что пустым. Непосредственно в него позже будут вводиться значения для заполнения строк основного табличного диапазона.
- После этого создаем ещё одну небольшую таблицу. Она будет состоять из одного столбца и в ней разместится список товаров, которые мы будем выводить во вторую колонку основной таблицы. Для наглядности ячейку с заголовком данного перечня («Список товаров») можно залить цветом.
- Затем выделяем первую пустую ячейку объекта ввода значений. Переходим во вкладку «Данные». Щелкаем по значку «Проверка данных», который размещен на ленте в блоке инструментов «Работа с данными».
- Запускается окно проверки вводимых данных. Кликаем по полю «Тип данных», в котором по умолчанию установлен параметр «Любое значение».
- Из раскрывшихся вариантов выбираем позицию «Список».
- Как видим, после этого окно проверки вводимых значений несколько изменило свою конфигурацию. Появилось дополнительное поле «Источник». Щелкаем по пиктограмме справа от него левой клавишей мыши.
- Затем окно проверки вводимых значений сворачивается. Выделяем курсором с зажатой левой клавишей мыши перечень данных, которые размещены на листе в дополнительной табличной области «Список товаров». После этого опять жмем на пиктограмму справа от поля, в котором появился адрес выделенного диапазона.
- Происходит возврат к окошку проверки вводимых значений. Как видим, координаты выделенного диапазона в нем уже отображены в поле «Источник». Кликаем по кнопке «OK» внизу окна.
- Теперь справа от выделенной пустой ячейки объекта ввода данных появилась пиктограмма в виде треугольника. При клике на неё открывается выпадающий список, состоящий из названий, которые подтягиваются из табличного массива «Список товаров». Произвольные данные в указанную ячейку теперь внести невозможно, а только можно выбрать из представленного списка нужную позицию. Выбираем пункт в выпадающем списке.
- Как видим, выбранная позиция тут же отобразилась в поле «Наименование товара».
- Далее нам нужно будет присвоить имена тем трем ячейкам формы ввода, куда мы будем вводить данные. Выделяем первую ячейку, где уже установлено в нашем случае наименование «Картофель». Далее переходим в поле наименования диапазонов. Оно расположено в левой части окна Excel на том же уровне, что и строка формул. Вводим туда произвольное название. Это может быть любое наименование на латинице, в котором нет пробелов, но лучше все-таки использовать названия близкие к решаемым данным элементом задачам. Поэтому первую ячейку, в которой содержится название товара, назовем «Name». Пишем данное наименование в поле и жмем на клавишу Enter на клавиатуре.
- Точно таким же образом присваиваем ячейке, в которую будем вводить количество товара, имя «Volum».
- А ячейке с ценой – «Price».
- После этого точно таким же образом даем название всему диапазону из вышеуказанных трех ячеек. Прежде всего, выделим, а потом дадим ему наименование в специальном поле. Пусть это будет имя «Diapason».
- После последнего действия обязательно сохраняем документ, чтобы названия, которые мы присвоили, смог воспринимать макрос, созданный нами в дальнейшем. Для сохранения переходим во вкладку «Файл» и кликаем по пункту «Сохранить как…».
- В открывшемся окне сохранения в поле «Тип файлов» выбираем значение «Книга Excel с поддержкой макросов (.xlsm)». Далее жмем на кнопку «Сохранить».
- Затем вам следует активировать работу макросов в своей версии Excel и включить вкладку «Разработчик», если вы это до сих пор не сделали. Дело в том, что обе эти функции по умолчанию в программе отключены, и их активацию нужно выполнять принудительно в окне параметров Excel.
- После того, как вы сделали это, переходим во вкладку «Разработчик». Кликаем по большому значку «Visual Basic», который расположен на ленте в блоке инструментов «Код».
- Последнее действие приводит к тому, что запускается редактор макросов VBA. В области «Project», которая расположена в верхней левой части окна, выделяем имя того листа, где располагаются наши таблицы. В данном случае это «Лист 1».
- После этого переходим к левой нижней области окна под названием «Properties». Тут расположены настройки выделенного листа. В поле «(Name)» следует заменить кириллическое наименование («Лист1») на название, написанное на латинице. Название можно дать любое, которое вам будет удобнее, главное, чтобы в нем были исключительно символы латиницы или цифры и отсутствовали другие знаки или пробелы. Именно с этим именем будет работать макрос. Пусть в нашем случае данным названием будет «Producty», хотя вы можете выбрать и любое другое, соответствующее условиям, которые были описаны выше.
В поле «Name» тоже можно заменить название на более удобное. Но это не обязательно. При этом допускается использование пробелов, кириллицы и любых других знаков. В отличие от предыдущего параметра, который задает наименование листа для программы, данный параметр присваивает название листу, видимое пользователю на панели ярлыков.
Как видим, после этого автоматически изменится и наименование Листа 1 в области «Project», на то, которое мы только что задали в настройках.
- Затем переходим в центральную область окна. Именно тут нам нужно будет записать сам код макроса. Если поле редактора кода белого цвета в указанной области не отображается, как в нашем случае, то жмем на функциональную клавишу F7 и оно появится.
- Теперь для конкретно нашего примера нужно записать в поле следующий код:
Sub DataEntryForm()
Dim nextRow As Long
nextRow = Producty.Cells(Producty.Rows.Count, 2).End(xlUp).Offset(1, 0).Row
With Producty
If .Range("A2").Value = "" And .Range("B2").Value = "" Then
nextRow = nextRow - 1
End If
Producty.Range("Name").Copy
.Cells(nextRow, 2).PasteSpecial Paste:=xlPasteValues
.Cells(nextRow, 3).Value = Producty.Range("Volum").Value
.Cells(nextRow, 4).Value = Producty.Range("Price").Value
.Cells(nextRow, 5).Value = Producty.Range("Volum").Value * Producty.Range("Price").Value
.Range("A2").Formula = "=IF(ISBLANK(B2), """", COUNTA($B$2:B2))"
If nextRow > 2 Then
Range("A2").Select
Selection.AutoFill Destination:=Range("A2:A" & nextRow)
Range("A2:A" & nextRow).Select
End If
.Range("Diapason").ClearContents
End With
End Sub
Но этот код не универсальный, то есть, он в неизменном виде подходит только для нашего случая. Если вы хотите его приспособить под свои потребности, то его следует соответственно модифицировать. Чтобы вы смогли сделать это самостоятельно, давайте разберем, из чего данный код состоит, что в нем следует заменить, а что менять не нужно.
Итак, первая строка:
Sub DataEntryForm()«DataEntryForm» — это название самого макроса. Вы можете оставить его как есть, а можете заменить на любое другое, которое соответствует общим правилам создания наименований макросов (отсутствие пробелов, использование только букв латинского алфавита и т.д.). Изменение наименования ни на что не повлияет.
Везде, где встречается в коде слово «Producty» вы должны его заменить на то наименование, которое ранее присвоили для своего листа в поле «(Name)» области «Properties» редактора макросов. Естественно, это нужно делать только в том случае, если вы назвали лист по-другому.
Теперь рассмотрим такую строку:
nextRow = Producty.Cells(Producty.Rows.Count, 2).End(xlUp).Offset(1, 0).RowЦифра «2» в данной строчке означает второй столбец листа. Именно в этом столбце находится колонка «Наименование товара». По ней мы будем считать количество рядов. Поэтому, если в вашем случае аналогичный столбец имеет другой порядок по счету, то нужно ввести соответствующее число. Значение «End(xlUp).Offset(1, 0).Row» в любом случае оставляем без изменений.
Далее рассмотрим строку
If .Range("A2").Value = "" And .Range("B2").Value = "" Then«A2» — это координаты первой ячейки, в которой будет выводиться нумерация строк. «B2» — это координаты первой ячейки, по которой будет производиться вывод данных («Наименование товара»). Если они у вас отличаются, то введите вместо этих координат свои данные.
Переходим к строке
Producty.Range("Name").CopyВ ней параметр «Name» означат имя, которое мы присвоили полю «Наименование товара» в форме ввода.
В строках
.Cells(nextRow, 2).PasteSpecial Paste:=xlPasteValues
.Cells(nextRow, 3).Value = Producty.Range("Volum").Value
.Cells(nextRow, 4).Value = Producty.Range("Price").Value
.Cells(nextRow, 5).Value = Producty.Range("Volum").Value * Producty.Range("Price").Value
наименования «Volum» и «Price» означают названия, которые мы присвоили полям «Количество» и «Цена» в той же форме ввода.
В этих же строках, которые мы указали выше, цифры «2», «3», «4», «5» означают номера столбцов на листе Excel, соответствующих колонкам «Наименование товара», «Количество», «Цена» и «Сумма». Поэтому, если в вашем случае таблица сдвинута, то нужно указать соответствующие номера столбцов. Если столбцов больше, то по аналогии нужно добавить её строки в код, если меньше – то убрать лишние.
В строке производится умножение количества товара на его цену:
.Cells(nextRow, 5).Value = Producty.Range("Volum").Value * Producty.Range("Price").ValueРезультат, как видим из синтаксиса записи, будет выводиться в пятый столбец листа Excel.
В этом выражении выполняется автоматическая нумерация строк:
If nextRow > 2 Then
Range("A2").Select
Selection.AutoFill Destination:=Range("A2:A" & nextRow)
Range("A2:A" & nextRow).Select
End If
Все значения «A2» означают адрес первой ячейки, где будет производиться нумерация, а координаты «A» — адрес всего столбца с нумерацией. Проверьте, где именно будет выводиться нумерация в вашей таблице и измените данные координаты в коде, если это необходимо.
В строке производится очистка диапазона формы ввода данных после того, как информация из неё была перенесена в таблицу:
.Range("Diapason").ClearContentsНе трудно догадаться, что («Diapason») означает наименование того диапазона, который мы ранее присвоили полям для ввода данных. Если вы дали им другое наименование, то в этой строке должно быть вставлено именно оно.
Дальнейшая часть кода универсальна и во всех случаях будет вноситься без изменений.
После того, как вы записали код макроса в окно редактора, следует нажать на значок сохранения в виде дискеты в левой части окна. Затем можно его закрывать, щелкнув по стандартной кнопке закрытия окон в правом верхнем углу.
- После этого возвращаемся на лист Excel. Теперь нам следует разместить кнопку, которая будет активировать созданный макрос. Для этого переходим во вкладку «Разработчик». В блоке настроек «Элементы управления» на ленте кликаем по кнопке «Вставить». Открывается перечень инструментов. В группе инструментов «Элементы управления формы» выбираем самый первый – «Кнопка».
- Затем с зажатой левой клавишей мыши обводим курсором область, где хотим разместить кнопку запуска макроса, который будет производить перенос данных из формы в таблицу.
- После того, как область обведена, отпускаем клавишу мыши. Затем автоматически запускается окно назначения макроса объекту. Если в вашей книге применяется несколько макросов, то выбираем из списка название того, который мы выше создавали. У нас он называется «DataEntryForm». Но в данном случае макрос один, поэтому просто выбираем его и жмем на кнопку «OK» внизу окна.
- После этого можно переименовать кнопку, как вы захотите, просто выделив её текущее название.
В нашем случае, например, логично будет дать ей имя «Добавить». Переименовываем и кликаем мышкой по любой свободной ячейке листа.
- Итак, наша форма полностью готова. Проверим, как она работает. Вводим в её поля необходимые значения и жмем на кнопку «Добавить».
- Как видим, значения перемещены в таблицу, строке автоматически присвоен номер, сумма посчитана, поля формы очищены.
- Повторно заполняем форму и жмем на кнопку «Добавить».
- Как видим, и вторая строка также добавлена в табличный массив. Это означает, что инструмент работает.
Читайте также:
Как создать макрос в Excel
Как создать кнопку в Excel
В Экселе существует два способа применения формы заполнения данными: встроенная и пользовательская. Применение встроенного варианта требует минимум усилий от пользователя. Его всегда можно запустить, добавив соответствующий значок на панель быстрого доступа. Пользовательскую форму нужно создавать самому, но если вы хорошо разбираетесь в коде VBA, то сможете сделать этот инструмент максимально гибким и подходящим под ваши нужды.
09.02.12 — 09:37
Пользователи хотят видеть содержимое выбираемого файла. Т.е. нужна возможность программно подгружать лист excel в какой-то объет на форме. Реально ли это?
1 — 09.02.12 — 09:38
в таб поле грузи
2 — 09.02.12 — 09:39
(0)[Реально ли это]
да
3 — 09.02.12 — 09:40
(1) В табличное поле? Расскажите как это сделать?
4 — 09.02.12 — 09:40
(0) бгыы..
запуститьприложение(путькфайлу);
5 — 09.02.12 — 09:45
(4) Пользователи не хотят метаться между окнами. Их задача заключается в том чтобы находить соответствие для строки excel-файла в справочнике нашей базы (автоматом это пока никак не реализовать, связь совершенно неявная, к тому же форматы файлов всегда разные). Я вот и хочу сделать обработочку, чтобы слева был excel-файл, а справа дерево справочника.
6 — 09.02.12 — 09:46
(5)[Я вот и хочу сделать обработочку, чтобы слева был excel-файл, а справа дерево справочника.]
более тупое решение трудно представить
7 — 09.02.12 — 09:46
(5) на ИТСе есть обработка универсальная по загрузке из табилчных документов…
и ты не поверишь…..
8 — 09.02.12 — 09:48
(7) Что за обработка? Как называется?
9 — 09.02.12 — 09:48
(5) может выгрузить содержимое справочника и в ексель на соседние ячейки закрузить? пусть в экселе сравнивают сидят…
10 — 09.02.12 — 09:49
(7) И желательно сохранить форматирование файла (шрифты, формат, рамки, объединение ячеек).
11 — 09.02.12 — 09:50
(9) справочник — 250.000 позиций. Выгрузить в excel не получится )
12 — 09.02.12 — 09:51
(10) это уже сложно, ищи другой путь… этот изначально кривой
13 — 09.02.12 — 09:51
(10) [И желательно сохранить форматирование файла (шрифты, формат, рамки, объединение ячеек).]
полный бред
для мапинга справочников это нужно отрезать
14 — 09.02.12 — 09:51
(11) действия, вывести список. в эксель просто копипастом можно пихнуть на другой лист например
15 — 09.02.12 — 09:53
(11) будь мужиком, обнови офис до 2010, блеять!
16 — 09.02.12 — 09:53
(10) ы ы ы ы ….
ну ну…
успехов…
17 — 09.02.12 — 09:55
(15) Зачем? Как мне это поможет?
18 — 09.02.12 — 09:56
(14) 250 тысяч позиций в список не вывести. Рабочего дня, да и памяти не хватит.
19 — 09.02.12 — 09:58
(18) не гони,
это занимает 3-5 минуты
20 — 09.02.12 — 09:58
(18) ну запросом выдёргивай данные, кусками по 10 тыщ, выводи в ТП и оттуда копипастом в эксель. Или отчет сделай и «СохранитьКопиюКак» — там в эксель
21 — 09.02.12 — 09:59
(5) а зачем? Что должны пользователи сделать еще кроме как поглядеть?
22 — 09.02.12 — 09:59
(20) + 1
или ADODB с реактивной скоростью
23 — 09.02.12 — 10:00
(0) Загрузи Ексель в регистр сведений и делай с ним что хочешь. Удобно запросами будет работать.
24 — 09.02.12 — 10:02
А кто-нибудь пользовался ActiveX объектом «Microsoft Office Spreadsheet 11»?
25 — 09.02.12 — 10:03
Задача стоит: не выгрузить справочник в excel и не загрузить excel в регистр или еще куда-то.
Задача стоит: отобразить лист excel-документа на форме в 1С?
26 — 09.02.12 — 10:07
см (21)
27 — 09.02.12 — 10:09
загружай…
Док = ПолучитьCOMОбъект(Путь + «ценыконкурентов.xls»);
КоличествоСтраниц = 2;
Для ТекНомер = 1 По КоличествоСтраниц Цикл
Контрагент = Док.Sheets(ТекНомер).Cells(1,1).Value;
Товар = Док.Sheets(ТекНомер).Cells(2,2).Value;
Цена = Док.Sheets(ТекНомер).Cells(2,3).Value;
счСтроки = 3;
Сообщить(Строка(Товар) + «-» + Строка(Цена));
Пока СокрЛП(Товар) <> «» Цикл // можно использовать другой признак
// окончания данных на листе
Товар = Док.Sheets(ТекНомер).Cells(СчСтроки,2).Value;
Цена = Док.Sheets(ТекНомер).Cells(СчСтроки,3).Value;
Сообщить(Строка(Товар) + «-» + Строка(Цена));
счСтроки = счСтроки + 1;
КонецЦикла;
КонецЦикла;
Док.Application.Quit();
Грузи в ТЗ сначала, потом это ТЗ в таб документ на форме можно вывести. без цвета и шрифта и рамок. с этим надо отдельно работать, долго и усердно
28 — 09.02.12 — 10:10
(26) в конечном счете пользователи должны найти позицию в нашей базе и внести изменеия в excel (по-сути добавить туда несколько колонок «позиция»,»характеристики»,»возможность пересогласования на более дешевый аналог»,»цена»,»сумма» и т.п.)
29 — 09.02.12 — 10:13
(27) ActiveX-объект «Microsoft Office Spreadsheet 11» позволяет сохранять форматирование и загрузка документа должна быть гораздо быстрее циклического обхода всех ячеек.
Кто-нибудь его юзал?
30 — 09.02.12 — 10:14
стоп, цель внести изменения в Эксель а не в 1с. и работать надо с экселем. ИМХО — выгружать справочник в эксель таки надо, а не извращаться…
31 — 09.02.12 — 10:19
(30) да там поиск по справочнику для каждой позиции нужно делать исходя не только из данных справочника! Помимо всего прочего пользователи смотрят историю заказов текущей позиции, финансовые ограничения клиента, подтягивают данные смежных областей (типа возможность применения материала в текущих средах), обязательные комплекты и проч…
Все это уже есть и работает.
Нужно просто вытягивать на форму в 1С лист excel.
32 — 09.02.12 — 10:21
(31) А почему нельзя затянуть нужные данные в 1С, с ними поработать, сопоставить, а потом обратно занести в ексель?
33 — 09.02.12 — 10:29
(32) Теряется форматирование файла, схемы и вложенные рисунки.
Без этого 30-ти страничный документ становится нечитабельным (
34 — 09.02.12 — 10:31
(33) Стоп! Никто не говорит, что ексель надо создавать заново.
После обработки в 1С проставить данные в нужные ячейки существующего файла.
35 — 09.02.12 — 10:38
(34) Правильно! После обработки мы будем модифицировать excel-файл. А вот с «затянуть нужные данные в 1С» — проблема. Затягивать нужно весь лист excel-файла, с картинками, схемами и сохранением форматирования.
36 — 09.02.12 — 10:47
(35) Они картинками, схемами и форматированием для выставления соответствий пользуются?
37 — 09.02.12 — 10:50
(36) Ага. Комплексные инженерные решения — вещь тонкая. Ошибка в одном узле приведет к разбалансировке всей дорогостоящей системы. Могут и посадить, если новая котельная в -30 вдруг накроется.
38 — 09.02.12 — 10:59
Я на форму добавил ActiveX-объект «Microsoft Office Spreadsheet 11». Он позволяет сохранять форматирование и т.п. Только не могу понять как загружать в него выбранный файл. Хелп!
39 — 09.02.12 — 11:05
у меня такого нет, гугли методы у этой штуки
40 — 09.02.12 — 11:11
(39) Если такого нет, то нужно скачать и установить на всех компах, где это будет использоваться «Office Web Component» (OWC11.exe) с microsoft.com.
Мне повезло — все работают через терминал.
Maxus43
41 — 09.02.12 — 11:14
не спасибо, таких извратов мне не надо)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 |
using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Windows.Forms; using Excel = Microsoft.Office.Interop.Excel; namespace WindowsFormsApplication1 { public partial class Form1 : Form { List<char> ABC; //счетчик и "сбрасыватель" счетчика int abcIt = 0; int abc = 26; //26 букв в англ. алфавите ;) public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { ABC = new List<char>(); for (int i = 65; i < 91; i++) //ABCDEF... англ. алфавит { ABC.Add((char)i); } } private void button1_Click(object sender, EventArgs e) //Загружаем данные в dataGridView с Excel файла и вырисовываем dataGridView { bool Load = true; CloseExcel(); bool isSelected = false; openFileDialog1.InitialDirectory = "C:"; openFileDialog1.Title = "Выбрать файл"; openFileDialog1.FileName = ""; openFileDialog1.Filter = "Файлы xlsx|*.xlsx"; if (openFileDialog1.ShowDialog() == DialogResult.OK) { Prop.Path = openFileDialog1.FileName; isSelected = true; Prop.FileName = openFileDialog1.SafeFileName; } else { MessageBox.Show("Файл не выбран"); } if (isSelected) //Файл выбран, начинаем загрузку в dataGridView { this.Cursor = Cursors.AppStarting; //Меняем вид курсора пока происходит загрузка из файла на dataGridView. dataGridView1.RowHeadersWidth = 60; //Ширина столбца, заголовков строк abcIt = 0; abc = 26; Excel.Application xlApp; Excel.Workbook xlWorkBook; Excel.Worksheet xlWorkSheet; object misValue = System.Reflection.Missing.Value; xlApp = new Excel.Application(); var workbooks = xlApp.Workbooks; xlWorkBook = workbooks.Open(Prop.Path, 0, false, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "t", false, false, 0, true, 1, 0); var worksheets = xlWorkBook.Worksheets; xlWorkSheet = (Excel.Worksheet)worksheets.get_Item(1); //Счетчики int NullRows = 0; int NullColums = 0; int index = 1; //Считаем сколько у нас заполненных строк и столбцов в excel файле. Считать будем по заголовкам. Все остальное в расчет не брал. //Количество строк. Подсчет ведется для создания количества строк на dataGridView. for (int x = 1; x < 256; x++) //То есть больше 256х256 он искать не будет. Но и лишние - пустые ячейки он считать не будет. { if (xlWorkSheet.Cells[x, index].Value == null) //Если ячейка пустая, то наш счетчик считает до 5 и выходит из цикла. (Вспомнилась считалочка, "Я считаю до пяти, не могу до десяти") { NullRows++; if (NullRows == 5) { Prop.X = x - 5; if (Prop.X > 0) //Проверка на вертикальные заголовки. Если есть текст, то загружаем его в dataGridView { break; } else { x = 0; NullRows = 0; //Обнуляем счетчики, для дальнейшего подсчета index++; //Увеличиваем индекс на 1, для просмотра строк, следующих пяти столбцов if (index == 5) //Если же 5 строк пяти столбцов оказались без текста, то... { MessageBox.Show("Файл либо пустой, либо поиск рассчитан на определенное расположение текста в Excel файле. Работа с данным файлом, в данное версии программы, прекращена"); index = 1; Load = false; break; } } } } else //Если же после пустых ячеек(до 5), есть еще заполненная ячейка, то "обнуляем" наш счетчик. { if (NullRows >= 1) { NullRows = 0; } } } //Количество столбцов. Подсчет ведется для создания количества столбцов на dataGridView. for (int y = 1; y < 256; y++) { if (xlWorkSheet.Cells[1, y].Value == null) { NullColums++; if (NullColums == 5) { Prop.Y = y - 5; if (Prop.Y > 0) //Проверка на вертикальные заголовки(надеюсь понятно, что это такое;)). Если есть текст, то загружаем его { break; } else { y = 0; NullColums = 0; index++; if (index == 5) { MessageBox.Show("Файл либо пустой, либо поиск рассчитан на определенное расположение текста в Excel файле. Работа с данным файлом, в данное версии программы, прекращена"); index = 1; Load = false; break; } } } } else { if (NullColums >= 1) { NullColums = 0; } } } if (Load) { //Рисуем dataGridView1 dataGridView1.RowCount = Prop.X; dataGridView1.ColumnCount = Prop.Y; //названия/имена "x" и "y" малость перепутаны ;) for (int x = 0; x < Prop.Y; x++) { if ((string)dataGridView1.Columns[x].HeaderCell.Value == "") //Если вместо "АА" "АВ" и тд. будет "", то... { //Если дойдем до "AZ", то после следующей "махинации", следующий заголовок столбца станет "BA"..."BZ","CA"..."CZ" и тд. if ((x - 26) == 26) { abcIt++; abc += 26; } dataGridView1.Columns[x].HeaderCell.Value = ABC[abcIt].ToString() + ABC[x - abc].ToString(); //Пишем в заголовки столбцов (AA AB AC AD.. DA DB... ZZ дальше ZZ выдаст ошибку, индекс за пределами массива. Если расчет верен, ZZ будет столбцом № 17602 в Excel файле) } for (int y = 0; y < Prop.X; y++) { if (dataGridView1.Rows[y].HeaderCell.Value == null) //проверка на null - чтобы лишний раз не записывать одно и то же число в одну и ту же ячейку { dataGridView1.Rows[y].HeaderCell.Value = (y + 1).ToString(); //Записываем в dataGridView, в строковые заголовки, значения от 1 до Prop.Y } //Записываем в dataGridView dataGridView1[x, y].Value = xlWorkSheet.Cells[y + 1, x + 1].Value; } } } //Закрываем документы xlWorkBook.Close(true, misValue, misValue); xlApp.Quit(); this.Cursor = Cursors.Default; //Меняем вид курсора в первоисходное положение } } private void button2_Click(object sender, EventArgs e) //Сохраняем в Excel файл { CloseExcel(); bool isSave = false; saveFileDialog1.InitialDirectory = "C:"; saveFileDialog1.Title = "Сохранить в файл"; saveFileDialog1.FileName = ""; saveFileDialog1.Filter = "Файлы xlsx|*.xlsx"; saveFileDialog1.FileName = Prop.FileName; if (saveFileDialog1.ShowDialog() == DialogResult.OK) { Prop.Path = saveFileDialog1.FileName; isSave = true; } else { MessageBox.Show("Файл не сохранен"); } if (isSave) { //Если файл не существует, то мы создадим его if (!File.Exists(Prop.Path)) { Excel.Application WorkExcel = new Excel.Application(); Excel.Workbook WorkBook = WorkExcel.Workbooks.Add(); // создаем книгу WorkBook.SaveAs(Prop.Path);//сохранить Excel файл WorkBook.Close(); WorkExcel.Quit(); } this.Cursor = Cursors.AppStarting; //Меняем вид курсора пока происходит сохранение в файл. Excel.Application xlApp; Excel.Workbook xlWorkBook; Excel.Worksheet xlWorkSheet; object misValue = System.Reflection.Missing.Value; xlApp = new Excel.Application(); var workbooks = xlApp.Workbooks; xlWorkBook = workbooks.Open(Prop.Path, 0, false, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "t", false, false, 0, true, 1, 0); var worksheets = xlWorkBook.Worksheets; xlWorkSheet = (Excel.Worksheet)worksheets.get_Item(1); Prop.X = dataGridView1.Columns.Count; Prop.Y = dataGridView1.Rows.Count; //Сохраняем в Excel файл. for (int x = 0; x < Prop.X; x++) { for (int y = 0; y < Prop.Y; y++) { xlWorkSheet.Cells[y + 1, x + 1].Value = dataGridView1[x, y].Value; } } xlWorkBook.Save(); xlWorkBook.Close(true, misValue, misValue); xlApp.Quit(); this.Cursor = Cursors.Default; MessageBox.Show("Сохранено!"); } } void CloseExcel() { int proc = 0; bool OK = false; bool Cancel = false; foreach (Process item in Process.GetProcesses()) { if (item.ProcessName == "EXCEL") { proc++; if (proc > 0 && !Cancel) { //Чтобы не повторяться, то есть по несколько раз не выдавать одно и тоже сообщение if (!OK) { var result = MessageBox.Show("Для корректной работы программы процесс Microsoft Excel нужно завершить. При завершении все не сохраненные файлы будут потеряны. Прежде чем завершить работу процесса, сохраните данные. Все ровно завершить?", "Обнаружен включенный процесс Microsoft Excel", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning); if (result == DialogResult.OK) { OK = true; } else { Cancel = true; } } if (OK) { item.Kill(); } } } if (Cancel) { break; } } } } } |
|
Megamen2 Пользователь Сообщений: 101 |
Здравствуйте, специалисты разбирающиеся в экселе. Подскажите — можно ли вытащить на форму — лист, так чтобы можно было на нем — делать все то же самое, что и на обычном листе — вводить данные, рисовать диаграммы и т.д. ? |
|
Nordheim Пользователь Сообщений: 3154 |
А в чем смысл? Чем не устраивает работа на листе? «Все гениальное просто, а все простое гениально!!!» |
|
Megamen2,Здравствуйте, посмотрите здесь с сообщения №12 |
|
|
Megamen2 Пользователь Сообщений: 101 |
Александр П., прошел по ссылке, посмотрел сообщение №12. |
|
Megamen2,Ну если вам название компонента и скриншот из сообщения 13 ни о чем не говорит то извините. |
|
|
Megamen2 Пользователь Сообщений: 101 |
Александр П., подключил этот компонент SpreadSheet. А как диаграммы-то в нем строить ? |
|
Андрей VG Пользователь Сообщений: 11878 Excel 2016, 365 |
#7 07.12.2017 10:06:24 Доброе время суток.
Никак. SpreadSheet — упрощённая версия рабочего листа, оставшаяся с Excel 2003, когда была возможность публикации страницы с некоторой функциональностью как web-страницы. |
||
|
Megamen2 Пользователь Сообщений: 101 |
#8 07.12.2017 10:34:16
А как — сделать форму не модальной ? |
||
|
Nordheim Пользователь Сообщений: 3154 |
#9 07.12.2017 10:36:50 В свойствах формы установите:
Можно при загрузке кодом
Изменено: Nordheim — 07.12.2017 10:53:20 «Все гениальное просто, а все простое гениально!!!» |
||||
|
Megamen2 Пользователь Сообщений: 101 |
Nordheim, я не совсем понял. |
|
Nordheim Пользователь Сообщений: 3154 |
Немодальная форма не блокирует лист поэтому можно не закрывая ее (форму) работать с листом (листами), файлами. Изменено: Nordheim — 08.12.2017 10:24:51 «Все гениальное просто, а все простое гениально!!!» |
|
Megamen2 Пользователь Сообщений: 101 |
Nordheim, так я так — нормально работаю с листом. |
|
Андрей VG Пользователь Сообщений: 11878 Excel 2016, 365 |
#13 08.12.2017 10:52:28
Написать свой COM-компонент, позволяющий отображать и работать с листом Excel (подобно тому как это можно делать вставив объект листа Excel, например в Word), который подобно другим компонентам, например ProgressBar, можно поместить на UserForm. |
||
|
Megamen2 Пользователь Сообщений: 101 |
#14 08.12.2017 12:03:49
Вы не могли бы привести код такого компонента ? |
||
|
Андрей VG Пользователь Сообщений: 11878 Excel 2016, 365 |
#15 08.12.2017 13:33:43
А я не уверен, что кто-либо на форуме подобным занимался. Могу предположить, что Владимир (ZVI) или Сергей (Doobler) делали подобное. Почитайте , в качестве вводного обзора. |
||














































