0

私は非常に特別な問題を抱えています。私は自分と同様の問題を探し、誰もが提案した多くの解決策をテストしましたが、どれも私が必要としているものではありません。

私のクライアントは、データ シートを Excel 形式でエクスポートする必要があります。これらのデータは、並べ替え、変更、再配置、新しい値の入力が可能であり、一部の行が消えたり、別の行が代わりになったりする可能性があります。要するに、それらのデータに何かが起こる可能性があります。例として、食料品店のリストに表示されているアイテムのリストをエクスポートするとします。

ItemID ItemName Price
Fr01   Apple    2.5
Fr02   Orange   4.0
Mt01   Beef     10.0
Mt02   Pork     8.33
Vg01   Carrot   1.25

私の問題は、このデータを最初にExcelを作成したソフトウェアにインポートして、「ItemID」に基づいてデータベースでこれらの値を更新(または追加)できることです。データの値と型、相互関係が「正しい」かどうかは、既に検証しています。

範囲に名前を付けてみました。問題は、データがフィルター/ソートされている場合、名前がコンテンツに従わず、同じ位置に静止していることです

original : (範囲名は範囲の名前であり、実際の列ではありません)

ItemID ItemName Price || Range Name
Fr01   Apple    2.5   || data_fr01
Fr02   Orange   4.0   || data_fr02
Mt01   Beef     10.0  || data_mt01
Mt02   Pork     8.33  || data_tm02
Vg01   Carrot   1.25  || data_vg01

ItemName で並べ替えた後:

ItemID ItemName Price || Range Name
Fr01   Apple    2.5   || data_fr01
Mt01   Beef     10.0  || data_fr02
Vg01   Carrot   1.25  || data_mt01
Mt02   Pork     8.33  || data_tm02
Fr02   Orange   4.0   || data_vg01

ご覧のとおり、Range Name を除くすべての情報が正しく続いているため、インポートしようとすると、多くのデータの不一致が発生しました。

私の他の試みは、NameRange を Excel の実際のセルにすることでした。この方法だと、セルは追従しますが、変更できるので、保護されたセルを作成してみます。残念ながら、そのため、行を挿入または削除することはできません。マスクされたシートに名前を付けるという回避策を見つけましたが、もう一度、シートを同期する必要があります。これは、前述と同じ理由で信頼できません。

さらに悪いことに、xls (97-2003) と xlsx の両方をサポートする必要があります。

したがって、「範囲名」データをセルに何らかの形で保存して、Excelユーザーには見えないようにする安定した回避策を探していますが、データを追跡して、再起動時に適切な場所で取得できるようにします-データのインポート。

前もって感謝します。

編集 :

最後に、C# アプリケーションからこのプロパティを書き込んで、同じプロパティを C# で読み戻せる必要があります。また、Excel ファイル形式と互換性があり、Excel ユーザーが表示も編集もできないが、元の値セットのままである必要があります。削除を除いてシート内のデータに起こります(範囲全体ではなく、Appleを書いたセルに置いてもかまいません)

4

4 に答える 4

1

わかりました (YMMV をエクスポートするときにワークシートに検証インテリジェンスを追加する方が良いと思います)。

Range.ID 文字列プロパティを使用してみてください。これは Excel UI から編集または表示できず、セルとともに移動します。セルが削除されると、セルは消えます。セルがコピーされると、ID プロパティがコピーされるため、重複が発生します。
これは Excel 2000 で導入されたため、おそらく Excel 97 では機能しませんが、Excel 2000 から Excel 2013 までのすべてのファイル形式で問題なく動作するはずです
。VBA コードの例を次に示します。

Sub putids()
    Dim j As Long
    For j = 1 To 5
        Range("a1").Offset(j - 1, 0).ID = CStr(j)
    Next j
End Sub

Sub getids()
    Dim j As Long
    For j = 1 To 5
        Debug.Print Range("a1").Offset(j - 1, 0).ID
    Next j
End Sub
于 2013-05-11T16:32:30.377 に答える
0

名前付き範囲がどのように役立つかわかりません。
ユーザーが無効なデータを保存できないように、保存前イベントを使用してワークブックに検証コードを追加することを考えたことはありますか?

または、Excel のデータ入力規則を使用してどれだけのことができるかを確認します。

それ以外の場合は、すべてのデータを読み取り、後で DB 更新時に検証する必要があります (これは基本的に遅すぎます)
。おそらく基本的な検証は、iTemID が有効であることです。DB コードはデータの順序を気にせず、空の行をスキップするなど。

于 2013-05-10T19:01:43.283 に答える