2017-07-21 10 views
0

私は、ユーザーがテキストファイルを「データ読み込みシート」にインポートするExcelワークブックを持っています。インポートされるファイルの数は、ファイルをどのようにインポートするかによって異なります。これまでのところ私のワークブックはうまくいくが、私は一気にぶつかった。ユーザーがファイルをインポートすると、そのデータセットに識別子(1,2,3など)が割り当てられます。次に、ユーザーがドロップダウンボックスからオプションを選択すると、計算とプロットが自動的に生成されます。ユーザーには「すべてのデータを消去」オプションがあり、これを選択するとすべてのワークシートが消去され、ユーザーが新しいファイルをインポートすると(「すべてのデータを消去」ボタンをクリックした後)、識別子値は1で再開します。 /インポートされたファイル数カウント識別子のために..私は今に走ってきたVBAの静的変数

Public Sub Macro(Optional reset As Boolean = False) 

Static i As Integer 
If reset Then 
i = -1 
i = i + 1 
Exit Sub 
End If 

i = i + 1 

Worksheets("Hidden").Cells(i + 1, 1).FormulaR1C1 = "=" & i 

Worksheets("Hidden").Cells(2, 2).FormulaR1C1 = "=" & i 

End Sub 

問題は、データが、私はこのファイルを保存し、それを再度開くときに、後日、このシートにインポートする必要がありますですさらに多くのファイルをインポートすると、ファイルのインポートの識別子/カウントが1で再開しますが、これは発生したくありません。私はもっ​​と多くのファイルを追加し続けてコードを続けることができるようにしたい、私はすべてのインポートされたデータをクリアして再起動する必要はありません。どのように私はこれを行うことができますかに関する任意のアイデア? TIA。

+0

ワークブックレベルの名前を作成し、その中で値を格納します。それを呼び出すために

Public Sub SequenceNumber(Optional ByVal Reset As Boolean = False) If Not PropertyExists("Identifier") Then ThisWorkbook.CustomDocumentProperties.Add Name:="Identifier", _ LinkToContent:=False, _ Type:=msoPropertyTypeNumber, _ Value:=0 End If Dim p As Object Set p = ThisWorkbook.CustomDocumentProperties("Identifier") If Reset Then p.Value = 0 Else p.Value = p.Value + 1 End Sub 'Property Exists? Private Function PropertyExists(ByVal propertyName As String) As Boolean Dim p As Object For Each p In ThisWorkbook.CustomDocumentProperties If p.Name = propertyName Then PropertyExists = True Exit Function End If Next p End Function 

。値はワークブックと一緒に保存されます。 –

+0

もう少し詳しいことを教えてください。私はワークブックレベルの名前について聞いたことがありません! – hdk857

+0

モジュールコード内で、サブコードまたは関数の前にpublicとして設定された文字列変数 –

答えて

1

私はシーケンスを管理するために、スタンドアロン関数を作成したいです。 Workbook Nameエントリに値を格納します。

注 - 複数のシーケンスを管理する必要がある場合は、関数内の定数を使用する代わりに、シーケンスの名前をパラメータに昇格させることができます。

Function NextSequence(Optional reset As Boolean = False) 
    Const COUNTER_NAME As String = "NM_COUNTER" 
    Dim nm As Name, i 

    On Error Resume Next 
    'is the name already created? 
    Set nm = ThisWorkbook.Names(COUNTER_NAME) 
    On Error GoTo 0 

    If nm Is Nothing Then 
     'not there yest - create it... 
     Set nm = ThisWorkbook.Names.Add(COUNTER_NAME, 0) 
    End If 

    If Not reset Then 
     i = Evaluate(nm.RefersTo) 
     i = i + 1 
     nm.RefersTo = i 
    Else 
     nm.RefersTo = 0 
     i = 0 '<< or 1 if you want NextSequence(True) to 
       ' return the first sequence value 
    End If 

    NextSequence = i 
End Function 

使用法:

Public Sub Macro(Optional reset As Boolean = False) 

    Dim i 
    i = NextSequence(reset) 
    If reset Then Exit Sub 

    With Worksheets("Hidden") 
     .Cells(i + 1, 1).Value = i 
     .Cells(2, 2).Value = i 
    End With 

End Sub 
+0

前のコードを保持し、これを追加する必要がありますか?どのセルに入っているのか、どうやって知っていますか? – hdk857

+0

あなたは 'i = NextSequence()'のような何かをiの次の値として与えるためにのみその関数を使います。あなたが 'NextSequence(True)'をコールしない限り、その場合、値はリセットされます。おそらく、これはあなたがやっていることに最適ではないでしょう。 –

+0

だから私はこの関数を呼び出すときに私はそれを保つためにNextSequence()コールを行う必要がありますが、私はそれを再起動したい場合はNextSequence(True)を呼び出す必要がありますか?私のコードを実行すると、私のワークシート内に値が置かれなくなります。 – hdk857

0

これは、識別子/カウントの値をセル内に格納し、セルを非表示/ロックするための簡単な修正です。再起動時にセル内の値は変更されませんが、VBA内で操作できます。

、それがどのように見えるべきかの非常に迅速な感じ(私は私が必要とするすべての情報を持っていないので、おそらくinnacurate。)

Public Sub Macro(Optional reset As Boolean = False) 

Static i As Integer 
i = ActiveWorkBook.Sheets("Ressource").Range("A1").Value 
If reset Then 
i = -1 
i = i + 1 
Exit Sub 
End If 

i = i + 1 

Worksheets("Hidden").Cells(i + 1, 1).FormulaR1C1 = "=" & i 

Worksheets("Hidden").Cells(2, 2).FormulaR1C1 = "=" & i 

End Sub 
0

また、シーケンス番号を保存するCustomDocumentPropertyを作成することができます。メソッドにブール値を渡してリセットすることができます。

最後に、ヘルパー関数はプロパティが存在するかどうかをチェックし、そうでない場合は追加します。

SequenceNumber 
SequenceNumber Reset:=True