
No.2ベストアンサー
- 回答日時:
ご自分でつくったコードをちゃんと提示しましょう。
それが多くの回答をもらうポイントです。
> (3)最も多い文字列以外の文字列を含む行を削除する
含む? これだと全ての行が削除対象になる気がしますが...
始まる...ですかね?
プログラムを組むまでもなく、作業列を2つ設けて数式
B1 セル: =LEFT(A1,4)
C1 セル: =COUNTIF(B:B,B1)
とし、データ終端までフィルでコピー。あとは C 列にオートフィルターをかけ、
最頻値以外を抽出して削除すれば良い気がしますが...
作業列を使わず、Excel VBA だけで完結させるなら、こんな感じかと。
Sub Sample()
Dim Dic As Object
Dim rTable As Range
Dim rDelRow As Range
Dim C As Range
Dim vDat As Variant
Dim sKey As String
Dim sModeKey As String
' 頭から切り出して調べる文字数
Const CHARCOUNT = 4
' データ範囲
With Worksheets("Sheet1")
Set rTable = Range(.Cells(1, "A"), _
.Cells(Rows.Count, "A").End(xlUp))
End With
' (2)先頭4文字の文字列で最も多い種類の文字列の値を取得する
' --> sModeKey です
Set Dic = CreateObject("Scripting.Dictionary")
sModeKey = ""
For Each vDat In rTable.Value
' 空または CHARCOUNT 以下のデータはここでは無視
If Not IsEmpty(vDat) And Len(vDat) >= CHARCOUNT Then
sKey = Left$(vDat, CHARCOUNT)
' ※ Dictionary は キーが重複するとエラーになります
If Dic.Exists(sKey) Then
Dic(sKey) = Val(Dic(sKey)) + 1
Else
Dic.Add Key:=sKey, Item:=1
End If
' 最頻値更新
If Len(sModeKey) > 0 Then
If Dic(sKey) > Dic(sModeKey) Then
sModeKey = sKey
End If
Else
sModeKey = sKey
End If
End If
Next
' (3)最も多い文字列"以外"で"始まる"行を Select する
' 本当は Find を使った方が速いけど長くなるので...
If Len(sModeKey) > 0 Then
sModeKey = sModeKey & "*"
For Each C In rTable.Cells
If Not C.Value Like sModeKey Then
If rDelRow Is Nothing Then
Set rDelRow = C
Else
Set rDelRow = Union(rDelRow, C)
End If
End If
Next
Else
' 最頻値が得られなければデータ範囲全体
Set rDelRow = rTable
End If
' 削除確認してOKなら削除
If Not rDelRow Is Nothing Then
rDelRow.EntireRow.Select
If MsgBox("削除OK?", vbOKCancel + vbExclamation) = vbOK Then
Selection.Delete Shift:=xlShiftUp
Selection.Cells(1).Select
End If
Else
MsgBox "削除対象はありません.", vbInformation
End If
' 後始末
Set rTable = Nothing: Set rDelRow = Nothing
Set Dic = Nothing
End Sub
この回答へのお礼
お礼日時:2006/11/24 22:36
KenKen_SPさん、こんにちは。
マクロの中で文字の最頻値以外の文字列の行を削除する必要があったので、質問させていただきました。
示していただいたコードですが、細かい場合分けまで考慮していただき参考になりました。
ありがとうございます。
No.1
- 回答日時:
要は、先頭4文字でもっともダブりが少ない文字列を抜き出すということですね。
私はよくDictionaryやCollectionを使います。名前つき配列というものです。同じ名前では登録できないので、先頭から4文字を加えて、全部同じなら1つ、全部異なるなら、4つになります。
A列の記載があるので、Excelの前提です。(試してません^_^;
dim rg as Excel.Range
dim dic as Scripting.Dictionary
dim adrs as String
dim i as long
dim lcnt as long
set rg = ActiveSheet.Range("A1")
do while rg.text <> ""
set dic = New Scripting.Dictionary
for i=1 to 4
dic.add mid$(rg.text,i,1) 'ダブってもエラーにならなかったはず...
next
if (lcnt < dic.Count) then
lcnt = dic.Count
adrs = rg.address
end if
set rg = rg.Offset(1,0)
loop
この回答への補足
ctpzrさんありがとうございます。
試してみましたが、2行目の "as ScriptingDictionary"のところで"ユーザ定義型は定義されてません"とエラーが出てしまいます。
どのように対処したらよいでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルでアルファベットか数...
-
エクセルで文字列をtxtファイル...
-
VBの「As String * 128」とは?
-
EXCELで=より左の文字を一括で...
-
VBAでの Replace関数で、ワイル...
-
Msgboxの×が押されたとき
-
Excelで偶数行だけ文字列を数え...
-
VBA 1つのセルに入っている値の...
-
文字列からタブコードを取り除...
-
SQL の Update文(?) と ...
-
アクセスで特定の数字以外(複...
-
php言語の脆弱性について
-
grepで検索行以外の行を抽出す...
-
Excelで3E8を3.00E+8にしない方...
-
aaa.bbb.ccc という、「ドット...
-
【Teraterm】文字列と変数の連...
-
UNIX:縦一列のファイルを横一行...
-
PDFのファイル名をリネームをし...
-
エクセルでSQLでいうところの「...
-
C言語の勉強しています。すみま...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルでアルファベットか数...
-
EXCELで=より左の文字を一括で...
-
エクセルで文字列をtxtファイル...
-
文字列からタブコードを取り除...
-
VBAでの Replace関数で、ワイル...
-
Excelで指数表現しないようにす...
-
エクセルで文字列の最大値を抽...
-
VBの「As String * 128」とは?
-
VBA2005 16進を2桁で表示したい。
-
Excelで3E8を3.00E+8にしない方...
-
【Excel VBA】複数ある特定の文...
-
OnTime 使用時のプロシージャへ...
-
アクセスで特定の数字以外(複...
-
エクセル 数値データを桁をそ...
-
Msgboxの×が押されたとき
-
ORCLEでの小数の表示方法の変更...
-
VBAを使って選択した範囲の数字...
-
MS SQLServer のSQLで文字列の...
-
同一セル内に関数と文字列を同...
-
Pro c/c++ でホスト変数の後に....
おすすめ情報