保存/加载用户首选项配置文件
Posted
技术标签:
【中文标题】保存/加载用户首选项配置文件【英文标题】:Save/load user preference configuration file 【发布时间】:2012-06-27 12:04:12 【问题描述】:我想将保存/打开功能添加到我编写的一个小 Excel 程序中。要使用该程序,用户必须在几张纸上填写数据并调整设置。我想把它保存到一个配置文件中,以便以后能够加载它。
我应该如何构建这个 SAVE/OPEN 功能?
我的想法是通过简单的“链接”(例如=Sheet1!A1
)将输入的数据和配置组合在一张纸上(我们将其命名为Entries
)。此工作表将被导出。
我以这种方式将条目保存到新的 .xls 工作簿中:
ActiveWorkbook.Sheets("Entries").Columns("A:B").copy
Workbooks.Add
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False 'Paste only values
但是在加载数据时遇到了挑战......
网上有几个例子(参见here 和there)说明了如何做,但总是遇到同样的问题。也就是说:如果我只是将数据从保存的工作簿(仅限值)复制到Entries
工作表,我所有的“链接”都将被删除。有没有办法同步数据?
或者是在 VBA 中手动输入所有单元格值并复制数百个范围的唯一解决方案,从导出的工作簿直接复制到用户使用的单元格?
【问题讨论】:
如果要复制公式,Excel 允许这样做:ActiveSheet.YourRange.Formula = SourceWorkbook.SourceSheet.SourceRange.Formula
当我将条目表(所有用户条目都分组)导出到新文件时,我只想保存值,因为这将是一个独立的文件。但是当我打开我导出的文件时,我的目的是替换分布在各个工作表中的输入字段中的值。替换值的一种解决方案是将所有目标范围输入 VBA。如果可行的话,我更希望的另一个解决方案是以某种方式在导出的文件和条目表之间同步数据。
我想我还没有完全理解你的问题,如果我把你引向错误的方向,很抱歉。您的意思是有一个公式指向您的Entry
工作簿的工作簿吗?通过这种方式,可以在用户选择打开文件时更新值,但您也可以强制手动计算,这意味着用户可以选择使用<F9>
进行同步。
嗨,Gaffi,感谢您的回复。我的意思是:一旦我在新工作簿中导出了用户设置(仅限值),并且一旦程序重新启动并从用户条目中清空,我如何将导出的设置复制回程序?如果我只是将所有内容复制到条目表,链接将会丢失。 (我也更新了我的问题,试图澄清一下。看看它是否有帮助)
【参考方案1】:
这是找到的解决方案。非常感谢您的帮助!
正在保存条目...
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
【讨论】:
【参考方案2】:我的想法可能还不是一个完整的答案,但如果这听起来不错,我会详细说明一些......使用你的例子:
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 页中的数据才能对这些链接做任何有意义的事情。
这是否有助于/让您朝着正确的方向开始?
【讨论】:
嗨,Gaffi,感谢您的回答。它可以提供帮助。假设我还保存公式,因此保存位置。我可以写MainWorkbook.Range(SavedLocationInFormula)=ExportedWorkbook.Range(...)
之类的东西吗?也许我应该在没有'
的情况下保存公式,或者更好的是,没有=
。我怎样才能修剪公式?
要删除等号,我尝试应用this。我正在复制“C”列上的所有公式并尝试执行以下操作:For i = 1 To max / tempCell = Sheets(1).Range("C" & i).Value 'this does not work / Workbooks.Add.Sheets(1).Range("C1:C" & i).Value = Right(tempCell, Len(tempCell) - 1)
但是在将范围转换为字符串时我被卡住了。 (使用 tempCell)有什么想法吗?
我目前无法测试,所以我可能需要回复您,但您尝试过Right(tempCell, Len(tempCell) - 2
(将 2 换成 1)吗?另外,如果tempCell
的分配不起作用,你可以在你说不起作用的步骤之后MsgBox
或Debug.Print
吗?我想看看分配的内容与单元格中的内容。
C 列中是复制的公式。我面临以下问题: 1. Sheets(1).Range("C1:C" & max).Value = "'" & CurSheet.Range("B1:B" & max).Formula
不起作用,因为"'"
。错误:错误的数据类型。 Range.Formula
不输出字符串。因此,Msgbox (Sheets(1).Range("C" & i).Value)
不起作用。 // 2.上面没有"'"
的公式只给我#REF
错误,因为公式中提到了源工作表的名称。还不错,因为公式仍然可读,但不是很好,因为有几个弹出窗口询问所有工作表的位置。
现在可以使用了。当Sheets.Range.Value
返回一个变量或一个对象(我猜)时,Sheets.Range.Formula
返回一个字符串。然后我做了tempCell = ActiveWorkbook.Sheets(1).Range("C" & i).Formula / ActiveWorkbook.Sheets(1).Range("C" & i).Value = Right(tempCell, Len(tempCell) - 1)
。太好了!以上是关于保存/加载用户首选项配置文件的主要内容,如果未能解决你的问题,请参考以下文章