2011-09-14 21 views
1

Excel 2007 VBマクロでは、カンマ区切り文字列を分割して分割し、それを減らして連続する重複値を削除します。したがって、「2,2,2,1,1」は「2,1」になり、「3,3,3,2,3,3,3」は「3,2,3」になります。ExcelのCSVから連続した重複値を削除するVisual Basic

これはうまくいくようですが、「If If currentVal.equals(prevVal)= False Then」になると、ランタイムエラー424、「Object required」になります。

私はVBを行って以来ずっとずっと続いていました。VP6でした。

Sheets("Sheet1").Select 
Range("I1").Select 

Dim data() As String 
Dim currentVal, prevVal As String 
Dim output As String 
Dim temp As Boolean 

Do Until Selection.Value = "" 
     data = Split(Selection, ",") 
     output = "" 
     prevVal = "" 
     For Each elem In data 
      currentVal = CStr(elem) 
      If currentVal.equals(prevVal) = False Then 
      output = output + elem + "," 
      End If 
     Next elem 
     Selection.Value = output 
     Selection.Offset(1, 0).Select 
Loop 

答えて

3

いくつか問題があります。 ...

Dim currentVal as String, prevVal as String 

することができますようにいないVBAでのショートカットの種類残念ながら:

Dim currentVal, prevVal As String 

あなたが使用する必要があります:

Dim currentVal as String 
Dim prevVal As String 

かを第一に、あなたが使用することはできません。第2に、文字列はVBAのオブジェクトではないため、等価(または他の方法)はありません。あなたは望みます:

最後に、ループの最後にprevValを設定する必要があります。そうしないと、コードが期待通りに機能しません。

EDITここではいくつかの作業コードです:

Dim data() As String 
Dim currentVal As String, prevVal As String 
Dim output As String 
Dim temp As Boolean 

Do Until Selection.Value = "" 
     data = Split(Selection, ",") 
     output = "" 
     prevVal = "" 
     For Each elem In data 
      currentVal = CStr(elem) 
      If currentVal <> prevVal Then 
       output = output + elem + "," 
      End If 
      prevVal = currentVal 
     Next elem 
     Selection.Value = output 
     Selection.Offset(1, 0).Select 
Loop 
+0

を参照してください。最後の点を認識して固定しました。また、IRCのchanからcurrentVal = prevValを取得しました。ありがとうございます。しかし、StringはObjectでなければならず、.equals()メソッドを持っているはずです(http://msdn.microsoft.com/en-us/library/system.string.equals%28v=vs.80)。 %29.aspxもちろん、これはVB.NETではなくVBAなので、すべての違いを生むかもしれません。 – Drizzt321

+0

ああ、それはすべての違いを作る。 VBAはVB6に基づいており、小さな構文類似性の外ではVB.NETとほとんど共通していません。文字列、ブール値、整数、ロングなどのデータ型は、VBAのオブジェクトではなく、メモリ内の実際のデータ値を保持するため、関連するプロパティやメソッドがなく、直接比較して操作できます。変数が実際の値を保持するのではなくメモリアドレスを指すように、文字列がオブジェクトである言語ではString.equals()が必要です。 – Banjoe

2

は、私はあなたのアプローチの効率と速度を最大化するために、正規表現でバリアント配列を使用してお勧めしたいです。あなたが移動している、特に以来辞書オブジェクトを使用することができバリアント配列

Sub Clear() 
    Dim ws As Worksheet 
    Dim rng1 As Range 
    Dim X 
    Dim lngRow As Long 
    Dim objRegex 
    Set objRegex = CreateObject("vbscript.regexp") 
    Set ws = Sheets("Sheet1") 
    Set rng1 = ws.Range(ws.[i1], ws.Cells(Rows.Count, "I").End(xlUp)) 
    With objRegex 
     .Global = True 
     .Pattern = "(\d)(,(\1))+" 
     If rng1.Cells.Count > 1 Then 
      X = rng1 
      For lngRow = 1 To UBound(X) 
       X(lngRow, 1) = .Replace(X(lngRow, 1), "$1") 
      Next lngRow 
      rng1 = X 
     Else 
      rng1.Value = .Replace(rng1.Value, "$1") 
     End If 
    End With 
End Sub 
+1

+1、良いアプローチ。 – Reafidy

1

を適用する前には、他の場所で、私自身の助言コードに1個の以上の細胞のために今すぐテストをピックアップ:この

アップデートのようなものテキストファイルの番号は、数字として扱われていても問題ありません。 this question

+0

さて、私は、辞書を使用して、2番目のシートに集計されたデータを出力するようにコードを修正しました。私は実際にはわずか4〜5時間でそれを達成するために自分自身をかなり誇りに思っています!初めてVBAをやる。 – Drizzt321

+0

クール。うん、その辞書のオブジェクトはかなり便利です。行きたい! – Brad

関連する問題