• 締切済み

エクセル 白丸文字と黒丸文字の重複チェック

S41(S41:AI47)のセルに下記のような丸文字があります。 (↓文字化けしてました)  (1)❷ (3)(4)(5)(6)(7)❽ (9)  以後、()は○だと思ってください。❷は黒丸2 ❽は黒丸8 です。   やりたい事: 1) このS41のセル内の重複チェックしたい。(AK41 辺りに重複 の表示) 只、(2)❷など白丸文字と黒丸文字 は同じ値とし、チェックしたい(例 (2)❷ =重複)  (この丸文字は単語登録してありますので、➀(1)といった類似文字を間違って入力する事はないと思います。) 2) (1)~(9)の数値が全部入力されているかの確認をしたい。 1)に関しては安易な考えなのですが可能なのであれば、(そもそもこのようなマクロは無いかもしれませんが)(1)=1 (2)=2 ❷=2と置き換えてAL41のセルに入力できるようにし、AL41を重複チェックしたら良いのか?など思っています。 優先的には、1)を重視したいです。  エクセル2003を使用しています。 (2007でないとできないというのであれば 何とか成功させたいので2007導入も検討します) 環境依存文字で難しいのかもしれませんがよろしくお願いします。

みんなの回答

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.6

#4 のユーザー定義関数に関して Public Function CheckDoubles(ByVal rng As Range, Optional opt As Integer = 0) As   ~ End Functon 同じブックの、標準モジュールに貼り付けます '------------------------------------------- シートの必要な場所に = CheckDoubles(セルまたはセルの範囲) 例: =CheckDoubles(S41) 足りない数値が出ます。 = CheckDoubles(セルまたはセルの範囲, 1 ) Opt は、0以外です。 ダブリの数字が出ます。 例: =CheckDoubles(S41,1) '------------------------------------------- たったこれだけのことです。ヘルプは、現在の設定では出てきません。 なお、数式は、あまり多く使いますと、配列数式と同様、シートが重くなりますから、マクロで、定数化したほうが軽くなります。

全文を見る
すると、全ての回答が全文表示されます。
  • _Kyle
  • ベストアンサー率78% (109/139)
回答No.5

#3です。 >実際にはスペースがあります。 よく見ると質問文の例にもちゃんとスペースが入ってますね^^;; 見落としていました、すみません。 #4さまがユーザー定義関数を提示されていますので、 もう不要かもしれませんが…。 ------------------------------------- 作業セルをもう一つ用意し、対象セルに対してまず、  =SUBSTITUTE(ASC(A1)," ",) とすれば、(全半角問わず)スペースを除いた文字列が得られますから、 そのセルについて、#3と同様に変換,チェックをおこなえば結果が得られます。  1.対象セル   ↓  2.スペース除去   ↓  3.変換   ↓  4-1.重複チェック  4-2.欠落チェック という順です。 一応ご参考まで。

fdjsiimga
質問者

お礼

 度々、ありがとうございます。 できました!感激です。 エクセルって本当に奥が深くすごいんですね。 (皆様の様に使いこなせればですけど・・・) #1の回答者様の方法と併用で使っていきたいと思います。

全文を見る
すると、全ての回答が全文表示されます。
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんにちは。 ユーザー定義関数に換えてみました。あくまでも、VBAをご存知の方に対するものですから、こちらから、あまり初歩的な説明をするつもりはありません。組み込んでお使いになれるようなら、お試しください。組み込み関数では出来ないことが可能かと思います。 ユーザー定義関数の数式は、 不足している数字 =CheckDoubles(A1:J1) 重複している数字 =CheckDoubles(A1:J1, 1) 単独セルでも、複数セルでも検索可能です。 重複がない場合は、空文字「""」が出力しています。 なお、   'パターン   mPattern = "\u2460-\u2468\u2776-\u277E" 文字範囲は、Unicode になっていますから、その範囲を指定すればよいのですが、 If n > 10 ^ 4 Then n = n - 10101 If n > 9 * 10 ^ 3 Then n = n - 9311 ここで、数値に変換しています。ただし、配列は、数字(文字)に変換しています。 '------------------------------------------- '標準モジュール '------------------------------------------- Public Function CheckDoubles(ByVal rng As Range, Optional opt As Integer = 0) As String   Dim buf() As Variant   Dim misbuf() As Variant   Dim dbuf() As Variant   Dim dbbuf() As Variant   Dim n As Variant   Dim s As String   Dim i As Long   Dim j As Long   Dim k As Long   Dim c As Variant   Dim v As Variant   Dim ret As Variant   Dim Matches As Object   Dim Match As Object   Dim mPattern As String   Dim List1 As Variant   Dim List2 As Variant   'パターン   mPattern = "\u2460-\u2468\u2776-\u277E"   If WorksheetFunction.CountA(rng) = 0 Then Exit Function   With CreateObject("VBScript.RegExp")     .Global = False     .Pattern = ".*[" & mPattern & "].*"     For Each c In rng       For k = 1 To Len(c.Value)         s = Mid$(c.Value, k, 1)         If .Test(s) Then           Set Matches = .Execute(s)           n = AscW(Matches(0).Value)           If n > 10 ^ 4 Then n = n - 10101           If n > 9 * 10 ^ 3 Then n = n - 9311           On Error Resume Next           ret = Application.Match(CStr(n), buf, 0)           On Error GoTo 0           If IsError(ret) Or IsEmpty(ret) Then             ReDim Preserve buf(i)             buf(i) = CStr(n)             i = i + 1           Else             ReDim Preserve dbuf(j)             dbuf(j) = CStr(n)             j = j + 1           End If         End If       Next k     Next c     'MissingList     j = 0     For i = 1 To 9       ret = Application.Match(CStr(i), buf, 0)       If Not IsNumeric(ret) Or IsEmpty(ret) Then         ReDim Preserve misbuf(j)         misbuf(j) = CStr(i)         j = j + 1       End If     Next i     'DoublingList     On Error Resume Next     ret = Empty     ret = LBound(dbuf)     On Error GoTo 0     j = 0     If Not IsEmpty(ret) Then       For Each v In dbuf         ret = Empty         On Error Resume Next         ret = Application.Match(CStr(v), dbbuf, 0)         On Error GoTo 0         If IsError(ret) Or IsEmpty(ret) Then           ReDim Preserve dbbuf(j)           dbbuf(j) = CStr(v)           j = j + 1         End If       Next v     End If     List1 = Join(misbuf, ",")     List2 = Join(dbbuf, ",")     If opt <> 0 Then opt = 1     CheckDoubles = Array(List1, List2)(opt)   End With End Function

fdjsiimga
質問者

お礼

何度もありがとうございます。 色々試させてもらいましたが私では使いこなせませんでした。(ヘルプなど確認しましたがRng 、Opt など検索できませんでした) (関数の挿入→CheckDoubles→ Rng と Opt 共にS41を指定してみたりしましたが駄目でした) 折角、素晴らしいものを提供してもらいましたが申し訳ありません。  最初に教えていただい方法ならわかりますので使っていきたいと思っています。そこでお願いがあるのですが、1~8など 9個なかった時(重複なし時)に、重複なし という表示のみで 不足している数が出ないことに気づきました。 お時間がある時かまいませんので、修正可能ならして頂けると助かります。

全文を見る
すると、全ての回答が全文表示されます。
  • _Kyle
  • ベストアンサー率78% (109/139)
回答No.3

・複数の丸付数字が単一のセルに入っている ・数字は1~9までに限る ・黒丸付数字と白丸付数字は判定上区別しない という解釈であってますか? ------------------------------ 作業セルを使えば、数式でもなんとかなります。 以下、投稿の都合上、 ・白丸数字の1~9を、あいうえおかきくけ ・黒丸数字の1~9を、アイウエオカキクケ で代用して表記します。 ------------------------------ ●変換(作業セル)  対象セルがA1であるとして、  =TEXT(SUMPRODUCT(10^(INT(FIND(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1),"†あアいイうウえエおオかカきキくクけケ")/2)-1)),REPT("0",9))  とすると、9文字の数字列が表示されます。  下第N桁の数字は、丸付数字Nの個数を表します。  111111211 ⇒ 下第3桁が2 ⇒ 3が重複  111011111 ⇒ 下第6桁が0 ⇒ 6が欠落 ------------------------------ ●重複チェック  作業セルがB1であるとして、  =IF(MAX(INDEX(--MID(B1,ROW(INDIRECT("1:9")),1),))>1,"#重複!!","OK!")  とすれば、重複がある場合に、"#重複!!" と表示されます。  ------------------------------ ●欠落チェック  作業セルがB1であるとして、  =IF(ISERR(FIND("0",B1)),"OK!","#欠落!!")  とすれば、欠落がある場合に、"#欠落!!" と表示されます。 ------------------------------ なお、  (6)(6)(6)(6)(6)(6)(6)(6)(6)(6) のように、 【変換した数字列の桁が繰り上がってしまうほど】 多くの重複がある場合には 正しい結果が得られない可能性があります、念のため。 以上ご参考まで。

fdjsiimga
質問者

お礼

 ありがとうございます。 解釈はそのとおりです。 只、質問の仕方が悪く実際にはスペースがあります。最初にスペースが必ずきまして途中にも2~4個、」合計3個~5個入ってきます 例) スあいスうえオカきスくケ ス=全角スペース (質問時にスペースあけてたつもりでしたが、前詰めされて表示されていました) スペースなし状態ではバッチリでした。 それにしても数式のみでこんな表現ができるとは本当に凄いですね。私からすれば神の領域です。

全文を見る
すると、全ての回答が全文表示されます。
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

#1の回答者です。 もともとは、ユーザー関数を想定したものですが、#1の回答で書いたとおり、ご質問の内容では、読み取れません。ただ、丸付き数字のダブりや不足を検出できるというところまでしか組み込ませんでした。 求めるものが、実際に具体的にはどういうものかも分かりません。単に、True, False だけでは足りそうもないようですし、かといって、あまり複雑なものでは、ユーザー定義関数で出力するのも難しくなります。 ですから、#1のマクロをモジュールに貼り付けたところで、コードをある程度分からない状態では、まったく動きません。 >S41(S41:AI47)のセルに下記のような丸文字があります。 >このS41のセル内の重複チェックしたい。(AK41 辺りに重複 の表示) データが、S41:AI47までとしても、S41のセル内? AK41辺りに重複の表示?という表現では、一体にどこにどう出すのか、どのように理解していいのか、理解できません。 シートモジュール?すみませんが、良く分かりません。シートモジュールというのは、イベント・ドリブン型にするという意味でしょうか?シートモジュールでは、それ以外の使い道は、よほどの初心者でなければ、そこを使うことはありません。 なお、 Test1 の Set rng = Range("A1:K1") に範囲を入れると、ユーザー定義関数に渡されます。

fdjsiimga
質問者

お礼

 ありがとうございます。 説明不足ですみません。   マクロは少し触れた程度の初心者です。標準モジュール=都度マクロ実行をしなければならないものだと思ってまして、シートモジュールならなにもしなくても実行させるのかと思ってました。 質問内容は 3番目の回答者様が書いてくれていました内容 ・複数の丸付数字が単一のセルに入っている ・数字は1~9までに限る ・黒丸付数字と白丸付数字は判定上区別しない 後、S41:AI47は 結合してありS41になっているという意味でした。 素人の考えで AK41に重複などのエラーがありましたら表示できればと思っていました。 フォームボタンを作って都度実行してやってみます。 それにしても、皆さん頭が下がります。素晴らしいの一言です。 ありがとうございました。  

全文を見る
すると、全ての回答が全文表示されます。
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

こんばんは。 ご質問は読み取れませんでしたが、重複のチェックは可能です。 '------------------------------------------- '標準モジュール '------------------------------------------- Sub Test1()   Dim i As Long   Dim j As Long   Dim msg As String   Dim msg2 As String   Dim rng As Range   Dim ret As Variant   Dim n As Variant   Dim List1 As Variant   Dim List2 As Variant      Set rng = Range("A1:K1")      ret = CheckDouble(rng, List1, List2)   On Error Resume Next   'ダミー   If List1(0) = 0 Then GoTo EndLine   On Error GoTo 0   For i = 1 To 9     n = Application.Match(i, List1, 0)     If IsError(n) Then       msg = msg & "," & i     End If   Next i   If ret = True Then     For j = 0 To UBound(List2)       msg2 = msg2 & "/" & List2(j)     Next j   End If   If msg = "" Then     msg = "1~9まであります。"   Else     msg = "足りない数字 " & Mid$(msg, 2)   End If   If msg2 = "" Then     msg = "重複はありません。"   Else     msg2 = "重複している数字 " & Mid$(msg2, 2)   End If   MsgBox msg & vbCrLf & msg2 EndLine:   Set rng = Nothing End Sub Function CheckDouble(ByVal rng As Range, ByRef List1 As Variant, ByRef List2 As Variant)   Dim buf() As Long   Dim dbuf() As Long   Dim n As Variant   Dim s As String   Dim i As Long   Dim j As Long   Dim k As Long   Dim c As Variant   Dim ret As Variant   Dim Matches As Object   Dim Match As Object   Dim flg As Boolean   Dim mPattern As String   flg = False   mPattern = "\u2460-\u2468\u2776-\u277E"   With CreateObject("VBScript.RegExp")     .Global = False     .Pattern = ".*[" & mPattern & "].*"     For Each c In rng       For k = 1 To Len(c.Value)       s = Mid$(c.Value, k, 1)       If .Test(s) Then         Set Matches = .Execute(s)           n = AscW(Matches(0).Value)           If n > 10 ^ 4 Then n = n - 10101           If n > 9 * 10 ^ 3 Then n = n - 9311           On Error Resume Next           ret = Application.Match(n, buf, 0)           On Error GoTo 0           If IsError(ret) Or IsEmpty(ret) Then             ReDim Preserve buf(i)             buf(i) = n             i = i + 1           Else             ReDim Preserve dbuf(j)             dbuf(j) = n             j = j + 1             flg = True           End If       End If       Next k     Next c     List1 = buf     List2 = dbuf     CheckDouble = flg   End With End Function '-------------------------------------------

fdjsiimga
質問者

お礼

 ありがとうございます。 色々試していますが、マクロ実行しても何も反応ありません。 どこのセルに値を入れたらよいのでしょうか? できましたら、マクロ実行をしなくても自動で実行されるものがよいのですがよろしくお願いします。(シートモジュールになるのでしょうか?)

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 同列にある重複文字列のチェック方法

    Googleスプレッドシート上で同列にある文字列の重複をチェックする方法として、隣のセル(B列)に「=COUNTIF(A$2:A$999;A4)>1」と書く方法を使っています。この方法を使うとA列に重複した文字列を入力すると、重複した文字列横のB列にTRUEと表示されます。 しかしこのやり方だとA列に文字列を入力後、B列もエクセルで言うオートフィルみたいなことをしなければならず面倒なので、スクリプトで重複チェックできないものかと考えています。 ですがJavaScriptは初心者なので書き方が分からず苦戦中です。どなたか、手がかりとなるスクリプトやヒントをご教示いただけませんでしょうか。

  • 重複チェックである値はチェックしない方法

    エクセルの重複データを以下関数でチェックしています。 =IF(COUNTIF(A:A,A2)>1,”重複”,””) 例えばA列に○が複数入力されていた場合、○も重複としてみなされます。 これをカウントしないためには、どうすればいいかわかりますか? 複数条件で○を省くことができれば可能ですか?

  • 【エクセル】データの重複チェック

    次のようなデータが入力されているとします。 A列/B列/C列/D列/E列/F列 1行:都道府県/市区町村/data1/check1/data2/check2 2行:東京/新宿/1/""/1/"" 3行:東京/新宿/2/""/2/"重複" 4行:東京/新宿/3/""/3/"" 5行:東京/渋谷/1/重複/4/"" 6行:東京/渋谷/2/""/5/"" 7行:東京/渋谷/3/""/6/"" 8行:東京/渋谷/4/""/2/"重複" 9行:東京/渋谷/1/重複/7/"" ここで、check1は、 「都道府県」のグループでdata1に重複があれば、「重複」表示をさせます。 また、check2は、 「市区町村」のグループでdata2に重複があれば、「重複」表示をさせます。 例えば、 セルD2=IF(COUNTIF($C$2:$C$4,$C$2:$C$4)>1,"重複","") セルF2=IF(COUNTIF($E$2:$E$9,$E$2:$E$9)>1,"重複","") というように関数を入力して、2行目以下にコピペすればいいのですが、 実際は1万行以上のデータがあり、「都道府県」「市区町村」も多くのグループがあるため いちいち範囲を指定するのも大変です。 そこで、上記関数のように手動で範囲を指定しなくても、 自動で範囲指定をして重複チェックができる良い方法があれば教えてください。 できれば関数がいいのですが、VBAでも構いません。 ご教授のほど、よろしくお願いします。

  • excelの重複について

    顧客情報を管理しています。 A列~住所 B列~名前 C列~空白(必要に応じ○を入力) D列~空白or重複 (1)、順に入力し同じ住所と名前の重複があればセルに色が付く方法ってありますか? 住所のみ一致や名前のみ一致の時は色は付けません。 (2)、さらに上記の条件で同じ住所と名前があればセルに色を付けC列のセルに○が入力されA列B列C列すべてが重複したらD列に「重複」を表示できますか? 条件付き書式や関数等の組み合わせいいですが、初心者なのでマクロは使用できません。 また抽出したりする工程は不要です。 よろしくお願いします。 例 A列 : B列 : C列 : D列 住所 : 名前:チェック: 1 : 1条東1丁目 : 田中: ○ 2 : 2条東2丁目 : 鈴木: ○--------------2条東2丁目の鈴木は2つあるので色を付ける。 3 : 3条東3丁目 : 竹田: ○--------------3条東3丁目の竹田は2つあるので色を付ける。 4 : 1条東1丁目 : 小林: 5 : 2条東2丁目 : 鈴木 : ○ 重複-----2条東2丁目の鈴木に○が2つ付いたので「重複」と表示 6 : 3条東3丁目 : 竹田-----------------3条東3丁目の竹田は2つあるので色を付ける。

  • エクセル関数で重複チェック

    エクセル2010です。 ワークシートのB10:B17の範囲に数値(1から200くらいの自然数)が入力されます。 この範囲が空白になることはありません。 この範囲内での重複(同じ数値の入力)をチェックしたいのです。 ただし、1は何個あろうが重複に含めません。 となりの列あたりを作業列にして、COUNTIFでもできますが、1個のセルで完結させたいと思います。 まず、1を超える数値の個数を取得し、そこから1を除く数の種類の数を引いて0になれば重複はないのではないかと思い、下記の数式を書いてみました。これでTRUEなら重複はないと思いますが、もっと簡単な方法があるのではないかと質問いたしました。 よろしく願いします。 =COUNTIF(B10:B17,">1")-(SUMPRODUCT(1/COUNTIF(B10:B17,B10:B17))-(COUNTIF(B10:B17,"=1")>0))=0

  • エクセルで入力文字のチェック

    エクセルのセルに入力された値がUnicodeで****から****までの範囲内のみの文字で記述されているかのチェックをしたいのですが、 例:B3には電話番号を入力したいので半角数字と()のみで構成されているかをチェックする。 VBAでどのように記述すればよいのでしょうか? もう一つ、 セルB3に文字を入力し終えた時または、B3にあるカーソルを他のセルに動かした時に VBAが走る…と言う記述方法はあるのでしょうか? ボタンを用意し、入力後[CHECK]を押すとVBAが動くと言うのは出来るのですが… 以上よろしくお願いいたします。

  • エクセルVBAで複数条件とデーターの重複チェック

    ユーザーフォーム(UserForm1)からSheets("データー")に転記しています 今現在はUserForm1のデーターを入力後「CommandButton2」でシートに書き込みしていますが、重複データーが出て来るので、「CommandButton2」を押した時に重複を防ぎたいのです データーはSheets("データー")の最終行に次々と転記していってます Sheets("データー")に見出し行あり Dim RowNum As Long '最終行 その中で[Me.textbox1]&[Me.textbox3]は必須項目したい .Cells(RowNum, 3).Value = Me.textbox1.Value  'メイン:必須項目 .Cells(RowNum, 4).Value = Me.textbox2.Value  'サブキー:空白でもOK .Cells(RowNum, 5).Value = Me.textbox3.Value  'キー:必須項目 やりたいこと ユーザーフォーム(UserForm1)のテキストボックス入力完了後「CommandButton2」でシートに書き込み時に重複チェック 【UserForm1上の空白チェック】 (1)Me.textbox1&Me.textbox2&Me.textbox3の空白チェック 条件 Me.textbox2は空白でもOK (2)Me.textbox1が空白の場合UserForm1に入力したデーターを保持したままtextbox1をフォーカスする(できれば背景色と文字色を変える。入力後背景色と文字色は元に戻す) (3)Me.textbox3が空白の場合UserForm1に入力したデーターを保持したままtextbox3をフォーカスする(できれば背景色と文字色を変える。入力後背景色と文字色は元に戻す) (4)Me.textbox2が空白の時はメッセージを表示「空白のままでいいですか?はい・いいえ」 (5)はいの時は処理を続行 (6)いいえの場合は場合UserForm1に入力したデーターを保持したままtextbox2をフォーカスする(できれば背景色と文字色を変える。入力後背景色と文字色は元に戻す) 【データーシートとの重複チェック】 (7)textbox3&Sheets("データー")の該当全セル列の重複チェック 条件1 textbox2が空白の時 Me.textbox1&&Me.textbox3とSheets("データー")メイン&キー該当全セル列との重複チェック (8)重複の場合はメッセージを表示「キーが重複しています!修正して下さい」OKボタンのみ (9)OKが押されるとUserForm1に入力したデーターを保持したままtextbox3をフォーカスする(できれば背景色と文字色を変える。入力後背景色と文字色は元に戻す) 条件2 textbox2にデーターがある場合Sheets("データー")のサブキー&キー該当全セル列との重複チェック (10)重複の場合はメッセージを表示「キーが重複しています!修正して下さい」OKボタンのみ (11)OKが押されるとUserForm1に入力したデーターを保持したままtextbox3をフォーカスする(できれば背景色と文字色を変える。入力後背景色と文字色は元に戻す) (12)重複が全てなくなったらSheets("データー")の最終行に書き込み (13)UserForm1をブランク状態で表示 以上よろしくお願い致します

  • DataGridViewの特定列に入力されている重複チェックをしたい

    VisualBasic2005です。 例えばDataGridViewの3列目にコードが入力されるとします。 その列のコードには重複入力をさせたくないのです。 重複チェックをするのは、そのセルの入力が確定したときでも、 特定のボタンが押されたときでもかまわないので、 チェックする方法はないでしょうか? よろしくお願いいたします。

  • 文字列を指定して重複チェックするには?

    どなたかおしえてください。 データベースで重複データのチェックを行う場合に、 下記の関数を使用しています。↓ =IF(COUNTIF($A$2:$A$10,A2)>1,"◎","") で、この抽出条件に、A2のセルの左から3文字までに合致すれば ◎と、条件指定したいのですが、 どのようにすればよいのでしょうか?

  • excel、重複があるかを調べたい

    関数初心者です。質問させて下さい。 excelでsheet1のAセルに文字列を入力しました。 このsheet1内はsortしフィルターをかけたので重複はありません。 1000行程の語句ですが、このsheet1内の語句を別sheetや別のexcelファイルで重複がないかを 調べたいのですが、良い方法が分かりません。 教えていただけますでしょうか。 宜しくお願いします。

専門家に質問してみよう