• ベストアンサー

エクセルのマクロの作成について

エクセルのマクロの作成について教えてください!! 一つのセルの中に3行の文字があるとして・・・・ そのセルの2行目と3行目を隣のセルにうつしたいです。 例えば・・ E列の1行目のセルに あいうえお かきくけこ さしすせそ と文字が入っていて、 それを F列の1行目のセルに かきくけこ さしすせそ のみ移動させたいです。 1行~300行ほどあって、さらにデータは増え続けます、手作業での移行が困難になってきました。 そもそも一つのセルの中身の文字の一部を違うところに移動させるマクロは組めるのでしょうか。 当方初心者です。お手柔らかにお願いします。

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

  • ベストアンサー
  • yy_kd
  • ベストアンサー率25% (5/20)
回答No.1

1行目のE列から連続でデータが入っているとして Sub Macro1() y = 1 ' 最初の行です While Cells(y, "E") > "" TXT = Cells(y, "E") If InStr(TXT, vbLf) > 0 Then p = InStr(TXT, vbLf) NT = Left(TXT, p - 1) NT2 = Right(TXT, Len(TXT) - p) Cells(y, "E") = NT Cells(y, "F") = NT2 End If y = y + 1 Wend End Sub セルのデータを読み込んで、改行の有り無をチェックして 改行マークがあったら、改行マークより前を元のセルに 書き戻して改行マークから後ろはF列に書き込み もし、途中で空白がある場合にはそこで終わってしますので For y=1 to ・・・ TXT=・・  if ・・   ・   ・ end if next にする必要がありますね・・

annokonoko
質問者

お礼

試行錯誤した結果無事に移動させることができました。私の文字入力ミスでした。 ありがとうございます!! 他にも移動させたい文字があり、教えていただいたのを元にアレンジしてみましたが、失敗しました。 それは、 同じセルの中の「【」以降の文字を先ほどと同じく隣のセルにうつしたいです。 例えば・・・ ●G列の1行目に あいうえお かきくけこ 【さしすせそ】 ●G列の2行目に なにぬねの 【たちつてと】 とあった場合に、 それらをH列の1行目に 【さしすせそ】 H列の2行目には、 【たちつてと】 と「【」以降の文字が移動するように作成したいです。 見よう見まねで以下のように文字の中身を変えましたが、 これだと、 「【」よりあとの文字が移動しました。 さしすせそ】 たちつてと】 のみの移動ということです。また、元データにも移動した言葉が残ったままでした。もしお時間あるのでしたら、引き続きご教授お願いします。 Sub 文字の移動2() y = 12 ' While Cells(y, "G") > "" TXT = Cells(y, "G") If InStr(TXT, "【") > 0 Then p = InStr(TXT, "【") NT = Left(TXT, p - 1) NT2 = Right(TXT, Len(TXT) - p) Cells(y, "H") = NT Cells(y, "H") = NT2 End If y = y + 1 Wend End Sub

annokonoko
質問者

補足

ご回答ありがとうございます!! 作成していただいたコードを入力しましたが・・・ コンパイルエラー プロシージャの外では無効です となってしまいました・・・ 引き続き試行錯誤してみます!!

その他の回答 (5)

  • layy
  • ベストアンサー率23% (292/1222)
回答No.6

http://www.asahi-net.or.jp/~zn3y-ngi/index.html http://www.asahi-net.or.jp/~ef2o-inue/menu/menu01.html http://www.voicechatjapan.com/excelvba/VBArei2.htm 参考。 わからないことをいきなりコーディングするのは無理があるでしょう。 コードを見せられて、そのあとどうするかで差が出ます。 そのままで良かった良かったとなるか、 命令の意味まで見ておくか。 同じものになるかもしれないが1から自分で作ってみるか。 例えば、 文字列の中の「【」を見つけたい。→INSTR関数を使う。 INSTR関数を使えばいいんだ、というのはサンプルコードもらえばわかるでしょうが、 どうやってINSTR関数を見つけるの?、はわからないままで、 要件を実現できたとしても、悩みは残ってしまうこともあります。 そこに差が出ます。 わかったようでわかってない錯覚が生まれてまた掲示板に頼ります。 INSTR関数というのがわかってしまえば使い方などは探せばみつかります。 繰り返しを意味するものは・・・、 セル位置を示すものは・・・、 文字列を操作するものは・・・、 instr関数は・・・、 FOR文は・・・、 offsetは・・・、 双方からの視点があると解決は早いです。 マクロも やり方はいろいろあります、結果同じでも人それぞれ違うと言ってもいいくらい。 このやり方なら自分で自力でできる、というのは強みになります。 がんばりましょう。

annokonoko
質問者

お礼

ご回答ありがとうございます!! おっしゃるとおりです! ひとつひとつのコードについて、使い方を勉強しようと思い、私も四苦八苦しております・・・ 地道に業務効率の為にがんばります! 応援していただきありがとうございました★★ 参考URLも早速お気に入りにいれました。 明日続きの勉強をしようと思います♪

  • yy_kd
  • ベストアンサー率25% (5/20)
回答No.5

annokonoko 様 マクロの作成は仕事で省力化したくて独学で勉強致しました。 最初は、Excelなど無い時代で、NECのPC8000も記録媒体が テープのみの時代からスタートしてます。当時は遊びでしたが・・ カシオの256ステップのプログラム電卓が仕事でソフトを使い 始めた最初でした。PC88のN-Basicから本格的に仕事で 使い始めましたが、いずれも繰り返し作業の効率化を目的に 四苦八苦しながら・・・・ ですから、プログラムコードも結構いい加減で人に見せられる ものではないのですが、現在は汎用的に使えそうな省力化ツールの 開発に没頭してます。

annokonoko
質問者

お礼

再度ご回答ありがとうございます!! 拝見させていただきまして、独学で努力なさってきたのですね★ 私も人に頼ってばかりでなく、せめて作成していただいた構成がわかるまで勉強したいと思います。 URLは油断した隙になくなってました・・・ 削除されてしまったのでしょうか・。残念です。 かなり業務の効率化になりました。 ありがとうございます!!

  • yy_kd
  • ベストアンサー率25% (5/20)
回答No.4

yy_kdです 【以降を隣の列に移動する場合です。 【の前に改行があった場合改行が元のセルに残ってしまうため 元のセルの最後が改行であった場合、それも除去しております。 Sub Macro1() y = 1 While Cells(y, "G") > "" TXT = Cells(y, "G") If InStr(TXT, "【") > 0 Then p = InStr(TXT, "【") Cells(y, "G") = Left(TXT, p - 1) If Right(Cells(y, "G"), 1) = vbLf Then Cells(y, "G") = Left(Cells(y, "G"), Len(Cells(y, "G")) - 1) End If Cells(y, "H") = Right(TXT, Len(TXT) - p + 1) End If y = y + 1 Wend End Sub

annokonoko
質問者

お礼

度々のご回答ありがとうございます!! 無事できました★★ これを解読して自分でも作れるようになりたいです。 ちなみに、お仕事で覚えたのでしょうか?独学でしょうか? 差し支えなければ教えてください。

  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.3

一例です。 Sub sample() Application.ScreenUpdating = False '画面更新なし For i = 1 To Cells(Rows.Count, "E").End(xlUp).Row If InStr(Cells(i, "E"), vbLf) Then '改行コードあり wk = Split(Cells(i, "E"), vbLf) '改行コードで区切る Cells(i, "E").Value = wk(0) '1番目は元のセル wk2 = "" For j = LBound(wk) + 1 To UBound(wk) '2番目以降を移動 wk2 = wk2 & wk(j) & Chr(10) Next Cells(i, "F") = Left(wk2, Len(wk2) - 1) End If Next Application.ScreenUpdating = True '画面更新あり End Sub

annokonoko
質問者

お礼

ご回答ありがとうございます!! 他の回答者様からいただいたコードも含め、こちらも検討し、解読したいと思います★★ コードの意味がまだわからないので、勉強して、応用できるよう頑張ります! みなさんはどこで独学なのでしょうか・・・ 頭が下がります。 (*^。^*)

  • Tom-3
  • ベストアンサー率32% (42/130)
回答No.2

各セルに一行ずつ格納すると考えてよいのでしょうか? その場合下記のようになるかとおもいます。 ただし、Excel2007以前(Excel2003、Excel2000等)は 列数が255までしか存在しません。 ※ たとえば、「セル:A1」300行の格納されている場合は最後の45行は処理不能です。 その点にご留意ください。 Option Explicit Sub Macro1() Dim Str改行コード As String Dim StrCell As String '文字列を一時取得する変数 Dim Int改行位置 As Long 'StrCell内にある改行コードの文字位置を取得する変数 Dim Int文字長 As Long 'StrCellの文字長を取得する変数 Dim IntCellX As Long '現在のセルの列位置を格納する変数 'IntCellX=1の場合、「列:A」 'IntCellX=2の場合、「列:B」 '~~~~~(中略)~~~~~ 'IntCellX=5の場合、「列:E」 Dim IntCellY As Long '現在のセルの行位置を格納する変数 'IntCellY=1の場合、「行:1」 'IntCellY=2の場合、「行:2」 '~~~~~(中略)~~~~~ 'IntCellY=5の場合、「行:5」 '改行コードの文字コードを格納する。 Str改行コード = Chr(10) '最初の位置は「セル:E1」なので IntCellX = 5 IntCellY = 1 '「セル:E1」の値を「一時変数:StrCell」に格納する。 StrCell = Cells(IntCellY, IntCellX).Value '「一時変数:StrCell」に格納されている文字の長さを取得する。 Int文字長 = Len(StrCell) '「一時変数:StrCell」の何文字目に改行コードが存在するかをチェックする。 ' ※ 文字列内に改行コードが存在しない場合は「Int改行位置 =0」となる。 Int改行位置 = InStr(StrCell, Str改行コード) Do Until Int改行位置 = 0 '隣の列のセルに「StrCell」内にある最初の改行コード以降の文字列を格納する。 '※ 「セル:E1」に制御がある場合 '  ・「か~そ」までの文字列を「セル:F1」に格納する。 Cells(IntCellY, IntCellX + 1).Value = Mid(StrCell, Int改行位置 + 1, Int文字長) '現在のセルに「StrCell」内にある最初の改行コード以前の文字列を格納する。 '※ 「セル:E1」に制御がある場合 '  ・「『か』の前にある改行コード」以前の「あ~お」を '   「セル:E1」に格納する。 Cells(IntCellY, IntCellX).Value = Left(StrCell, Int改行位置 - 1) '隣の列のセルに格納した文字列を「一時変数:StrCell」に格納する。 '※ 「セル:E1」に制御がある場合 '  ・「か~そ」までの文字列を「セル:F1」に格納する。 StrCell = Cells(IntCellY, IntCellX + 1).Value '制御を次の列に移す。 '※ 「セル:E1」に制御がある場合、制御を「列:F」に移す IntCellX = IntCellX + 1 '「一時変数:StrCell」の何文字目に改行コードが存在するかをチェックする。 ' ※ 文字列内に改行コードが存在しない場合は「Int改行位置 =0」となる。 Int改行位置 = InStr(StrCell, Chr(10)) Loop End Sub

annokonoko
質問者

お礼

ご回答ありがとうございます。 各セルに一行ずつではなく、ひとつのセルに 「かきくけこ」も「さしすせそ」も入れたいと思いました。 大変ご丁寧にご回答いただきましてありがとうございます。 ただ初心者の私にはかなりコードすぎる内容で、応用できずにいます・・ すみません(T。T)

関連するQ&A