• ベストアンサー

EXCEL VBA マクロがうまく動作しません

いつもお世話になっております。 EXCELのマクロについて教えてください。 シートに 男 ・男・ 女・ ・・男 ・男・・ ・女 上記のように1つのセルに「・男」「女」 など文字だけでなく「・」がバラバラに入った データが列方向に400件あります 次の列に、「男」「女」だけの文字だけを抜き取りたいので、下のようなマクロを組みました。 Sub 性別取り出し() Range("a2").Select Do Until retu = 2 retu = ActiveCell.Column Cells.Find(What:="男", After:=ActiveCell,     LookIn:=xlFormulas, LookAt:= _ xlPart, SearchOrder:=xlByColumns,   SearchDirection:=xlNext, MatchCase:=False _ , MatchByte:=False,   SearchFormat:=False).Activate Cells.FindNext(After:=ActiveCell).Activate ActiveCell.Offset(0, 2).Activate ActiveCell.Value = "男" ActiveCell.End(xlToLeft).Activate Loop MsgBox counter & "回ループしました" End Sub   A列  B列 男   |男 ・男・ |男 女・  | ・・男 |男  ・男・・|男 ・女  | というような結果を期待したのですが 実際は   A列  B列 男   |男  | 男 ・男・ |   |   女・  |   | ・・男 |男  | 男  ・男・・|   | ・女  |   | のように、B列の結果が飛び飛びになったり C列以降に男の文字が入ったり 永遠にループを続けたりします。 いろいろ試しましたが、うまくいきません どうしたら良いか教えてください。 よろしくお願いします。 ちなみにデータの「・」はALT+ENTERの改行マークか何らかのスペースの跡らしく、検索や置換では引っかかりません。

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.6

>問題は「・・」です。 まずは、そのゴミがなにであるか調べましょう。 列を挿入して、作業列を作り A,B,C データ(A1),=MID($A$1,ROW(),1),=CODE(MID($A$1,ROW(),1)) のようにして、B,Cを下にコピーすると それぞれの文字がBに、その文字のコードがCに表示されます。 例えば、ALT+ENTERで改行されている場合 コードとして 10 が表示されます。(文字としては表示されません) 件のデータのコードがわかれば =SUBSTITUTE(A1,CHAR(10),"") のようにして、件のデータ(この例の場合は、コード10)を取り除くことができます。 文字の区切りのマークとして残しておきたい場合は =SUBSTITUTE(A1,CHAR(10),"<BR>") などとすればいいでしょう。

mskhas
質問者

お礼

ありがとうございました。コードとして13が表示されましたので、SUBSTITUTE関数を使って取り除くことができました。 助かりました。本当にありがとうございました。

その他の回答 (5)

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

こんにちは。 Findメソッドは、決まったアルゴリズムを使います。それ以外の方法ではうまくいかないことが多いです。一応、"女"の文字は、男の隣のセルに出すようにしました。 いっしょのセルなら、サブルーチンの中の  .Offset(, i + 1).Value は、  .Offset(, 1).Value にしてください。 '------------------------------------------- Sub PickUpAtCells()   Dim c As Range   Dim myFadd As String   Dim rng As Range   Dim i As Integer   Dim Genders(1) As String   Genders(0) = "男"   Genders(1) = "女"   Set rng = ActiveSheet.Columns(1)   Application.ScreenUpdating = False   For i = 0 To 1    Set c = rng.Find( _     What:="*" & Genders(i) & "*", _     LookIn:=xlValues, _     LookAt:=xlPart, _     SearchOrder:=xlByColumns, _     SearchDirection:=xlNext)    If Not c Is Nothing Then      myFadd = c.Address      Do       s_PickupCells c, Genders(i), i 'サブルーチンへ       Set c = rng.FindNext(c)      Loop Until c Is Nothing Or c.Address = myFadd    End If   Next i   Application.ScreenUpdating = True End Sub Sub s_PickupCells(myRng As Range, SearchWord As String, i As Integer) 'サブルーチン Dim number As Integer  number = InStr(myRng, SearchWord)  If number > 0 Then   myRng.Offset(, i + 1).Value = Mid$(myRng.Value, number, 1)  End If End Sub '-------------------------------------------

回答No.4

例えば、B1に=MID(A1,IF(ISERROR(FIND("男",A1)),0,FIND("男",A1))+IF(ISERROR(FIND("女",A1)),0,FIND("女",A1)),1) としてはいかがでしょう。ただし、1つのセルに男or女が2文字以上あるとだめですが・・・ 男だけ表示するのなら =MID(A1,IF(ISERROR(FIND("男",A1)),0,FIND("男",A1)),1) でいけると思います。

回答No.3

もっと簡単にできました。 =IF(ISNA(MATCH("*男*",A1,0)),"女","男")

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

原因は、 >Cells.Find で、検索する範囲をA列に限定していないのが1つの原因だと思います。 マクロによらないでも、単にB列に =IF(COUNTIF(A1,"*男*"),"男",IF(COUNTIF(A1,"*女*"),"女","")) とするだけでいいと思います。

mskhas
質問者

補足

ありがとうございました。うまく動作しました。 実はこの後にもデータを抜き出さなくてはいけない作業が山済みになっています。 それは、B2セルには    「指導内容は○○/△△・・・・対象は○○」     B3セルには    「指導内容は△△/◇◇/○○・・対象は△△」 というような情報から 「指導内容は○○/△△」のみや 「対象は△△」を取り出すのですが MIDやFIND関数で取り出すことはできると考えています。 問題は「・・」です。 先ほども記述しましたが、「・・」は文字でなく 改行かスペースの跡らしく検索や置換ができません。 セルによってその数もばらばらなので 「指導内容は○○/△△・・・・」 「指導内容は○○/△△・・」 と「・・」が残ってしまいます。 どうすればよいのでしょうか。 ぜひよろしくお願いします

回答No.1

Cell関数ではダメですか? Cell B1に以下の関数を入力してください。 =IF(ISNA(VLOOKUP("*男*",A1,1,FALSE)),IF(ISNA(VLOOKUP("*女*",A1,1,FALSE)),"?","女"),"男") で、Cell B1を選択し、A列の最後のデータの行まで、ずずーっとドラッグ(要するにコピーですね)。 すると、B列に「男」「女」、どちらもなければ「?」が表示されると思います。 註:「ツール」-> 「アドイン」メニューで、「分析ツール」を選択しておいてください。

関連するQ&A

  • 文字検索マクロで質問です。

    文字検索マクロで質問です。 下記のマクロを作成したのですが、A1に検索する文字を入力してA列(A5:11700)のみを検索して該当が有ったらそのセルを色を付けし、又,該当が無ければMSG BOXで”該当なし”と表示するマクロを御教授頂けますか。 Cells.Find(What:=Range("A1").Value, After:=ActiveCell, LookIn:=xlFormulas,   LookAt:= _ xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _ , MatchByte:=False, SearchFormat:=False).Activate End Sub 以上、宜しくお願い致します。

  • EXCEL マクロでの検索をお教えください

     下記のようなマクロを使いたいのですがこの場合×があるときは良いのですが、  無いときエラーが出ます。どの様にすれば良いのかお教えください。  無いときエラーは オブジェクト変数または With ブロック変数が設定されていません。  となります。 Sub 検索()    Range("K12:K70").Select    Cells.Find(What:="×", After:=ActiveCell, LookIn:= _    xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _    xlNext, MatchCase:=False, MatchByte:=False, SearchFormat:=False).Activate End Sub

  • エクセル 特定文字列のある列の削除と保存

    こんにちは いつもお世話になっています。 エクセル2010です 1行目に文字列が入力されています。 (1)1行目に特定文字列を含む列を削除するマクロ。 (2)1行目に特定文字列を含む列だけを残して、他はすべて削除するマクロ を教えてください。 2つ質問するのが不適当ならどちらか一方でも構いません。 指定したい文字列は複数ありますので「文字列A、文字列B、・・・」等で追記できる形だと助かります。フォーマットが決まっているので指定文字列を頻繁に変えることはありません。 特定行を削除するマクロはネット上でヒットしたんですが、列は見つかりませんでした。 マクロ記録で、文字列検索、列削除をしましたが、連携のさせ方がわかりません。 よろしくお願いします。 Sub Macro1() ' ' Macro1 Macro ' ' Rows("1:1").Select Selection.Find(What:="あ", After:=ActiveCell, LookIn:=xlFormulas, LookAt _ :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _ False, MatchByte:=False, SearchFormat:=False).Activate Selection.FindNext(After:=ActiveCell).Activate Columns("A:A").Select Selection.Delete Shift:=xlToLeft End Sub

  • VBAでのエラー対処について

    現在仕事でVBAと悪戦苦闘しています。 下記のマクロを実行すると、実行時エラー'13':型が一致しません。 と表示されます。 初心者で対処法がわかりません。 よろしくお願いします。 Sub Macro1() dat = InputBox("検索値") Range("A1").Activate Cells.Find(What:=dat, After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _ xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _ , MatchByte:=False, SearchFormat:=False).Activate gegyo = ActiveCell Do Cells.FindNext(After:=ActiveCell).Activate If dat = ActiveCell Then If gegyo = ActiveCell.Row Then End Rows(ActiveCell.Row - 1 & ":" & ActiveCell.Row - 1).Delete Shift:=xlUp Range("A" & ActiveCell.Row - 1).Activate Rows(ActiveCell.Row + 1 & ":" & ActiveCell.Row + 1).Delete Shift:=xlUp Rows(ActiveCell.Row & ":" & ActiveCell.Row).Delete Shift:=xlUp End If gegyo = ActiveCell.Row Loop End Sub

  • EXCEL VBAでの 文字列検索

    セル内の文字列を部分一致で検索したいのですが、 下記の構文だと、検索対象シートを選択しなくてはならないため、 PGの動きが堅くなってしまいます。何かいい方法をご存知の方、 教えてください。 Selection.Find(What:=key, After:=ActiveCell, LookIn:=xlFormulas, LookAt _ :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _ False, MatchByte:=False).Activate Cells.FindNext(After:=ActiveCell).Activate

  • エクセル2007のマクロ不具合について、

    次のようなマクロを「CTRL+T」のショートカットキーで作成しましたが、2回続けて実行すると2回目が違う結果となってしまいます。 1回目はちゃんと 2010/1/2 のセルがアクティブセルとなるのですが、2回目は 2010/11/2 がアクティブセルとなってしまいます。  原因と対処法があればぜひ教えていただきたいと思います。よろしくお願いします。 Sub 本日() Cells.Find(What:=Date, After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, MatchByte:=False, SearchFormat:=False).Activate End Sub

  • エクセルVBAで検索

    エクセルのVBAで文字の検索をしたいと思います エクセルは2000です エクセルのマクロの記録機能を利用して 下記のようなマクロを作成しましたが これでは、別のシートの文字が検索できません 同一ブックの別のシートも検索できるようにするには どうしたら良いでしょうか、よろしくお願いします 以下同一シートしか検索しない例 Sub Macro1() Dim 検索文字 As String 検索文字 = InputBox("検索文字を入力してください") Cells.Find(What:=検索文字, After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _ xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False) _ .Activate End Sub

  • エクセルのマクロの質問です。

    エクセルのマクロの質問です。 こんにちわ。エクセルのマクロを始めて間もないものです。 下記ようなマクロを組みましたが「Windows("B.xls").Activate」(※の部分)でとまってしまいます。 なぜかもわからず困っています。 Workbooks.Open Filename:="B.xls" For i = 1 To 1000 Step 1 Range(Cells(i, 1), Cells(i, 5)).Select Selection.Copy Windows("A.xls").Activate Cells(Cells(Rows.Count, 1).End(xlUp).Row + 1, 1).Select ActiveSheet.Paste ※ Windows("B.xls").Activate Next i 一応、動作としては Bのマクロを開く→ループ始点(1000回繰り返す) 一回目⇒A1~B5をコピー→Aのエクセルを開く→A列のセル1行目に貼り付ける→Bのエクセルを開く 二回目⇒A2~B5をコピー→Aのエクセルを開く→A列のセル2行目に貼り付ける→Bのエクセルを開く . . . ループ終点 こんな感じで作成しましたが、どうしても上手く動かないで困っています。 無駄な動作が多いかもしれませんが、ぜひアドバイスをお願いします。 また、もっと簡単な動作ができるのであればそちらもお願いします。

  • エクセルマクロ教えて下さい。

    業務の中でエクセルマクロによる効率化が望めそうなので見様見真似でマクロを作ってみました。 動作は思った通り行くのですが検索が上手くいきません。 どなたかご教示お願い致します。 以下コード Dim Ran As String Dim Hn As String Dim i As Long i = 0 Do While i < 300 Ran = 1+i Hn = Range("K" + (Ran)) Cells.Find(What:=(Hn), After:=ActiveCell, LookIn:=xlFormulas, LookAt _ :=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:= _ False, MatchByte:=False, SearchFormat:=False).Activate ActiveCell.Offset(0, -7).Activate Range("G" + (Ran), "K" + (Ran)).Cut ActiveCell i = i + 1 Loop End Sub 上記コードのFIND文で検索をした際にセルの値が100やB50等は正常に見つかるのですが 100Aや100E等数値の後に英語がくるとFindの検索にひっかかりません。 改善しようと努力してみたもののわかりませんでした。 添削やアドバイス、改善方法を教えて下さい。

  • エクセル マクロ range

    rangeの使い方が分かりません. 特にグラフの範囲指定の方法で・・・ 1..  r1=range("cells(28,RETU1)")  ? RETU1、RETU2は、inputboxで指定したい。 2. r2=range("cells(28,RETU1),cells(295,RETU2") ? 3. range("a28,a295","cells(28,RETU1),cells(295,RETU2").select ? 離れた範囲2つを一つの範囲にしたグラフを書きたい。 4.  inputboxで列名を記入するとき、数字でないといけないのか、アルファベットでもいいのですか? 5. range("cells(28,RETU1)").activate ? 以上を別法で以下のようにしたら? 6.  Dim r1 As RANGE ・・・となって、Rangeになりません。   このあと、例えば、 r1.select とかr1.activateでいいですか? 7. set R1=range("cells(28,RETU1),cells(250,RETU2") set R2=range(a28,a250) unite (R1,R2) ?

専門家に質問してみよう