3

私は問題があります。私はあなたのすべてのフィードバックでうまく機能するフォームを設計するのに何時間も費やしました. 今日、すべてがうまくいかなかった。この理由は簡単です。いくつかの新しい列が追加され、明らかに、フォームが読み取っているデータが間違っています。

したがって、私は次のことを試してみることを考えていました...

以下のように列番号を使用するのではなく

TK = Cells(ActiveCell.Row, "S").Value 'everything in the form refers to the active row

行 1 の列見出しを使用することもできます。

それは可能ですか?このようにして、スプレッドシートにユーザーが望む数の列を追加することができ、フォームは正しい見出しを動的にスキャンして列番号を取得します。

私の考えでは、フォームを開いてすべての見出しを読み、必要なものを選択して変数に割り当てます。次に、通常のコードを使用して、変数を列セクションに代入します。

簡単に聞こえますが、これを行う方法がわかりません。

4

4 に答える 4

4

汎用性を使用してFind、ヘッダーがどこにあるか、または欠落しているかどうかをすばやく検出する方法を提供します

詳細はこちら

以下のコードでは、検索が返される必要があることを指定しています

  • 完全一致 ( xlWhole)
  • 大文字と小文字を区別する一致 ( False)

マッチ部分マッチ ( xlPart) である可能性があります。

コード

Const strFind = "Game"

Sub GetEm()
Dim rng1 As Range
Set rng1 = ActiveSheet.Rows(1).Find(strFind, , xlValues, xlWhole, , , False)
If Not rng1 Is Nothing Then
MsgBox "Your column is " & rng1.Column
Else
MsgBox strFind & " not found", vbCritical
End If
End Sub
于 2013-04-23T12:26:59.653 に答える
3

ループを使用する理由 その必要はありません。

Dim col as variant 
Col = application.match("my header", rows(1), 0)
If iserror(col) then
    'not found
Else
    TK = cells(activecell.row, col)
End if
于 2013-04-23T10:43:08.803 に答える
1

あなたの考えは良いものです。アドレスを計算するために列ヘッダーを読み取ることは、ハード コーディングを回避する 1 つの方法です。

Sub Test()
Dim R As Range

    Set R = ActiveSheet.[A1]
    Debug.Print ColNo(R, "Col1Hdr")
End Sub

Function ColNo(HdrRange As Range, ColName As String) As Integer
    ' 1st column with empty header is returned if string not found
    ColNo = 1
    Do While HdrRange(1, ColNo) <> ""
        If HdrRange(1, ColNo) = ColName Then Exit Do
        ColNo = ColNo + 1
    Loop
End Function

私が頻繁に使用する別の方法 - 上記よりも好ましいことを認めなければなりませんが、別Enumの「定義」モジュールですべてのテーブルに対して 'sを定義することです。

Public Enum T_VPN   ' sheet VPN
    NofHRows = 3    ' number of header rows
    NofCols = 35    ' number of columns
    MaxData = 203   ' last row validated
    GroupNo = 1
    CtyCode = 2
    Country = 3
    MRegion = 4
    PRegion = 5
    City = 6
    SiteType = 7
    ' ....
End Enum

そしてそれを次のように使用します

Sub Test1()
    Debug.Print ActiveSheet(T_VPN.NofHRows, T_VPN.Country)
End Sub

ご覧のとおり、使い方は簡単です。これもまた「ある種の」ハードコーディングですが、すべての定義を 1 か所にまとめておくと、メンテナンスが大幅に軽減されます。

于 2013-04-23T07:12:11.010 に答える
1

この目的のために、私は通常、ヘッダー (シートの最初の行) を実行し、検索した値を含む列の番号を返す関数を使用します。

Public Function FindColumn(HeaderName As String, Sht As String) As Long

Dim ColFound As Boolean
Dim StartingPoint As Range

ColFound = False

Set StartingPoint = Sheets(Sht).Range("A1")
Do While StartingPoint.Value <> ""
    If UCase(Trim(StartingPoint.Value)) = UCase(Trim(HeaderName)) Then
        FindColumn = StartingPoint.Column
        ColFound = True
        Exit Do
    Else
        Set StartingPoint = StartingPoint.Offset(0, 1)
    End If
Loop
If Not ColFound Then FindColumn = 0

End Function

: 「Timeline」という名前のシートの最初の行に「Date」(A1)、「Time」(B1)、「Value」(C1) などのヘッダーが含まれている場合、「Time」は 2 番目の列であるため、呼び出しFindColumn("Time", "Timeline")は 2 を返します。シート「タイムライン」で

これが少し役立つことを願っています。

于 2013-04-23T06:56:15.100 に答える