Вы объявили numberOfFilesChosen
как Variant
:
Dim numberOfFilesChosen, i As Integer ' Wrong
blockquote>Dim numberOfFilesChosen as Integer, i As Integer ' OK
Вы объявили
mainWorkbook
какVariant
:Dim mainWorkbook, sourceWorkbook As Workbook ' Wrong
blockquote>Dim mainWorkbook as Workbook, sourceWorkbook As Workbook ' OK
Такой код должен быть в рабочей книге (
mainWorkbook
), куда импортируются рабочие таблицы, поэтому вам не нужна переменная, просто используйтеThisWorkbook
. Затем в сочетании с операторомWith
вы можете использовать, например,.Sheets(.Sheets.Count)
.Вы переключаетесь между листами и листами. Когда вы используете
mainWorkbook.Worksheets.Count
, это не обязательно будет последний лист, поэтому было бы правильнее использоватьmainWorkbook.Sheets.Count
, особенно для того, чтобы добавленный счетчик листов работал правильно.tempWorkSheet.Copy after:=mainWorkbook.Sheets(mainWorkbook.Worksheets.Count)
blockquote>tempWorkSheet.Copy after:=mainWorkbook.Sheets(mainWorkbook.Sheets.Count) ' Preferable
Когда вы используете
sourceWorkbook.Close
, вас могут попросить сохранить книгу. Использованиеblockquote>sourceWorkbook.Close False ' Preferable
закроет книгу без сохранения изменений.
Код не будет выполнен, если вы запустите его в другой раз, потому что имена листов, которые он попытается создать, совпадают. Поэтому я добавил
blockquote>DeleteWorksheetsExceptOne
, который использовал при тестировании кода.Код
Sub mergeFiles() 'Merges all files in a folder to a main file. 'Define variables: Dim tempFileDialog As FileDialog Dim sourceWorkbook As Workbook Dim tempWorkSheet As Worksheet Dim numberOfFilesChosen As Long, i As Long, j As Long Set tempFileDialog = Application.FileDialog(msoFileDialogFilePicker) 'Allow the user to select multiple workbooks tempFileDialog.AllowMultiSelect = True numberOfFilesChosen = tempFileDialog.Show With ThisWorkbook 'Loop through all selected workbooks For i = 1 To tempFileDialog.SelectedItems.Count 'Open each workbook Workbooks.Open tempFileDialog.SelectedItems(i) Set sourceWorkbook = ActiveWorkbook j = 0 'Copy each worksheet to the end of the main workbook For Each tempWorkSheet In sourceWorkbook.Worksheets j = j + 1 tempWorkSheet.Copy After:=.Sheets(.Sheets.Count) ' Rename newly added worksheet to the name of Source Workbook ' concatenated with "-" and Counter (j). .Sheets(.Sheets.Count).Name = sourceWorkbook.Name & "-" & j Next 'Close the source workbook. False for not saving changes. sourceWorkbook.Close False Next End With End Sub
Удалить все рабочие таблицы, кроме одной
'******************************************************************************* ' Purpose: Deletes all Worksheets in the ActiveWorkbook except one. ' Danger: This code doesn't ask anything, it just does. In the end you will ' end up with just one worksheet (cStrWsExcept) in the workbook ' (cStrWbPath). If you have executed this code and the result is not ' satisfactory, just close the workbook and try again or don't. There ' will be no alert like "Do you want to save ..." because of the line: ' ".Saved = True" i.e. "objWb.Saved = True". ' Arguments (As Constants): ' cStrWbPath ' The path of the workbook to be processed. If "", then ActiveWorkbook is ' used. ' cStrWsExcept ' The worksheet not to be deleted. If "", then the Activesheet is used. '******************************************************************************* Sub DeleteWorksheetsExceptOne() Const cStrWbPath = "" ' if "" then ActiveWorkbook Const cStrWsExcept = "Sheet1" ' if "" then ActiveSheet Dim objWb As Workbook Dim objWsExcept As Worksheet Dim objWsDelete As Worksheet If cStrWbPath = "" Then Set objWb = ActiveWorkbook Else Set objWb = Workbooks(cStrWbPath) End If With objWb If cStrWsExcept = "" Then Set objWsExcept = .ActiveSheet Else Set objWsExcept = .Worksheets(cStrWsExcept) End If ' To suppress the "Data may exist in the sheet(s) selected for deletion. ' To permanently delete the data, press Delete." - Alert: Application.DisplayAlerts = False For Each objWsDelete In .Worksheets If objWsDelete.Name <> objWsExcept.Name Then objWsDelete.Delete End If Next ' To suppress the "Do you want to save changes you made to ... ?" - Alert: .Saved = True Application.DisplayAlerts = True End With End Sub '*******************************************************************************
Как вы читали Core Data vs SQLite 3 , вы знаете, что Core Data и механизм сохранения (в данном случае SQLite) в значительной степени ортогональны. Core Data на самом деле касается управления графом объектов, и его основной вариант использования - компонент модели архитектуры MVC. Если ваше приложение хорошо вписывается в эту архитектуру, вероятно, стоит использовать Core Data, поскольку это сэкономит вам много кода в компоненте модели. Если у вас уже есть работающий компонент модели (например, из существующего настольного приложения), Core Data не будет вам много покупать. Возможен гибридный подход - вы можете выполнить свое собственное сохранение / запрос и создать Core Data в хранилище памяти, которое вы заполняете результатом запроса, и использовать это хранилище в памяти через Core Data в качестве компонента модели для вашего приложения. Это н' Это обычное дело, но я сделал это, и здесь нет серьезных препятствий.
Чтобы ответить на ваши конкретные вопросы:
Вы можете назначить номер версии всему постоянному хранилищу и получить эту информацию через + [NSPersistentStore metadataForPersistentStoreWithURL: error:]
, даже не открывая магазин. Эквивалент + setMetadata: forPersistentStoreWithURL: error
, конечно, также существует. Если вы хотите сохранить информацию о версии в экземпляре сущности, а не в метаданных постоянного хранилища, вы можете загрузить только один объект. Благодаря постоянному хранилищу SQLite Core Data отлично справляется с получением только того, что вам нужно.
API NSPredicate
очень прост в освоении и, похоже, неплохо справляется с компиляцией в SQL. , По крайней мере, для баз данных такого размера, который может поместиться на iPhone, s, безусловно, был адекватным (с точки зрения производительности), по моему опыту. Однако я думаю, что вопрос SQL и Core Data немного ошибочен. Что вы собираетесь с ним делать, получив результат запроса? Если вы откроете свой собственный, вам придется создавать экземпляры объектов, обрабатывать сбой / уникальность (если вы не хотите сразу загружать весь результат запроса в память) и все другие средства управления графом объектов, уже предоставленные Core Данные.
Похоже, у вас уже есть проект, разработанный с использованием SQLite, и у вас есть опыт в этой области.
Итак, суть в том, имеет ли смысл переносить этот проект, будет ли Core Данные дают мне то, чего у меня еще не было в моем первоначальном дизайне?
Если исходный дизайн был выполнен правильно, исходя из требований ЭТОГО ПРОЕКТА, это, вероятно, того не стоит.
Но это еще не конец. обсуждения. Есть и другие вещи, о которых стоит подумать: будут ли в моем следующем проекте такие легкие требования к базе данных? Мне нужно отправить товар в ближайшее время из-за ограничений по срокам или бюджету? Предполагая, что я Мне рано или поздно придется изучать Core Data, разве нет смысла делать это сейчас? Возможно, я заинтересован в переносе моего кода на Mac?
Ответы на эти вопросы могут привести вас к решению, что да, действительно стоит вернуться, так сказать, к чертежной доске и узнать, что такое ядро Все о данных.
Чтобы перейти к вашему заключительному вопросу: каковы преимущества? Что ж, Core Data - это абстракция более высокого уровня вашей базы данных, она также не зависит от хранилища данных (поэтому, если будущая версия iPhone откажется от SQLite для встроенной версии MySQL ... маловероятно, но это пример), тогда Core Данные потребуют ОЧЕНЬ немного изменений в коде, чтобы заставить его работать с новым хранилищем данных. Core Data обеспечит быструю переносимость на платформу Mac. Core Data будет управлять версиями вашей модели данных, тогда как если у вас нет фреймворка или рабочего процесса для управления им, прямого доступа к SQLite не будет.
Я уверен, что другие респонденты могут придумать другие преимущества и, возможно, некоторые веские причины, почему НЕ возиться с Core Data. Между прочим, в подобной ситуации я решил портировать на более высокий уровень, более новый фреймворк. Но в моем случае это был побочный проект, и дата отгрузки и бюджет не имели значения.
Чтобы не отвлекать внимание от этого форума, но вы можете найти больше респондентов с контекстно-релевантным опытом на Apple iPhone DevForum.
Если говорить с точки зрения чисто управления проектами, это звучит так, будто вы знаете, как для создания того, что вы хотите построить с использованием SQLite, и поэтому для меня было бы более разумным начать по этому пути.
При этом CoreData строится поверх SQLite, и если вы пытаетесь использовать другие части система в сочетании с вашими данными, например, с использованием KVC / KVO или привязок, то вы можете быстро обнаружить, что эта функция стоит кривой обучения.
= Майк