我想在我写的一个小程序中添加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
但是加载数据时会遇到挑战......
网上有几个示例(请参阅here和there),说明如何操作,但始终存在同样的问题。也就是说:如果我只是将保存的工作簿中的数据(仅限值)复制到Entries
工作表,那么我的所有“链接”都将被删除。有没有办法同步数据?
或者是唯一一种手动输入VBA中的所有单元格值并执行数百个范围副本的解决方案,从导出的工作簿直接到用户使用的单元格?
答案 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页中的数据,以便对这些链接做任何有意义的事情。
这有助于/帮助您开始正确的方向吗?