2015-04-28 3 views
0

Я довольно владею VBA, но я почти ничего не знаю о Access! Я выполняю сложную симуляцию с помощью Arrrays в VBA, и я хочу где-то сохранить результаты. Поскольку результаты моделирования будут довольно большими (~ 1 ГБ в памяти), я хотел бы сохранить это в Access, а не в Excel.Добавление массива VBA в новый доступ DB

В настоящее время у меня есть большое количество массивов, заполненных моими данными, но я не уверен, как их записать в базу данных или даже как создать ее с помощью VBA. Вот что мне нужно сделать, в двух словах, с помощью VBA:

  • Создать новую базу данных Access
  • Создать новую таблицу Access (БД будет только один стол)
  • Создание ~ 1200 полей программно
  • Скопируйте результаты из моих массивов в новую таблицу Access.

Здесь я рассмотрел ряд ответов, но ни один из них, похоже, полностью не ответил на мой вопрос. Например, Adding field to MS Access Table using VBA рассказывает о добавлении полей в базу данных. Но я не вижу здесь двойников. Большинство моих массивов - это парные. Будет ли это проблемой?

EDIT:

Вот еще несколько деталей о проекте:

Я бегу дизайн моделирования сети. Таким образом, я начинаю с создания ~ 150 000 уникальных сетей. Затем я запускаю множество вычислений (нет, они не могут быть упрощены к запросам, к сожалению!) Характеристик для сети. В итоге получается ~ 1200 для каждой возможной сети (уникальная запись). Таким образом, я хотел бы сохранить их в базе данных Access. Каждая запись будет уникальной сетью, и каждое поле будет специфическим признаком, связанным с этой сетью.

Практически все поля (массивы в этом пункте!) Являются двойными.

+0

Почему вы хотите создать базу данных через VBA? Кажется, мне было бы проще создать правильно созданную структуру данных в Access, а затем просто вывести результаты в существующий набор таблиц. – FreeMan

+0

Простите меня за глупость, как я могу это сделать? Мне нужно будет генерировать все имена полей программно, поэтому я предположил, что VBA будет лучшим способом сделать это. Кроме того, все мои массивы уже вычислены с использованием VBA. –

+0

См. [Ссылка ADO MSDN] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms677497%28v=vs.85%29.aspx). Здесь также приведены некоторые примеры создания таблиц, например [Создать таблицу SQL из Excel VBA] (http://stackoverflow.com/questions/927349/create-a-sql-table-from-excel-vba). – Comintern

ответ

1

Вы (почти?) Никогда не хотите иметь базу данных с одной таблицей. Вы также можете сохранить его в текстовом файле. Одним из основных преимуществ баз данных является связывание данных в разных таблицах, и одна таблица вам не нужна.

К счастью для вас, вам нужно больше, чем одна таблица, и база данных может быть путем. Вам (почти) никогда не нужно создавать постоянные таблицы в коде (временные таблицы, конечно, но не постоянные). Если ваши имена полей являются переменными, вам нужно изменить свой дизайн. Когда данные являются переменными, они поступают в базу данных базы данных. Когда это исправлено, это может быть таблица или поле. Исходя из того, что вы сказали, я думаю, что вам это нужно:

В Access создать внесенное называемое tblNetworks с этими полями

NetworkID AutoNumber 
NetworkName Short Text 

Затем создайте еще внесенные называемые tblCalculations с этими полями

CalcID  Autonumber 
NetworkID Long   (Relates to tblNetworks, one to many) 
CalcDesc  Short Text 
Result  Number (Double) 

То, что вы собираетесь назвать своими полями в таблице Access, будет представлять собой данные CalcDesc. Вы будете использовать ADODB для выполнения INSERT INTO операторов sql, которые помещают данные в таблицы.

Вы закончите с tblNetworks с 150 тыс. Записей и tblCalculations с 1,200 х 150 тыс. Записей или около того. Когда вы делаете столы длиннее и не шире по мере изменения, это хороший показатель, который вы правильно его разработали.

Если вы действительно не знакомы с Access, я рекомендую научиться создавать таблицы, настраивать отношения и ссылочную целостность. Если вы не знаете SQL, выполните поиск INSERT INTO. И если вы еще не использовали ADO в Excel, найдите ADODB Connections и метод Execute.

Update

Вы можете определенно уйти с CSV для этого. Как вы сказали, это довольно низко. Является ли текстовый файл или база данных правильным ответом, вероятно, больше зависит от того, как вы собираетесь использовать данные и как часто.

Если вы собираетесь потянуть это в Excel несколько раз, сделайте несколько видов или фильтров, возможно, сводную таблицу, то любая производительность, которую вы получите от CSV, не будет такой уж плохой. И если вам нужно иметь дело только с подмножеством данных за раз, вы можете использовать ADO для чтения текстового файла и только втягивать нужные вам данные в то время, что еще больше уменьшает медленность сортировки и фильтрации строк 150k. Не говоря уже о том, что у вас есть несколько гигабайт оперативной памяти, 150k x 1200, вероятно, не будет плохой.

Если вы обнаружите, что производительность CSV воняет, потому что ваше оборудование не соответствует задаче, вам приходится часто обращаться к ней, или вы делаете тонну разных запросов к данным, это может быть в вашу пользу для использования базы данных. Если поля структурированы так, как вы говорите, вы можете использовать еще больше таблиц. У вас все еще есть таблица сети и таблица calc, но у вас также есть таблицы Market, Slot и Characteristic. Тогда ваша таблица Calc будет выглядеть следующим образом:

CalcID 
CalcDesc 
NetworkID 
MarketID 
SlotID 
CharacteristicID 
Result 

Если вы ищете данные много раз, и вам это нужно быстро, вы не собираетесь делать лучше, чем куча внутренних соединений этих таблиц и WHERE что ограничивает то, что вы хотите.

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

+0

Yup, это то, куда я направлялся, просто не знал достаточно о структурах данных, чтобы дать руководство. – FreeMan

+0

Спасибо за ввод. Я думаю, что лучший способ пойти может использовать CSV. Таким образом, я избегу любых служебных данных, связанных с форматированием в листе Excel. Мне нужно будет обсудить это дальше, но я все еще не уверен, что для этой информации подходят отдельные таблицы. Имена полей сами по себе являются переменными. Они просто ... с рисунком, если это имеет смысл. Например, в модели имеются слоты для до 10 возможных центров распределения. Каждый распределительный центр будет иметь 15 возможных характеристик, которые должны быть рассчитаны в 13 различных сегментах рынка. (продолжение) –

+0

Из небольшого числа, которое я понимаю о запросах, я не могу просто написать запрос для Slot 1_Market1_Characteristic 1. В моделировании сложнейшей логики. Однако, когда модель закончила вычисление, у меня будет значение (возможно (null)) для каждого из этих «полей». Таким образом, он программный, но не очень переменный, поскольку они никогда не будут расти. Могут быть добавлены дополнительные сетевые конфигурации (запись), но не более характеристик. Таким образом, я получаю около 1200 уникальных вычислений для каждой записи. Пожалуйста, дайте мне знать, если это имеет смысл, и если это изменит вашу рекомендацию. –

Смежные вопросы