保存/加载用户首选项配置文件

时间:2012-06-27 12:04:12

标签: excel vba excel-vba synchronization save

我想在我写的一个小程序中添加SAVE / OPEN功能。要使用该程序,用户必须填写数据并调整多个工作表的设置。我想将其保存到配置文件中,以便以后能够加载它。

我应该如何构建此SAVE / OPEN功能?

我的想法是通过简单的“链接”(例如Entries)将输入的数据和配置分组到一张工作表上(我们将其命名为=Sheet1!A1)。此表格将被导出。

我以这种方式将条目保存到新的.xls工作簿中:

ActiveWorkbook.Sheets("Entries").Columns("A:B").copy
Workbooks.Add
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False 'Paste only values

但是加载数据时会遇到挑战......

网上有几个示例(请参阅herethere),说明如何操作,但始终存在同样的问题。也就是说:如果我只是将保存的工作簿中的数据(仅限值)复制到Entries工作表,那么我的所有“链接”都将被删除。有没有办法同步数据?

或者是唯一一种手动输入VBA中的所有单元格值并执行数百个范围副本的解决方案,从导出的工作簿直接到用户使用的单元格?

2 个答案:

答案 0 :(得分:2)

以下是解决方案。非常感谢您的帮助!

保存条目......

Set CurSheet = ActiveWorkbook.Sheets("Entries")
    maxEntries = 150
    CurSheet.copy 'a new workbook is created

    Set wbDest = ActiveWorkbook
    wbDest.Sheets(1).Range("A1:B" & maxEntries).Value = CurSheet.Range("A1:B" & maxEntries).Value
    wbDest.Sheets(1).Range("C1:C" & maxEntries).Value = CurSheet.Range("B1:B" & maxEntries).Formula

    For i = 1 To maxEntries

        'Removes the leading "=" from the formula
        tempCell = ActiveWorkbook.Sheets(1).Range("C" & i).Formula
        If Len(tempCell) > 1 Then
            wbDest.Sheets(1).Range("C" & i).Value = Right(tempCell, Len(tempCell) - 1)
        End If

        'For empty cells
        If wbDest.Sheets(1).Range("B" & i).Value = 0 Then
            wbDest.Sheets(1).Range("B" & i).Value = ""
        End If

    Next i

......加载它们。

fullFileName = Application.GetOpenFilename("Excel files (*.xls),*.xls", _
        1, "Projekt öffnen", , False)

    Workbooks.Open fullFileName
    Set wbSaved = ActiveWorkbook      

    'Data copy
    maxEntries = 150

    For i = 4 To maxEntries

        If Not wbSaved.Sheets(1).Range("C" & i) = "" Then 'Skip the empty lines

            'Parsing
            c = wbSaved.Sheets(1).Range("C" & i).Value
            l = Len(c)
            p = InStr(1, c, "!", vbTextCompare) 'position of the !, that separates the sheet name from the cell number
            cDestSheet = Mid(c, 1, p - 1)
            cDestCell = Mid(c, p + 1, -(p - l))

            'Copy
            wbMain.Sheets(cDestSheet).Range(cDestCell).Value = wbSaved.Sheets(1).Range("B" & i).Value
        End If
    Next i

    wbSaved.Close False

答案 1 :(得分:1)

我有一个想法可能不是一个完整的答案,但如果这听起来不错,我会详细说明一些......用你的例子:

ActiveWorkbook.Sheets("Entries").Columns("A:B").copy
Workbooks.Add
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False 'Paste only values

我会改为这个(不完整和未经测试的代码,但你应该明白这一点):

Dim CurSheet As WorkSheet

Set CurSheet = ActiveWorkbook.Sheets("Entries")

With Workbooks.Add
    Sheets(1).Range("A:B").value = CurSheet.Range("A:B").value
    Sheets(2).Range("A:B").value = "'" & CurSheet.Range("A:B").formula
End With

我在这里做的是获取您已有的值并将它们插入到新工作簿的第一张表中(请参阅With块中的第一行),然后还获取公式的文本值并将其放入第二张纸,相同位置(见第二行)。通过这种方式,您可以保留值并查看它们的来源。但是,这并不像你要求的那样真正同步,因为你仍然需要操纵新书第2页中的数据,以便对这些链接做任何有意义的事情。

这有助于/帮助您开始正确的方向吗?