1. 程式人生 > >VBA中使用ADO來處理Excel資料之現狀

VBA中使用ADO來處理Excel資料之現狀

列標題:預設為 Excel 資料來源的第一行包含可用作欄位名的列標題。如果不是這種情況,則必須將該設定關閉,否則,第一行資料將會消失,而被用作欄位名稱。這可通過向連線字串新增可選的FirstRowHasNames= 設定來完成。預設情況下 FirstRowHasNames=11即為 True。如果沒有列標題,則需要指定 FirstRowHasNames=0,其中 0 即為 False;驅動程式將欄位命名為 F1F2 …等。由於 ODBC 驅動程式中存在錯誤,目前指定 FirstRowHasNames 設定不起作用。換句話說,ODBC始終把指定資料來源中的第一行作為欄位名。要掃描的行數:Excel
不可能象關係資料庫那樣為 ADO 提供有關其資料的詳細架構資訊。驅動程式是通過掃描幾行現有資料猜測各列的資料型別。預設為8,可以設定為1-16的整數值,或指定0,掃描所有現有行。
Excel ODBC
驅動程式(MDAC 2.1 和更高版本)始終掃描指定資料來源中的前 8 行,以確定各列的資料型別。使用這兩種提供程式時的一些問題
1.
混用資料型別
①.ADO
是以猜測 Excel 工作表或範圍中各列的資料型別確定欄位資料型別(這不受 Excel 單元格格式設定的影響)。如果同一列中既有數字值,也有文字值,JetODBC 將返回佔多數的型別的資料,對於佔少數的資料型別,則會返回NULL(空)值。如果該列中兩種型別資料的數量相等,提供程式將優先選擇數字型資料,放棄文字型資料。如果列中包含不同型別的值,可以將數字值儲存為文字,在需要時再使用 VAL()
等函式還原為數字。也可以在連線字串的擴充套件屬性中使用“IMEX=1”來啟用匯入模式。在 Excel 工作簿受密碼保護時,即使在連線設定中提供了正確的密碼,也無法訪問excel,並出現錯誤提示:Could not decrypt file.

2.
資料來源的指定
①.
三種方式
整張工作表。
工作表上的命名單元格區域。
工作表上的未命名單元格區域。 若要指定一張工作表作為記錄源,使用該工作表的名稱帶美元字元,並套方括號,也是用於表示未知資料庫物件名的標準約定,例如:
strQuery = "SELECT * FROM [Sheet1$]"

也可以使用鍵盤上波形符 (~) 下的斜單引號字元 (`)
strQuery = "SELECT * FROM `Sheet1$`"
指定工作表時應注意的是:提供程式認為資料表從指定工作表上最左上方的非空單元格開始。
②.
若要指定命名的單元格區域作為記錄源,只需定義名稱。例如: strQuery = "SELECT * FROM MyRange"

指定工作表作為記錄源時,提供程式將新記錄新增到工作表中現有記錄的下面。指定區域(命名或未命名區域)時,Jet 也將新記錄新增到區域中現有記錄的下面。但是,如果對原區域重新執行查詢,則得到的記錄集不包含新新增到該區域外的記錄。

③.
指定未命名區域指定未命名的單元格區域作為記錄源時,在工作表名的後面加上用標準 Excel/列表示法表示的區域,並用方括號將其括起。例如:
strQuery = "SELECT * FROM [Sheet1$A1:B10]"


3.
使用ADO 方法編輯 Excel 資料。對應於 Excel 工作表中包含 Excel 公式(以“=”開始)的單元格的記錄集欄位是隻讀的,不能對其進行編輯。ExcelODBC 連線預設是隻讀的,但可在連線設定中另行指定。有時,使用 ADO Recordset 物件的 AddNewUpdate 方法向Excel 表插入新資料行時,ADO 可能會將資料值插入錯誤的列。 刪除 Excel 資料時,不能1次刪除1整條記錄,只能通過分別清空各個欄位的內容來刪除一條記錄。 刪除包含Excel 公式的單元格中的值時會出現錯誤資訊: Operation is not allowed in this context. 電子表格中行刪除完資料後,記錄集空記錄仍保留。使用 ADOExcel 中插入文字資料時,文字值前面會出現單引號,這在後續處理資料時可能會出現問題。
4.
Excel 檢索資料來源結構(元資料)使用 ADO 可以檢索 Excel 資料來源的結構,使用時JETodbc兩種OLE 都返回很少的有用資訊。使用 ADOOpenSchema 方法可檢索此元資料,也可以使用更強大的ADOX來檢索元資料。但由於 Excel 資料來源,既可以是工作表也可以是命名區域,而欄位則是幾種有限的一般資料型別之一,所以這一附加的功能沒有什麼用處。查詢表資訊關係資料庫提供較多種物件(表、檢視、儲存過程等),Excel 資料來源僅提供相當於表的物件,它由工作表和定義的命名區域組成。命名區域被視為,而工作表被視為系統表。除“table_type”屬性外,檢索不到太多有用的表資訊。下列程式碼常用來檢索工作簿中可用表的列表:
Set rs = cn.OpenSchema(adSchemaTables)

Jet
返回的記錄集包含9個欄位,但其中只有4個欄位有資料:
• table_name
• table_type
系統表
• date_created
• date_modified

ODBC
返回的記錄集也包含9個欄位,但其中只有3個欄位有資料:
• table_catalog (
該工作簿所在的資料夾)
• table_name
• table_type

5.
查詢欄位資訊
Excel
資料來源中欄位資料型別有:
數字(ADO 資料型別 5adDouble
貨幣(ADO 資料型別 6adCurrency
邏輯或布林值(ADO 資料型別 11adBoolean
日期(使用 Jet 時,為 ADO 資料型別 7adDate;使用ODBC 時為資料型別 135adDBTimestamp
文字(一種 ADO ad...Char 型別,例如,202adVarChar200adVarWChar,或相似型別)
①.
對於數字列,返回的 numeric_precision 始終為 15(是 Excel 中的最大精度)
②.
對於文字列,返回的 character_maximum_length 始終為 255(是 Excel 列中文字的最大顯示寬度,但不是最大長度)。除了 data_type 屬性之外,得不到多少有用的欄位資訊。

③.Jet
返回的記錄集包含 28 個欄位。對於數字欄位,其中8個有資料;對於文字欄位,其中9個有資料。有用的欄位很可能是:
• table_name
• column_name
• ordinal_position
• data_type
④.ODBC
提供程式返回的記錄集包含 29 個欄位。對於數字欄位,其中10個有資料;對於文字欄位,其中11 個有資料。有用的欄位與上述相同。