Как сделать таблицу в бейсике
Работа с таблицами Working with tables
В этом разделе представлены примеры Visual Basic, связанные с задачами, указанными в следующих разделах. This topic includes Visual Basic examples related to the tasks identified in the following sections.
Создание таблицы, вставка текста и применение форматирования Creating a table, inserting text, and applying formatting
В следующем примере в начало активного документа вставляется таблица из трех строк и трех столбцов. The following example inserts a four-column, three-row table at the beginning of the active document. Параметр For Each. Следующая структура используется для пошагового перехода по каждой ячейке в таблице. The For Each. Next structure is used to step through each cell in the table. В разделе For Each. Next Structure метод InsertAfter объекта Range используется для добавления текста в ячейки таблицы (ячейка 1, ячейка 2 и т. д.). Within the For Each. Next structure, the InsertAfter method of the Range object is used to add text to the table cells (Cell 1, Cell 2, and so on).
Вставка текста в ячейку таблицы Inserting text into a table cell
Возвращение текста из ячейки таблицы без возвращения маркера конца ячейки Returning text from a table cell without returning the end of cell marker
В следующем примере показано возвращение и отображение содержимого каждой ячейки в первой строке первой таблицы документа. The following example returns and displays the contents of each cell in the first row of the first document table.
Преобразование существующего текста в таблицу Converting existing text to a table
В примере ниже показано, как вставить текст с разделителями табуляцией в начало активного документа, а затем преобразовать текст в таблицу. The following example inserts tab-delimited text at the beginning of the active document and then converts the text to a table.
Возвращение содержимого каждой ячейки таблицы Returning the contents of each table cell
В следующем примере определяется массив, равный количеству ячеек в первой таблице документа (при условии, что параметр Base 1). The following example defines an array equal to the number of cells in the first document table (assuming Option Base 1). Параметр For Each. Следующая структура используется для возвращения содержимого каждой ячейки таблицы и назначения текста соответствующему элементу массива. The For Each. Next structure is used to return the contents of each table cell and assign the text to the corresponding array element.
Копирование всех таблиц в активном документе в новый документ Copying all tables in the active document into a new document
В этом примере показано, как скопировать таблицы из текущего документа в новый документ. This example copies the tables from the current document into a new document.
Поддержка и обратная связь Support and feedback
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Have questions or feedback about Office VBA or this documentation? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь. Please see Office VBA support and feedback for guidance about the ways you can receive support and provide feedback.
Автоматизация рутины в Microsoft Excel при помощи VBA
В этом посте я расскажу, что такое VBA и как с ним работать в Microsoft Excel 2007/2010 (для более старых версий изменяется лишь интерфейс — код, скорее всего, будет таким же) для автоматизации различной рутины.
VBA (Visual Basic for Applications) — это упрощенная версия Visual Basic, встроенная в множество продуктов линейки Microsoft Office. Она позволяет писать программы прямо в файле конкретного документа. Вам не требуется устанавливать различные IDE — всё, включая отладчик, уже есть в Excel.
Еще при помощи Visual Studio Tools for Office можно писать макросы на C# и также встраивать их. Спасибо, FireStorm.
Сразу скажу — писать на других языках (C++/Delphi/PHP) также возможно, но требуется научится читать, изменять и писать файлы офиса — встраивать в документы не получится. А интерфейсы Microsoft работают через COM. Чтобы вы поняли весь ужас, вот Hello World с использованием COM.
Поэтому, увы, будем учить Visual Basic.
Чуть-чуть подготовки и постановка задачи
Итак, поехали. Открываем Excel.
Для начала давайте добавим в Ribbon панель «Разработчик». В ней находятся кнопки, текстовые поля и пр. элементы для конструирования форм.
Теперь давайте подумаем, на каком примере мы будем изучать VBA. Недавно мне потребовалось красиво оформить прайс-лист, выглядевший, как таблица. Идём в гугл, набираем «прайс-лист» и качаем любой, который оформлен примерно так (не сочтите за рекламу, пожалуйста):
То есть требуется, чтобы было как минимум две группы, по которым можно объединить товары (в нашем случае это будут Тип и Производитель — в таком порядке). Для того, чтобы предложенный мною алгоритм работал корректно, отсортируйте товары так, чтобы товары из одной группы стояли подряд (сначала по Типу, потом по Производителю).
Результат, которого хотим добиться, выглядит примерно так:
Разумеется, если смотреть прайс только на компьютере, то можно добавить фильтры и будет гораздо удобнее искать нужный товар. Однако мы хотим научится кодить и задача вполне подходящая, не так ли?
Кодим
Для начала требуется создать кнопку, при нажатии на которую будет вызываться наша програма. Кнопки находятся в панели «Разработчик» и появляются по кнопке «Вставить». Вам нужен компонент формы «Кнопка». Нажали, поставили на любое место в листе. Далее, если не появилось окно назначения макроса, надо нажать правой кнопкой и выбрать пункт «Назначить макрос». Назовём его FormatPrice. Важно, чтобы перед именем макроса ничего не было — иначе он создастся в отдельном модуле, а не в пространстве имен книги. В этому случае вам будет недоступно быстрое обращение к выделенному листу. Нажимаем кнопку «Новый».
И вот мы в среде разработки VB. Также её можно вызвать из контекстного меню командой «Исходный текст»/«View code».
Перед вами окно с заглушкой процедуры. Можете его развернуть. Код должен выглядеть примерно так:
Напишем Hello World:
Sub FormatPrice()
MsgBox «Hello World!»
End Sub
И запустим либо щелкнув по кнопке (предварительно сняв с неё выделение), либо клавишей F5 прямо из редактора.
Тут, пожалуй, следует отвлечься на небольшой ликбез по поводу синтаксиса VB. Кто его знает — может смело пропустить этот раздел до конца. Основное отличие Visual Basic от Pascal/C/Java в том, что команды разделяются не ;, а переносом строки или двоеточием (:), если очень хочется написать несколько команд в одну строку. Чтобы понять основные правила синтаксиса, приведу абстрактный код.
Примеры синтаксиса
Dim res As sTRING ‘ Регистр в VB не важен. Впрочем, редактор Вас поправит
Dim i As Integer
‘ Цикл всегда состоит из нескольких строк
For i = 1 To 10
res = res + CStr(i) ‘ Конвертация чего угодно в String
If i = 5 Then Exit For
Next i
Dim x As Double
x = Val( «1.234» ) ‘ Парсинг чисел
x = x + 10
MsgBox x
On Error GoTo Err ‘ При ошибке перейти к метке Err
x = 5 / 0
MsgBox «OK!»
GoTo ne
ne:
On Error GoTo 0 ‘ Отключаем обработку ошибок
‘ Циклы бывает, какие захотите
Do While True
Exit Do
Loop ‘While True
Do ‘Until False
Exit Do
Loop Until False
‘ А вот при вызове функций, от которых хотим получить значение, скобки нужны.
‘ Val также умеет возвращать Integer
Select Case LengthSqr(Len( «abc» ), Val( «4» ))
Case 24
MsgBox «0»
Case 25
MsgBox «1»
Case 26
MsgBox «2»
End Select
Грабли-1. При копировании кода из IDE (в английском Excel) есь текст конвертируется в 1252 Latin-1. Поэтому, если хотите сохранить русские комментарии — надо сохранить крокозябры как Latin-1, а потом открыть в 1251.
Грабли-2. Т.к. VB позволяет использовать необъявленные переменные, я всегда в начале кода (перед всеми процедурами) ставлю строчку Option Explicit. Эта директива запрещает интерпретатору заводить переменные самостоятельно.
Грабли-3. Глобальные переменные можно объявлять только до первой функции/процедуры. Локальные — в любом месте процедуры/функции.
Еще немного дополнительных функций, которые могут пригодится: InPos, Mid, Trim, LBound, UBound. Также ответы на все вопросы по поводу работы функций/их параметров можно получить в MSDN.
Надеюсь, что этого Вам хватит, чтобы не пугаться кода и самостоятельно написать какое-нибудь домашнее задание по информатике. По ходу поста я буду ненавязчиво знакомить Вас с новыми конструкциями.
Кодим много и под Excel
В этой части мы уже начнём кодить нечто, что умеет работать с нашими листами в Excel. Для начала создадим отдельный лист с именем result (лист с данными назовём data). Теперь, наверное, нужно этот лист очистить от того, что на нём есть. Также мы «выделим» лист с данными, чтобы каждый раз не писать длинное обращение к массиву с листами.
Sub FormatPrice()
Sheets( «result» ).Cells.Clear
Sheets( «data» ).Activate
End Sub
Работа с диапазонами ячеек
Вся работа в Excel VBA производится с диапазонами ячеек. Они создаются функцией Range и возвращают объект типа Range. У него есть всё необходимое для работы с данными и/или оформлением. Кстати сказать, свойство Cells листа — это тоже Range.
Примеры работы с Range
Sheets( «result» ).Activate
Dim r As Range
Set r = Range( «A1» )
r.Value = «123»
Set r = Range( «A3,A5» )
r.Font.Color = vbRed
r.Value = «456»
Set r = Range( «A6:A7» )
r.Value = «=A1+A3»
Теперь давайте поймем алгоритм работы нашего кода. Итак, у каждой строчки листа data, начиная со второй, есть некоторые данные, которые нас не интересуют (ID, название и цена) и есть две вложенные группы, к которым она принадлежит (тип и производитель). Более того, эти строки отсортированы. Пока мы забудем про пропуски перед началом новой группы — так будет проще. Я предлагаю такой алгоритм:
Для упрощения работы рекомендую определить следующие функции-сокращения:
Function GetCol(Col As Integer ) As String
GetCol = Chr(Asc( «A» ) + Col)
End Function
Далее определим глобальную переменную «текущая строчка»: Dim CurRow As Integer. В начале процедуры её следует сделать равной единице. Еще нам потребуется переменная-«текущая строка в data», массив с именами групп текущей предыдущей строк. Потом можно написать цикл «пока первая ячейка в строке непуста».
Глобальные переменные
Option Explicit ‘ про эту строчку я уже рассказывал
Dim CurRow As Integer
Const GroupsCount As Integer = 2
Const DataCount As Integer = 3
FormatPrice
Sub FormatPrice()
Dim I As Integer ‘ строка в data
CurRow = 1
Dim Groups(1 To GroupsCount) As String
Dim PrGroups(1 To GroupsCount) As String
Теперь надо заполнить массив Groups:
На месте многоточия
И создать заголовки:
На месте многоточия в предыдущем куске
For I2 = 1 To GroupsCount
If Groups(I2) <> PrGroups(I2) Then
Dim I3 As Integer
For I3 = I2 To GroupsCount
AddHeader I3, Groups(I3)
Next I3
Exit For
End If
Next I2
Не забудем про процедуру AddHeader:
Перед FormatPrice
Теперь надо перенести всякую информацию в result
Подогнать столбцы по ширине и выбрать лист result для показа результата
После цикла в конце FormatPrice
Sheets( «Result» ).Activate
Columns.AutoFit
Всё. Можно любоваться первой версией.
Некрасиво, но похоже. Давайте разбираться с форматированием. Сначала изменим процедуру AddHeader:
Осталось только сделать границы. Тут уже нам требуется работать со всеми объединёнными ячейками, иначе бордюр будет только у одной:
Поэтому чуть-чуть меняем код с добавлением стиля границ:
Select Case Ty
Case 1 ‘ Тип
.Font.Bold = True
.Font.Size = 16
.Borders(xlTop).Weight = xlThick
Case 2 ‘ Производитель
.Font.Size = 12
.Borders(xlTop).Weight = xlMedium
End Select
.Borders(xlBottom).Weight = xlMedium ‘ По убыванию: xlThick, xlMedium, xlThin, xlHairline
End With
CurRow = CurRow + 1
End Sub
Осталось лишь добится пропусков перед началом новой группы. Это легко:
В начале FormatPrice
Dim I As Integer ‘ строка в data
CurRow = 0 ‘ чтобы не было пропуска в самом начале
Dim Groups(1 To GroupsCount) As String
В цикле расстановки заголовков
If Groups(I2) <> PrGroups(I2) Then
CurRow = CurRow + 1
Dim I3 As Integer
В точности то, что и хотели.
Надеюсь, что эта статья помогла вам немного освоится с программированием для Excel на VBA. Домашнее задание — добавить заголовки «ID, Название, Цена» в результат. Подсказка: CurRow = 0 CurRow = 1.
Файл можно скачать тут (min.us) или тут (Dropbox). Не забудьте разрешить исполнение макросов. Если кто-нибудь подскажет человеческих файлохостинг, залью туда.
Спасибо за внимание.
Буду рад конструктивной критике в комментариях.
UPD: Перезалил пример на Dropbox и min.us.
UPD2: На самом деле, при вызове процедуры с одним параметром скобки можно поставить. Либо использовать конструкцию Call Foo(«bar», 1, 2, 3) — тут скобки нужны постоянно.
Построение динамических таблиц
Создание динамических таблиц
Добрй день. Такая тема. создаю конструктор html таблиц. Использую knockout. ячека.
Создание динамических таблиц
Столкнулась с проблемой при создании таблицы. Мне нужно, чтобы после того как пользователь ввел в.
Построение динамических рисунков
Написать программу, которая выводит на экран изображение движущегося треугольника.
m,n- количество строк и столбцов соответственно.
нужно построить таблицу, форма которой будет зависеть от введенных m и n.
если n=m таблица будет выглядеть как первая на рисунке
если 2*n=m, то как 2 таблица
если (2*n-1)=m, то как 3 таблица.
я немного изменила код, может быть, этот будет верен:
Разберемся с кодом
Ваш код: n = InputBox (“row”)
Мой код: INPUT «row»; n
Ваш код: if n = m
Мой код: IF n = m THEN
Ваш код:
while j = 1
End while
Мой код:
DO WHILE J = 1
LOOP
Ваш код: end_if
Мой код: END IF
Ваш код: A(i,(j+1))
Мой код: A(i, j +1)
Пожалуй все.
Массив A(i, j) надо определять после ввода чисел его размерности
То есть так: DIM A(M, N)
(M и N должны быть определены раньше)
Используйте теги. Перед вами куча английских слов.
В нижней строке найдите слово QBASIC и нажмите на него
У вас появятся теги. Только скобки будут не угловые, а квадратные.
(типа так [QBASIC] дальше не пишу, так как правильные теги невидимы)
Добавлено через 9 минут
В вашем коде отсутствует вывод информации
Для вывода используют операторы
LOCATE I, J (1 0
Примерно так
Запустите свою программу и посмотрите, что получится.
Оператор USING в данном случает выравнивает числа
Но у него есть и другие способности.
Добавлено через 2 минуты
Добавить данные легко
Примените LOCATE и печатайте что хотите.
Спасибо большое за подсказки!
Маленький вопрос, как правильно задать одномерный массив?
Dim A(n) as integer?
geh, n я задала в самом начале программы:
Input «row»; n
я думаю, этого достаточно,верно?
самая главная проблема в том, что всю программу нужно было сделать в VBA и я не знаю что обычно используют для подобных программ формы или модули?
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.
Построение динамических изображений
Помогите сделать растущий круг и круги на воде. Немного не догоняю как это. Помогите плииз. Заранее.
Django: Обработка динамических таблиц
Доброго времени суток, Я делаю сайт с заявками на пропуск людей. То есть на странице есть.
Построение динамических структур данных
Использование структурных ячеек, которые собственноручно создаются пользователем с помощью средств.
Построение динамических графиков в режиме реального времени
Здравствуйте,как можно построить график(тренд) такого разностного уравнения(уравнение прилагается).
Создание таблицы с переменным числом ячеек в Visual Basic
При Web-строительстве очень часто приходится работать с таблицами для различных целей. В данном примере продемонстрируем, как с помощью двух раскрывающихся списков DropDownList можно заказывать необходимое число рядов и столбцов в таблице.
Таблица с переменным числом ячеек, управляемая двумя раскрывающимися списками
Программируя поставленную задачу, запустим систему VB2010 и создадим новый проект шаблона Empty ASP.NET Web Application, назовем его tab.sln. К текущему проекту добавим Web-форму. Для этого в пункте меню Project выберем команду Add New Item и в появившемся окне дважды щелкнем шаблон Web Form.
Далее в конструкторе WebForm1.aspx из панели элементов Toolbox в проектируемую форму перенесем элемент управления Table, два раскрывающихся списка DropDownList, две метки Label и командную кнопку Button. Теперь, используя, например, контекстное меню проекта Web-формы, выбираем команду View Code, попадаем на вкладку файла программной поддержки WebForm1.aspx.vb. В листинге ниже приведен соответствующий программный код.
[vb]‘ Таблица с переменным числом ячеек, управляемая двумя
‘ раскрывающимися списками. Web-страница позволяет с помощью
‘ двух раскрывающихся списков DropDownList заказать необходимое
‘ число рядов и столбцов в таблице, а затем строить заказанную
‘ таблицу.
PublicClass WebForm1
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)Handles Me.Load
Page.Title =»Укажите размерность таблицы»
If Page.IsPostBack = True Then Exit Sub
‘ Заполнять выпадающий список необходимо
‘ при первой загрузки страницы IsPostBack = False,
‘ иначе будут добавляться новые пункты в выпадающем
‘ списке при каждой перегрузке страницы:
DropDownList1.Items.Add(«1»)
DropDownList1.Items.Add(«2»)
DropDownList1.Items.Add(«3»)
DropDownList2.Items.Add(«1»)
DropDownList2.Items.Add(«2»)
DropDownList2.Items.Add(«3»)
Table1.Caption = «Название таблицы»
Table1.CaptionAlign = TableCaptionAlign.Right
Table1.ToolTip =»Укажи количество рядов и столбцов и нажми кнопку»
Table1.BorderStyle = BorderStyle.Solid
Table1.GridLines = GridLines.Both
Label1.Text =»Кол-во строк»
Label2.Text =»Кол-во столбцов»
Button1.Text = «Обновить таблицу»
End Sub
Private Sub Button1_Click(ByVal senderAs Object,ByVal e As System.EventArgs) Handles Button1.Click
Dim i, j AsInteger
For i = 1 ToInt32.Parse(DropDownList1.SelectedItem.Value)
Dim РЯДAsNew TableRow
For j = 1 ToInt32.Parse(DropDownList2.SelectedItem.Value)
Dim ЯЧЕЙКАAsNew TableCell
ЯЧЕЙКА.Text = «Ряд » & i & «, Кол » & j
ЯЧЕЙКА.HorizontalAlign = HorizontalAlign.Center
РЯД.Cells.Add(ЯЧЕЙКА)
Next
Table1.Rows.Add(РЯД)
Next
End Sub
EndClass[/vb]
Как видно из программного кода, при загрузке страницы Page_Load происходит заполнение значениями раскрывающихся списков DropDownList, причем заполнение осуществляется только при первоначальной загрузке страницы, когда IsPostBack = False. Если бы мы не предусмотрели обход присвоения начальных значений при IsPostBack = True, то значения в списке добавлялись бы каждый раз при очередной перезагрузке страницы. Заметим, что мы могли бы и не контролировать IsPostBack, если бы присвоение начальных значений выполнили бы в процедуре обработки события инициализации страницы Page_PreInit (в версии VB.NET это событие называлось Page_Init).
Свойства других элементов управления также инициализированы при обработке события загрузки Web-страницы Page_Load. Мы могли бы это сделать в конструкторе, но, для удобства читателя, приводим их в программном коде. Назначения этих свойств очевидны и не требуют дополнительных комментариев.
При обработке события щелчок на кнопке Обновить таблицу имеем два вложенных цикла. Параметры обоих циклов i и j изменяются от 1 до значения, выбранного пользователем в соответствующем раскрывающемся списке. Метод Int32.Parse пространства имен System конвертирует строку из соответствующего свойства объекта DropDownList В переменную типа Integer. Внешний цикл перебирает ряды таблицы, а внутренний — ячейки таблицы. В теле внешнего цикла очередная итерация создает новый объект РЯД класса TableRow, аналогично в теле внутреннего цикла каждый раз создается новый Объект ЯЧЕЙКА класса TableCell.
Для старта созданного проекта нажмем клавишу. На этом можно закончить статью про создание таблицы в Vusial Basic с задаваемым количество ячеек в столбцах и строках.