0
=IFERROR(MID(I46,FIND("-",I46,8)-2,5),"")

別のプログラムから 1 つのセルに大量の情報がコピーされています。この文字列には、現在の目的にとってまったく意味のない部分がいくつかあります。関連情報を抽出したいのですが、常に同じようにフォーマットされていますが、文字列内の同じ位置にあるとは限りません。探しているものを返す上記のコードを使用していますが、「-」が見つかった場合は他のバリエーションも返されます。これはよくあることです。

抽出したい情報は常に LetterLetter-NumberNumber です。例: AA-01 AA-02 AB-01 など、常に 5 文字です。

どうすればこれだけを抽出できますか?

次に、必要に応じて別の行で、重複するインスタンスを削除します (ほとんどの場合、重複があります)。

私が今得ているのは;

HA-03
HA-03
T - S
Y - R
HA-03
HA-03
HA-03
HA-03

Y - R
HA-06
HA-06

R - S
HA-07

HA-09
HA-09
HA-09

まず、取得したいのは;

HA-03
HA-03
HA-03
HA-03
HA-03
HA-03
HA-06
HA-06
HA-07
HA-09
HA-09
HA-09

次に、それを次のように変換します。

HA-03
HA-06
HA-07
HA-09

中間業者をスキップする方法があれば、私はすべて耳にします =)

ありがとうございました。

4

2 に答える 2

2

Range.RemoveDuplicatesリストの重複を排除するためにマクロを作成し、次にまたは正規表現 ( HTML、単語、数字、および日付が混在する文字列の解析Likeに投稿したコードを参照) を使用して残りのセルをループし、セルが条件を満たしているかどうかを確認することができます。一致しないものを削除します。

重複除外してから照合する方がおそらく効率的ですが、どちらの方法でも実行できます。

VBA の初心者でコードが必要な場合は、コメントを追加してください。投稿します。

編集:

Visual Basic エディター (Alt-F11) に移動し、メニュー項目 [ツール/参照...] を選択し、[Microsoft VBScript 正規表現 5.5] を見つけてチェックし、[OK] をクリックする必要があります。VBA Project次に、プロジェクト エクスプローラー (Ctrl-R) で、ワークブックの を右クリックし、Insert>をクリックしますModule

次のコードを追加します。

Public Function RegEx(strInput As String, strRegEx As String, Optional bIgnoreCase As Boolean = True, Optional bMultiLine As Boolean = False) As Boolean
    Dim RegExp As VBScript_RegExp_55.RegExp
    Set RegExp = New VBScript_RegExp_55.RegExp
    With RegExp
        .MultiLine = bMultiLine
        .IgnoreCase = bIgnoreCase
        .Pattern = strRegEx
    End With
    RegEx = RegExp.test(strInput)
    Set RegExp = Nothing
End Function

(後で使用する可能性がある場合は、HTML、単語、数字、および日付が混在する文字列の解析から他の正規表現コードを追加できます)

次のコードを追加します (削除するデータが列 A にあると仮定します)。

Public Sub DedupeAndFilter()
    Dim RCtr As Long
    ActiveSheet.Range("A:A").RemoveDuplicates Columns:=1, Header:=xlNo
    For RCtr = ActiveSheet.UsedRange.Rows.Count To 1 Step -1
        If ActiveSheet.Range("A:A").Rows(RCtr).Text = "" Then
            ActiveSheet.Range("A:A").Rows(RCtr).Delete xlShiftUp
        ElseIf Not RegEx(ActiveSheet.Range("A1").Rows(RCtr), "[A-Z]{2}-\d\d", True) Then
            ActiveSheet.Range("A:A").Rows(RCtr).Delete xlShiftUp
        End If
    Next
End Sub

次に、DedupeAndFilterコード ブロック内にカーソルを置きF5、緑色の実行 ">" 三角形を押すかクリックします。コードは、列 A から重複、空白セル、および不適合セルを削除します。

影響を受ける列を変更する場合は、「A:A」をActiveSheet.Range("A:A")他の列参照に変更するか、必要なActivesheet.Selection列を置き換えて選択します。

于 2013-09-17T02:12:52.227 に答える
0

VBAを避けたい場合は、これを試してください:

Column A
asdfHA-03asdfasdf
HA-03sadfsa
asdfT - S
Y - Rasdfsad
asdfHA-03adf
asdHA-04
asdfsadf

次に、この式を使用します。

=IF(ISERROR(FIND(" ",IFERROR(MID(A1,FIND("-",A1)-2,5),""))),IFERROR(MID(A1,FIND("-",A1)-2,5),""),"")

これにより、 の付いたものが除外spacesされます。値としてコピーして貼り付けるだけで、重複を削除できます

于 2013-09-17T08:48:48.210 に答える