• ベストアンサー

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

エクセルのマクロの作成について教えてください!! 一つのセルの中に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

  • エクセル2003のマクロ作成の件

    同一連続セルにあるグループの中で、D列に「完了」があれば、F列に「4」を入力し、その同一連続セル内で、検索し、D列の対応中を探します。その「対応中」の先頭が、完了にした担当者と同じであれば、「9」を。違えば、「0」を。完了は、同一セル内の最後にきていない事もあります。該当しない時や単一セルの時は、何もせず、空白のままにします。A列には、空白行がなく、3万行ほどあります。特定文字を探し、その1行上を探すなどののマクロはできるのですが、条件が重なると、作成が出来ません。今まで、手動で、数値を入れていたのですが、マクロで作成出来ないものでしょうか?マクロ初心者です。

  • エクセル マクロ 条件に応じてロック

    エクセル2002を使用しています。 1行目のG1に”ロック”という文字列が入っていたら 2行目のG列の1つ前のF列で”A2:F2”まで、セルをロックしたいのですが、 どのようにマクロを書けばいいでしょうか? (”ロック”の文字列は、1行目には1つしか入りません。) できれば、エクセル2000でもマクロが対応できると嬉しいです。

  • エクセルのマクロについて教えてください

    こんな感じのマクロを考えています。 今いるセルの行番号の百の位を行番号とし、 A列のその行番号にある文字列を取得したい場合どのように書けばよいのでしょうか? 例) A2には「あさだ」と書かれています。 A3には「まお」と書かれています。 あるセルの行番号が342の時、百の位である3から、A列の3行目、つまりA3にある「まお」という 文字列を取得して表示させる。 TEXT(QUOTIENT (ROW(),100)&"","@")で上記でいうところの文字列3が取れますが、 ここからどうやってA3として、そのセル番号の中身を取得できるのでしょうか?

  • エクセルのマクロ記述について

    J列、K列に入力されている行まで下記処理を行うマクロの記述を教えてください。 J列のセルの文字列がにSHAPEの場合、その行のB~E列のセルの色を黄色にする。 K列のセルの文字列がにSHAPEの場合、その行のF~I列のセルの色を黄色にする。

  • Excelのマクロ作成について

    電車の時刻表がありまして   A   B    C    D    E    F    G    H    I    J    K    L    M    N 1  2 あ       1054  1425  1555  1725 3 い   0   1059  1430  1600  1730 4 う   5   1104  1235  1435  1505  1605  1735 5 え   7   1105  1237  1437  1507  1607  1737 6 お   9   1108  1239  1439  1509  1608  1739 7 か       1110  1240  1430  1440  1510  1610  1740  1840 8 き 9 く A列は駅の名前、B列の数字は0と入力した駅からそれぞれの駅までの平均的な所要時間でC列以降は時刻です(:は抜いて対応) マクロで作りたいことは、 0と書かれた行の時刻を1セルずつ見ていき、そのセルに色を付けます。 次にB列の最終行の数字の所までそれぞれ足して合致していいるものがあれば色を塗る。 もし途中で合致しないものがあればその瞬間今まで色を塗っていたものを元の状態(色を塗っていたものを全て真っ白)に戻して次のセルを見ていき、最後のセルまで行う。 上の例の場合 (1)まず0と書かれた行の最初のセルC3を見て確認のため色を付けます。 (2)次にC3とB4の時刻を足して合致するものが4行目にあれば色を付けます。このときC4に1104がありますので色を付けます。 (3)今度はC3とB5の時刻を足して合致するものが5行目にあれば色を付けるのですが、このとき5行目には1106はないので、この瞬間、C3とC4に付けた色をデフォルトの状態にし以降のチェックは行わず、D3のチェックに移ります。 (4)次はD3に移り、C列同様、D3とB4~B6の時刻を足したものがそれぞれ4行目、5行目、6行目にあるかチェックします。省きますが、全部あるのでD3、E4、E5、E6に色が付き、E3に移ります。 (5)E3も同様に行います。E3とB4~B5の時刻を足して対応したものがそれぞれ3行目、4行目にあるのですが、E3+B6の時刻が6行目には無いのでE3、G4、G5の塗ったセルをもとに戻し、F3に移動します。 (6)F3に移動し以下同様です。対応するものがあるのでF3、H4、H5、H6に色が付き、0と書かれた行の最終行なので処理が終了します。 ※B列の平均所要時間はいつもB3から入れるわけではなく、ケースバイケースで変わってきます。 一応、この例をマクロを使って無事動いた時の画像も載せておきます といったマクロを作りたいのですが、初心者のため手も足も出ません。 時間もないので、マクロ作成に自信のお有りの方、もしよろしければこれを実装するためのコードを教えて頂けないでしょうか? 丸投げで誠に申し訳ございません。 長文失礼足しました。

  • エクセルのマクロについて質問です。

    あセルを選択すると、その列の行を一番下まで書き出すようにしたいと思っています。 A1セル=ひらがな E2セル以降=書出し B列 ひらがな ←タイトル(B1セル) あいうえお かきくけこ さしすせそ C列 カタカナ←タイトル(C1セル) アイウエオ カキクケコ サシスセソ D列 英文字←タイトル(D1セル) abcd efgh ijkl 縦になっててちょっと見づらいですが、このような場合、A1の“ひらがな”というワードが入っていて、マクロを実行するとその下の行である “あいうえお” “かきくけこ” “さしすせそ” と、E2以降に表示するようにしたいのですが、どのように考えてコードにしたらいいのか分からないので教えていただけないでしょうか。

  • 作成したいマクロがあります。。。

    どなたか教えてください。 マクロで、ある作業を自動化したいです。 【内容】 ある文字列の括弧内のみを取り出したいです。 【パターン1】   列1                  列2           列3    ・・・ 1 A123(D234,E567,・・・) 【パターン2】   列1                  列2           列3    ・・・ 1 B456(G785,H652, 2 C789,i951,j753 3 F963,K852・・・) 上記のように1つのセル内に( )が存在したり、また行をまたいで( )が存在したりします。 ※列は一定です。 その括弧内の文字のみをセルに分けて下記のように表示したいです。  列1                  列2               列3   ・・・ 1 B456(G785,H652,         G785              H652 2 C789,i951,j753           C789              i951        j753 3 F963,K852・・・)           F963             K852 抜き出したい文字列についてですが、1桁から10桁くらいまであります。 たとえば U2,R965482 等 以上です。どなたか教えてください。

  • Excelのマクロで作りたい

    こんにちは。 あるデータベースを使うシステムでエクセルにデータをエクスポートしたら数値を入れている列が文字列として認識してしまいます。 本来文字列が入るところに数値を入れているだけなのですが、エクスポートした時も数値しか入っていないのですが文字列として入っています。 エクセル上では数値しか見えませんノートパッドにペーストすると数値の後ろに「”」があります。しかも改行されていて2行ある状態になっています。 なのでセルの内容を編集(F2)で開いてバックスペース2回押し、Enterで初めて数値として認識されます。 この行為をマクロ化するにはどうすればいいのでしょうか? マイクの記憶で同じ動作をしてもそのセルの場所と中にある数値も一緒に記憶されるのでどこでやっても記憶した数値を貼り付けする事になってしまいます。 これをどの箇所でもマクロを押せばそのセルをF2してバックスペースを2回する様に設定することは可能でしょうか? 判りずらい説明ですがもし判る方が居たらご教授下さい。 宜しくお願いします。

  • エクセルのマクロ(検索)

    お世話になります。 エクセルのマクロで以下の処理をしたいのですがアドバイスください。 Excel2002です。 以下は実際の作業を簡略化したものです。 F列が●●という文字列で、かつE列が空白以外の行を検索した結果、 →対象行がない場合、【対象行はありません】というメッセージボックスを出し、OKをクリックしてマクロを終了させる →ある場合、1行目にオートフィルタを設定し、F列が●●という文字列で、かつE列が空白以外の行を表示させる(オートフィルタの機能で)ここでマクロの動作を一時停止させ、【続行】or【終了】が選択できるメッセージボックスを表示させる。 ここで【終了】をクリックすればマクロを終了させる。 【続行】をクリックすれば、いまオートフィルタで表示されている行のD列を値をすべて-1に変更する。次にオートフィルタを解除し、F列にある●●というセルをすべてクリア(空白)しマクロを終了させる。 アドバイスお願いします。

  • エクセルのマクロ記述について

    下記の処理をエクセルのマクロで行いたいのですが、どのように記述したよいか教えてください。 4行目から入力されている行まで下記の処理をマクロで行う。 1.J列のセル入力がCIRCLEの行で、B~E列の数値が同じセル間を結合する。 2.K列のセル入力がCIRCLEの行で、F~I列の数値が同じセル間を結合する。 3.J列のセル入力がOBLONG_XまたはOBLONG_Yの行で、B,D列及びC,E列の数値が同じ場合、B列をB列の数値XC列の数値とし、B~E列のセルを結合する。 4.K列のセル入力がOBLONG_XまたはOBLONG_Yの行で、F,G列及びH,I列の数値が同じ場合、F列をF列の数値XG列の数値とし、F~I列のセルを結合する。 5.J列のセル入力がOBLONG_XまたはOBLONG_Yの行で、B,D列及びC,E列の数値が同じでない場合、B列をB列の数値XC列の数値とし、B,C列のセルを結合する。又、D列をD列の数値XE列の数値とし、D,E列のセルを結合する。 6.K列のセル入力がOBLONG_XまたはOBLONG_Yの行で、F,G列及びH,I列の数値が同じでない場合、F列をF列の数値XG列の数値とし、F,G列のセルを結合する。又、H列をH列の数値XI列の数値とし、H,I列のセルを結合する。 7.J列のセル入力がSHAPEの行で、B~E列は何もしない 8.K列のセル入力がSHAPEの行で、F~I列は何もしない

専門家に質問してみよう