0

私が書いた小さな Excel プログラムに 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

しかし、データをロードするときに問題が発生します...

ネット上にはいくつかの例がありますが (ここそこを参照)、その方法を示していますが、常に同じ問題が発生します。つまり、保存したワークブック (値のみ) から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 番目のシートに挿入することです。同じ位置 (2 行目を参照)。このようにして、値を保持し、それらがどこから来たのかを確認することもできます. ただし、これらのリンクで意味のあることを行うには、新しい本のシート 2 のデータを操作する必要があるため、これは実際にはあなたが要求するような同期ではありません。

これは正しい方向への助けになりますか?

于 2012-06-29T10:45:39.593 に答える