2012-06-27 40 views
0

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

我应该如何构建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中的所有单元格值并执行数百个范围副本(从导出的工作簿直接转到用户使用的单元格)的唯一解决方案?

+0

如果你要复制的公式,Excel允许这样的:'ActiveSheet.YourRange.Formula = SourceWorkbook.SourceSheet.SourceRange.Formula' – Gaffi

+0

当我导出入口表(所有用户条目进行分组)到一个新文件,我只想保存这些值,因为这是一个独立的文件。 但是,当我打开我已经导出的文件时,我的目的是替换分布在各种工作表中的输入字段中的值。 替换值的一种解决方案是将所有目标范围输入到VBA中。另一种解决方案,我希望如果可以实现,将以某种方式同步导出的文件和输入表单之间的数据。 – Nicolas

+0

我想我并没有完全理解你的问题,所以很抱歉,如果我把你引向错误的方向。你的意思是有一个工作簿的公式指向你的'Entry'工作簿?通过这种方式,可以在用户选择打开文件时更新这些值,但是您也可以强制计算为手动,这意味着如果用户选择,用户可以使用“”进行同步。 – Gaffi

回答

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

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

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块中的第一行),然后也取公式的文本值并将其放入seco第二行,相同的位置(见第二行)。通过这种方式,您可以保留这些值并查看它们来自哪里。然而,这并不像你所要求的那样同步,因为你仍然必须操纵新书第2页中的数据来对这些链接做任何有意义的事情。

这是否有助于/让您开始正确的方向?

+0

嗨Gaffi和谢谢你的回答。它可以帮助。说我也保存公式,并因此保存位置。我可以写一些像'MainWorkbook.Range(SavedLocationInFormula)= ExportedWorkbook.Range(...)'?也许我应该在没有'''的情况下保存公式,或者更好的是,不用'='。我如何修剪公式? – Nicolas

+0

要删除等号,我尝试应用[this](http://stackoverflow.com/questions/8633223/vba-removing-the-first-character-of-a-string-if-it-equals-something) 。我正在复制“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)任何想法? – Nicolas

+0

我目前无法测试,因此我可能必须回复您,但是您是否尝试过'正确(tempCell,Len(tempCell) - 2'(swap 2 for 1)?另外,如果“ tempCell'不工作,你可以'MsgBox'或'Debug.Print'它在你说的步骤后不起作用吗?我想看看什么是分配的与单元格中的内容 – Gaffi