
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
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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAで、特定の文字より後を削除して残った数値を文字列に変換と特定の文字より前も削除したい 3 2022/04/15 19:21
- その他(コンピューター・テクノロジー) googleスプレッドシートでカッコ内の文字数をカウントしたい 1 2023/01/17 15:52
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- Excel(エクセル) Excelの列から検索して該当する行を別シートに転記するVBA 2 2022/12/20 09:35
- その他(プログラミング・Web制作) 2つのテキストファイルを比べて文字列を特定する方法を教えて下さい 5 2022/05/01 15:22
- C言語・C++・C# C#の問題です。 文字列型の配列 s[100] にキーボードから入力された100文字以内の文字列(単 2 2022/06/22 15:18
- Excel(エクセル) Excelでの検索結果を含む行だけを表示させたい 5 2023/03/10 17:08
- Visual Basic(VBA) 特定の文字を簡単な操作で半角スペースに変換するか削除したい 2 2022/11/01 10:35
- その他(プログラミング・Web制作) テキストエディタで複数行にわたる文字列の行頭に番号を振る方法 4 2023/03/11 12:57
- Visual Basic(VBA) VBA初心者です 検索した数字の行に色をつける 5 2023/02/13 14:22
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
アンチエイリアス
-
Left関数とRight関数を合わせた...
-
エクセルでセル内の文字列の最...
-
指定した文字の前の数字を取り出す
-
コンソメの瓶
-
Excel2003 VBA 文字列の比較で
-
firefoxで、特定の文字列を含む...
-
Python Django csv について
-
エクセルでアルファベットか数...
-
エクセルでSQLでいうところの「...
-
変数内に入った文字列の結合 UWSC
-
VBA shellでメールを作成した際...
-
latex 数式でテキストを書く
-
テキストファイルに一行文字を...
-
DOSコマンド
-
並べ替えについて教えて下さい
-
Androidアプリで別環境でのリソ...
-
sedなどで、特定の文字列内の数...
-
文字列からタブコードを取り除...
-
エクセルの関数について再度教...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルでアルファベットか数...
-
EXCELで=より左の文字を一括で...
-
文字列からタブコードを取り除...
-
VBAでの Replace関数で、ワイル...
-
エクセルで文字列をtxtファイル...
-
【Excel VBA】複数ある特定の文...
-
エクセル 数値データを桁をそ...
-
Excelで3E8を3.00E+8にしない方...
-
VBA2005 16進を2桁で表示したい。
-
エクセルで文字列の最大値を抽...
-
同一セル内に関数と文字列を同...
-
Left関数とRight関数を合わせた...
-
Excelで指数表現しないようにす...
-
MS SQLServer のSQLで文字列の...
-
VBの「As String * 128」とは?
-
エクセルでセル内の文字列の最...
-
ORCLEでの小数の表示方法の変更...
-
bashスクリプトでの文字列から...
-
LEFT関数で文字数を指定しない...
-
アクセスで特定の数字以外(複...
おすすめ情報