将Access中的900个表转换为CSV文件

时间:2014-04-14 01:14:50

标签: sql vba csv access-vba

我有一个使用Access作为配方管理器的现有流程,并希望将其转换为可与WonderWare的内置配方管理器配合使用的CSV。访问文件有900个表,每个表有8个字段。我关心的两个叫做MachineTag和RecipeValue。我想将这些现有表格转换为CSV(我将使用excel术语来解释):A列将包含所有可能的MachineTag。第1行将具有配方的名称(这是现有访问数据库中表的名称)。

Access中的示例表:

Example from Access

CSV文件示例:

CSV sample

希望这能解释我想要实现的目标。我有一个名为MasterTag的访问表,它指定了所有的MachineTag可能性。如果食谱没有该标签,那么如果它在该字段中放置零则没关系。访问中每个表的记录数量范围从800到1200.(MasterTag,包含所有1200个可能标记的引用副本。)到目前为止我使用Debut.Print生成SQL语句,然后我可以复制和粘贴在SQL中访问它会工作。我只是不知道怎么把它们放在一起。

Sub GoMomma()
    Dim db As DAO.Database, 
        tb As DAO.TableDef

    Set db = CurrentDb()

    For Each tb In db.TableDefs
        If Left$(tb.Name, 4) <> "MSys" Then
            strSQL = "SELECT [MasterTag].MachineTag As TagName, [" & tb.Name & "].RecipeValue " & _
                     "FROM " & tb.Name & "INNER JOIN MasterTag ON ([" & tb.Name & "].MachineTag = [MasterTag].MachineTag)"
            Debug.Print strSQL
        End If
    Next tb
End Sub

我已经尝试了各种记录集和FreeFile()打印,保存到txt / csv,但freefile方法的问题是它只会追加到最后,而不是每一行都是一行。我使用记录集方法在4个多小时内取得了零进展。我尝试过创建一个新的tblTemp,只是为了在需要时动态使用,但没有运气。我没有所有的代码示例。我一度感到沮丧,关闭了我的笔记本电脑,失去了一些工作。但实际上它只是垃圾。

修改 我想到了一种防弹方式来做到这一点,但还没有看过它的编码方面,只是在概念上看起来很稳固。我可以创建一个excel电子表格,其中第一行用表名填充,第一列用MachineTags填充。在访问vba中,我将获取当前表名和机器标签名称并搜索电子表格并找出插入RecipeValue所需的单元格(例如:B5),然后它将移动到该表中的下一个MachineTag(如果未找到MachineTag,插入新行,使用新的MachineTag),当该表完成后,移动到下一个(表名,将全部存在,所以我不需要检查和/或插入新的柱)。从上面的截图中找到了解决方法:

Bulletproof idea

一切都完成后,我可以将电子表格保存/转换为CSV格式,我就完成了。周二非常忙碌,所以可能要到周三才开始工作,但这似乎是一条可行的道路,至少在我看来。 For my own records, possible solution / right direction, reminder to take a look at this.

1 个答案:

答案 0 :(得分:0)

你非常接近。也许这会有所帮助:创建临时表,然后遍历所有其他表并将记录插入临时表。然后,您可以将临时表导出为csv文件。以下是一些示例代码,基于您目前所拥有的代码。我遗漏了MasterTag表以保持代码更简单(可能不需要)。

Sub GoMomma()
    Dim db As DAO.Database
    Dim tb As DAO.TableDef
    Dim strSQL As String

    Set db = CurrentDb()

    ' drop the temp table if it exists
    For Each tb In db.TableDefs
        If tb.Name = "recipe_temp" Then
            db.Execute "drop table recipe_temp"
        End If
    Next tb

    db.Execute "create table recipe_temp (RecipeName Text, MachineTag Text, RecipeValue Number)"

    For Each tb In db.TableDefs
        If Left$(tb.Name, 4) <> "MSys" And tb.Name <> "recipe_temp" Then
            strSQL = "INSERT INTO recipe_temp (RecipeName, MachineTag, RecipeValue) " & _
                     "SELECT """ & tb.Name & """ as RecipeName, MachineTag, RecipeValue " & _
                     "FROM " & tb.Name
            db.Execute strSQL
        End If
    Next tb

End Sub