Ответ 1
Я написал несколько приложений, похожих на те, которые вы описали, и пока я не могу притворяться, что предлагаю передовую практику, я могу комментировать, основываясь на моем личном опыте.
• Могу ли я дать имена моим столбцам и использовать их в качестве столбца базы данных при отправке данных обратно в SQLServer
Конечно, почему бы и нет, вы можете добавить имена столбцов в качестве первой строки листа excel и использовать функции защиты ячеек, чтобы предотвратить вмешательство конечного пользователя. Вам нужно связать столбцы данных в excel с базовыми полями SQL Server, и это так же хорошо, как и любой другой.
• Если я хочу использовать нормализованные данные, например, для LookupTable (ID, Country), я должен хранить идентификатор, информацию о стране в диапазоне, и если да, то каким образом я могу заставить пользователя выбрать значение из этого диапазона (ID, Страна) без использования соответствующего Combobox?
Вы можете создавать отдельные (скрытые) листы для каждой таблицы поиска и принудительно выбирать выбор с помощью кода примерно так (на основе макросъемки, чтобы это можно было очистить)
With Sheet1.Range("E3").Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="=B2:B5"
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = "A sample"
.ErrorTitle = "An error"
.InputMessage = "Input message"
.ErrorMessage = "Error message"
.ShowInput = True
.ShowError = True
End With
Это даст вам поле со списком в ячейке, сообщение об ошибке при неудачной проверке и заголовок для ячейки.
• Когда я возвращаю данные, ожидаемые от приложения электронной таблицы, которые я, например, извлекаю из идентификатора, Описание (скрывая идентификатор в столбце и отображая описание), или я должен просто использовать описание для всего и хранить денормализованные данные в мои таблицы SQLServer, что делает их эквивалентом листа Excel на стороне сервера?
Это будет работать в любом случае. Идентификатор, вероятно, решает, основываясь на сложности данных. Если вам нужно собрать много кода проверки в VBA Id, у вас возникнет соблазн вытащить денормализованные данные в промежуточные таблицы в SQL Server и затем денормализовать использование хранимых процедур перед перемещением данных в ваши основные таблицы. YMMV.
• Когда я извлекаю данные из SQLServer, я должен моделировать его в ADODB.Recordset(например, вызывая представление или хранимую процедуру) и копировать его на Лист, следя за тем, чтобы порядок полей в наборе записей был одинаковым как в Листе, или есть лучший способ?
Я бы не использовал копирование и вставку, так как он использует системный буфер обмена, и странные вещи могут начаться, если вы используете ПК в одно время. Объект range в excel имеет метод CopyFromRecordset, который можно использовать для перемещения данных из ADO на рабочий лист. Это намного быстрее, чем повторение через набор записей, назначаемый вручную. Единственным недостатком является то, что вам придется заранее создавать заголовки заголовков.