0

我想将保存/打开功能添加到我编写的一个小 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

但是,当加载数据时,挑战就来了……

网上有几个例子(见这里那里)展示了如何做,但总是有同样的问题。也就是说:如果我只是将数据从保存的工作簿(仅限值)复制到工作Entries表,我所有的“链接”都将被删除。有没有办法同步数据?

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

4

2 回答 2

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
于 2012-07-31T07:01:20.520 回答
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 页中的数据才能对这些链接做任何有意义的事情。

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

于 2012-06-29T10:45:39.593 回答