エクセルでセルの内容を横展開する方法

このQ&Aのポイント
  • エクセルで特定のセルに対して決まった動作をさせるためには、マクロを使用することができます。
  • ただし、マクロの記録では最初に選択したセル番地で動作するため、実際に選択されるセルに合わせて動作するようにする必要があります。
  • 例えば、A列の5〜6行目を選択して、そのセルの内容を文字区切りで横に展開するためには、マクロを以下のように記述します。 Sub Macro1() Range("A5:A7").Select Selection.TextToColumns Destination:=Range("A5"), DataType:=xlDelimited, _ TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _ Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar :="\", FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, _ 1), Array(6, 1), Array(7, 1), Array(8, 1), Array(9, 1)), TrailingMinusNumbers:=True End Sub
回答を見る
  • ベストアンサー

エクセルで選択してるセルに決まった動作をマクロに

いつもお世話になっております。 手動で選択したセルに対して決まった動作をさせたいのですが、マクロの記録では最初に選択したセル番地で動くことになるので困っています。 やりたいことは、例えばA列の5~6行目を選択して、そのセルの内容を文字区切りで横に展開したいのです。 これをマクロの記録では Sub Macro1() Range("A5:A7").Select Selection.TextToColumns Destination:=Range("A5"), DataType:=xlDelimited, _ TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _ Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _ :="\", FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, _ 1), Array(6, 1), Array(7, 1), Array(8, 1), Array(9, 1)), TrailingMinusNumbers:=True End Sub となるのですが、この最初の行のRange("A5:A7”)Selectをその時に選んだセルで下のコードが実行されるようにしたいのですが。

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

  • ベストアンサー
  • SI299792
  • ベストアンサー率48% (714/1476)
回答No.5

「\」 で区切りたい、これを指定の範囲ではなく、選択した範囲にしたいのですね。 範囲指定をした後、ボタンを押して実行ですね。 Range("A5:A7").Select Destination:=Range("A5"), この2か所を消せば、固定でなく選択した範囲になります。 上はデータの範囲、下は出力位置を指定しています。 注意点として 「,」 もけします。 ちなみに、これだけでできます。 Sub Macro1()   Selection.TextToColumns OtherChar:="\" End Sub

akira0723
質問者

お礼

本日目的のシートにコードを入力して正常に動作することを確認しました。 添削&解説までありがとうございました。

akira0723
質問者

補足

ご回答ありがとうございます。 マクロの記録で作られたコードの添削ありがとうございます。 ご回答の箇所の削除で期待の結果が得られました。 今後もこの方法(セルを選択して記録して当該部分の削除)で手っ取り早くマクロを使えることになるので非常に参考になりました。 ただ、第2のコードでは、なぜか「区切り位置」の操作が途中で止まるようです。 おそらく当方のシートの問題だと思います。

その他の回答 (4)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.4

マクロの記録しかしてないレベルでは、ややこしい。常識の部分も文章説明が必要で、説明も長くなる。下記で分かりますかな。 ・シート(Sheet1とする)の画面で ・ALT+F11 ・VBEの画面になる。 ・表示ープロジェクトエクスプローラーでプロジェクトエクスプローラーのウインドウを表示する。通通常は、右上に出る。 ・右上側のプロジェクトエクスプローラーのウインドウでSheet1を探し、 そこでマウスで右クリック.名前を変えているとそれに変わって表示される。 ・「コードの表示」をクリック ・その画面の左上部側の(オブジェクト選択)「General」でWorksheet、右側(イベント選択)の「Declaration」でSelectionChangeを選ぶ。 ・すると Private Sub Worksheet_SelectionChange(ByVal Target As Range) End Sub が自動的に出る。 ・真ん中の行に If Target.Address = "$A$3" Then MsgBox "aaa" End If と入れる。本内容は納得のためのテスト用。 ・テストとして、シートの画面に戻り(その方法は、Sheet1を選んでおいてーオブジェクト表示のアイコン(すぐ上にある)をクリックでシート画面に戻る)の、Sheet1シートのA3セルをクリックして選択する。 ・すると画面のメッセージ・ボックスにに「aaa」が表示されるので、OKで脱す。 ・本番では、MsgBox "aaa"の1行を、質問者の例では、Macro1に置き換える。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) Macro1 End Sub とする。 A3セルを選択するとMacro1Mの内容がが実行される。 今回はMacro1の作業内容とA3セル選択の整合性は考えてない説明のためのものであることを断っておく。 ーーー これは決まった1つのセルを選択したことをトリガにして実行するもの。 別に他のニーズでは、想定したセル範囲内の、どこかの1セルをクリックすると、実行、などということもコードを修正すればできる。 想定した下セルの判定をTarget.Address =「セル番地を表す文字列」(小文字などではだめのようです。例 "$A$3" ーー> "$a$3" はダメだった)で判定しているが、他の書き方もある。

akira0723
質問者

お礼

ご回答ありがとうございます。 基礎知識がないので非常に参考になりました。

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.3

データーがA列と決まっているのなら Sub Test()   With Selection     If .Columns.Count = 1 And .Column = 1 Then       .TextToColumns , DataType:=xlDelimited, Other:=True, OtherChar:="\"     End If   End With End Sub

akira0723
質問者

お礼

ありがとうございます。 早速試してみて期待通りに動きました。

  • WDY
  • ベストアンサー率27% (121/433)
回答No.2

Sub Worksheet_SelectionChange(ByVal Target As Range) で実行しセルの座標を取り 特定のセルの場合実行の条件分岐を入れれば出来ると思います https://jizilog.com/vba-selectchange

akira0723
質問者

お礼

早々のご回答ありがとうございます。 試してみましたが最初にエラーが出て、手動でマクロを実行すると期待通りに動くことを確認しました。 当方の質問の説明不測のようです。 実際の使い方は、ファルダーにあるファイルのパスをコピーしてエクセルに張り付け手、マクロでフォルダ名を横に展開する。ことでした。 教えていただいた自動マクロだと、ファイルのパスをコピーして、エクセルの目的の場所に張り付けようとセルをクリックした瞬間にエラーが出ます。 これを無視してマクロを実行するとちゃんと動くのですが。。。。

  • kkkkkm
  • ベストアンサー率65% (1618/2457)
回答No.1

Range("A5:A7").Select を外して Range("A5") を Selection(1) にしてみてください。 Sub Macro1() Selection.TextToColumns Destination:=Selection(1), DataType:=xlDelimited, _ TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _ Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _ :="\", FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, _ 1), Array(6, 1), Array(7, 1), Array(8, 1), Array(9, 1)), TrailingMinusNumbers:=True End Sub

akira0723
質問者

お礼

早々のご回答ありがとうございます。 動作確認し期待通り動きました。 これで何度も同じ作業せずに「マクロボタン」クリックでできるので非常に助かります。 この作業は最初から区切り位置でセル内容を分割していたので、マクロ化することに気が付かず人に引き継ごうとしてマクロ化に気が付きました。 もっと早く相談していればよかったです。

関連するQ&A

  • 【Excel2013】特定のセルを指定したくない

    下記マクロはD8:D80までのセルに入力されている文字を「文字列」にするマクロです。 Range("D8:D80").Select Selection.TextToColumns Destination:=Range("D8"), DataType:=xlDelimited, _ TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _ Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _ :=Array(1, 2), TrailingMinusNumbers:=True Range("D8").Select End Sub 同じ作業を他のセルでも実行することが多々あるため、文字列にしたいセルを選択した状態でマクロを実行したいのです。 どのように設定すればよろしいのでしょうか?

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

    お世話になります エクセルのマクロ記録を使った結果が下記のようになりました。 そこで、ファイルは自分で選択して開きたいと思い 色々調べた結果 Application.GetOpenFilenameを使用すればよい事がわかりましたが、どの部分を変更すればよいのかわかりません やりたいことは、txtファイルの中身の不要な部分を削除して必要な部分だけを取り出したいのです。 どうぞ、よろしくお願いします。 Sub Macro1() ' ChDir "C:\Documents and Settings\My Documents\next\aaa" Workbooks.OpenText Filename:= _ "C:\Documents and Settings\My Documents\next\aaa\aaa.txt" _ , Origin:=932, StartRow:=1, DataType:=xlDelimited, TextQualifier:= _ xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=True, Semicolon:=False, _ Comma:=False, Space:=True, Other:=True, OtherChar:="(", FieldInfo:= _ Array(Array(1, 9), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 9), Array(7 _ , 9)), TrailingMinusNumbers:=True Cells.Select Cells.EntireColumn.AutoFit End Sub

  • エクセルのマクロで行選択

    現在、エクセルでマクロを組んでいます。 行いたい内容としては 1.行6~1765までを選択 2. 1.で選択した行を非表示 3. 行6~"セルH2の値"までをを選択 4. 3.で選択した行を再表示 3の段階で失敗してしまいます。 Rangeメソッドに失敗しました、と出ます ソースは以下のとおりです ----- Private Sub CommandButton2_Click() Dim x As Integer Range("6:1765").EntireRow.Select Selection.EntireRow.Hidden = True x = Range("H2").Value Range("6:x").EntireRow.Select Selection.EntireRow.Hidden = False End Sub ---- 解決法がわかる方、教えてください よろしくお願いします。

  • VBA 文字を指定文字で区切り、セルを分けたい。

    WINは7、Excelは2013を使用しています。 「A、B」や「A・B」を、「、」や「・」のところで区切り、セルを分けたいと思っています。 下記、マクロの記録で作ったものを、アレンジしているのですが、 OtherChar:="、" のところで、「・」を追加できなくて、つまづいてしまっています。 修正点をご教示頂けます様お願い致します。 ------------- Sub 区切り() Dim i As Integer Dim j As Integer Dim maxrow As Integer j = InputBox("「行」を数字で入力 " & vbCr & vbCr & "【例】A列=1、B列=2...Z列=26", _ "「行」を半角数字で入力して下さい。") maxrow = Cells(Rows.Count, j).End(xlUp).Row For i = 2 To maxrow Cells(i, j).Select If Cells(i, j) <> "" Then Application.CutCopyMode = False Selection.TextToColumns Destination:=ActiveCell, _ DataType:=xlDelimited, _ TextQualifier:=xlDoubleQuote, _ ConsecutiveDelimiter:=True, _ Tab:=True, _ Semicolon:=True, _ Comma:=True, _ Space:=True, _ Other:=True, _ OtherChar:="、", _ FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1)), _ TrailingMinusNumbers:=True end if Next i End Sub

  • エクセルのマクロの手直し

    お世話になります。 エクセルのマクロに教えてください。 (1)シートの保護を解除 (2)E42~H42までを選択し[コピー] (3)E18をクリックして[形式名を選択して貼り付け](その中の値のみ) (4)E42~H42までを選択し[数式と値のクリア] (5)シートの保護 → OK ここで (3)のE18というセルの所を E列で、行番号は I42 のセルに7を足した数字 というようにしたい。(I42の値が15だったらE22という具合)ちなみに I42 のセルは条件により変化し0以上35以下の整数が入る。 以下は(1)から(5)の作業をマクロの新規作成で「マクロ」という名前で記録したものです。 どの部分を修正すればいいのか教えてください。 Sub マクロ() ' ' マクロ Macro ' マクロ記録日 : 2002/5/27 ユーザー名 : ' ' ActiveSheet.Unprotect Range("E42:H42").Select Selection.Copy ActiveWindow.ScrollRow = 10 Range("E18").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False ActiveWindow.SmallScroll Down:=6 Application.CutCopyMode = False Range("E42:H42").Select Selection.ClearContents Range("I37").Select ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True End Sub

  • エクセルのマクロ 選択したセルを指定した範囲へ値貼

    お世話になります。 自動記録したものをどのように修正したら、実行時に選択しているセルの値を、3行下、1つ左のセルから8行目までに貼り付けることができるよう書き変えられますでしょうか。 初心者で何に手を付けて良いのか分からず。どなたかご教示いただけませんでしょうか。どうぞよろしくお願い致します。 Sub 選択したセルを指定した範囲へ値貼り付け() ' ' Macro1 Macro ' ' Range("I9").Select Selection.Copy Range("H12:H19").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False End Sub

  • エクセルVBAで教えて下さい。

    A1のセルに [ 1- 5] 4.05398e-01 3.63385e-01 -2.22992e-01 9.89158e-03 -6.43695e-02 A2のセルに [ 6-10] -5.12224e-04 4.07480e-04 -2.73746e-04 -1.77853e-02 -2.13805e-03 A3のセルに [11-15] -6.88489e-03 -2.06765e-02 -9.44633e-03 6.97059e-03 -1.28400e-02 と、このような感じでA7セルまで同じ感じでスペースで空いた数値が入力されています。 A8のセルのみ [36-37] -6.39210e-03 -1.55806e-03 と入力されております。 まず行いたいのはスペースが空いてる部分で、それぞれの数値を各セルに分けたいです。 A1のセルに入力されている [ 1- 5] 4.05398e-01 3.63385e-01 -2.22992e-01 9.89158e-03 -6.43695e-02 ならば A1に[1-5] B1セルに4.05398e-01 C1セルに3.63385e-01 のように これをA1からA8のセルで行ったあと指定のセルを30行目に貼り付けます。 E1→A29 C2→B29 D2→C29 E2→D29 E3→E29 F3→F29 B4→G29 D5→H29 E5→I29 F5→J29 貼り付けのデータは増えていきます。つまり、30行目にデータが入ってる場合は そのデータが1行下の行に下がり、新たなデータが30行目に追加されます。 このようにして、データが最大で58行目まで追加される可能性があります。 最小であれば30行目、31行目の2つしかない場合あります。 この時、0の近似値を各列のセルから探し、当てはまるセルを赤く塗り潰すというのが 今回行いたいことです。 A列ならA30~A58までの中で0の近似値を探し、当てはまるセルを赤く塗り潰す。 ただ空白の場合は無視してもらいたいです。0の近似値だと空白が選択されてしまうので。 近似値探しの前までならマクロがありますのでご参照下さい。 Sub Macro4() ' ' Macro4 Macro ' ' Range("A1:A8").Select Selection.TextToColumns Destination:=Range("A1"), DataType:=xlFixedWidth, _ FieldInfo:=Array(Array(0, 1), Array(7, 1), Array(21, 1), Array(34, 1), Array(47, 1), _ Array(60, 1)), TrailingMinusNumbers:=True Range("A1").Select Range("E1").Select Selection.Copy Range("A29").Select ActiveSheet.Paste Range("C2:E2").Select Application.CutCopyMode = False Selection.Copy Range("B29").Select ActiveSheet.Paste Range("E3:F3").Select Application.CutCopyMode = False Selection.Copy Range("E29").Select ActiveSheet.Paste Range("B4").Select Application.CutCopyMode = False Selection.Copy Range("G29").Select ActiveSheet.Paste Range("D5:F5").Select Application.CutCopyMode = False Selection.Copy Range("H29").Select ActiveSheet.Paste Range("J7").Select Application.CutCopyMode = False Range("A29:K29").Select Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove Range("A29:K29").Select With Selection.Interior .Pattern = xlNone .TintAndShade = 0 .PatternTintAndShade = 0 End With Range("A29").Select Range("A1:F8").Select Selection.ClearContents Range("A1").Select Range("K29").Select With Selection.Interior .Pattern = xlNone .TintAndShade = 0 .PatternTintAndShade = 0 End With Selection.NumberFormatLocal = "G/標準" End Sub わかりずらい質問ですみませんが、ご指導の程 お願い致します。

  • エクセル・並び替えのマクロ

    エクセルで並び替えのマクロを作ったのですが ___A ______B ______C ______D ______E ______F _____________G 1 (株)カネカ【東証1部 : 4118.T】 2 日付 __始値 _高値 _安値 _終値 _出来高 ___調整後 3 07/07 1,030 1,069 ___941 __974 30,772,000 ___974 4 07/06 1,057 1,093 1,016 1,033 26,904,000 1,033 5 07/05 1,080 1,086 1,023 1,051 26,541,000 1,051 6 07/04 1,113 1,209 1,087 1,098 36,317,000 1,098 7 07/03 1,096 1,128 1,020 1,124 23,988,000 1,124 8 07/02 1,098 1,147 1,020 1,105 28,609,000 1,105 9 07/01 1,100 1,158 1,078 1,082 17,808,000 1,082 このような表で マクロ記録開始 セルA3をクリック データ→並び替え 優先されるキー:日付・昇順 データ範囲の先頭行:タイトル行 マクロ記録終了 で、できたマクロが Sub Macro1() Range("A3").Select Range("A1:G9").Sort Key1:=Range("A3"), Order1:=xlAscending,Header:= _ xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ SortMethod:=xlPinYin, DataOption1:=xlSortNormal End Sub これを実行すると 1行目、2行目の(株)カネカ、日付、始値…、が8行目、9行目になってしまいます そこで、マクロの Range("A1:G9")を Range("A3:G9")に書き換えて Sub Macro2() Range("A3").Select Range("A3:G9").Sort Key1:=Range("A3"), Order1:=xlAscending, Header:= _ xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ SortMethod:=xlPinYin, DataOption1:=xlSortNormal End Sub これを実行すると 日付が、07/07、07/01、07/02、07/03、07/04、07/05、07/06 の順番になってしまいます どうしたらよいのでしょう?

  • エクセル マクロでの繰り返し処理について

    エクセル初心者です。エクセル2010を使用しています。 とあるホームページから、ページをコピーして、エクセルに「テキストで貼り付け」をおこない、 A列に8行の項目が入ります。この8行と次の8行の間には、自然に空白行が1行ずつ入ります。 これは、完全に手作業です。 次に、下記の作業を、マクロの自動記録を相対参照で行います。 上記のエクセルのデータを、1つめの8行のデータをコピーして(A1からA8)、C1に「行と列を入れ替え」を選択してC1からJ1に貼り付けます。 その後は、次のデータのまとまりのA10のセルに移ります。これをCtrl+a を押し続けることで、数百件か多いときは4000件ほどの並べ替えをしています。 「データがある間は、この処理を繰り返す。」 というマクロにしたいのですが、参考書等を見ながらチャレンジしてもうまくいきません。 わかる方、教えていただけますか。 以下が、マクロの自動記録でできた物です。データの個数は数百のこともあれば4000件のこともあります。 Sub 行列入れ替え8行() ' ' 行列入れ替え8行 Macro ' ' Keyboard Shortcut: Ctrl+a ' ActiveCell.Range("A1:A8").Select Selection.Copy ActiveCell.Offset(0, 2).Range("A1").Select Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=True ActiveCell.Offset(9, -2).Range("A1").Select End Sub どうぞ、ご指導よろしくお願いいたします。

  • EXCELのマクロがわかりません・・・

    現在、A列にデータが並んでいるのですが、 これを7つ区切り(例:A1~A7、A15~A21)にして、 別シートに用意した表に行列を入れ替えて、 貼り付けるマクロを作っているのですが、 なにぶんVBは素人ですので、よくわかりません。 今作ろうとしているマクロは、 「元データ」セルのA1からA7までをコピーして、 「作成データ」セルのB2を起点として、 コピーした内容の行列入れ替えを行い貼り付け、 以後、「元データ」のコピー範囲を7つづつ 下にずらし、「作成データ」の貼り付け起点を 1つづつ下にずらして、「元データ」のA列の 最後までくりかえすものです。 必ず「Range」文で引っかかってしまうのですが、 何か構文的におかしいでしょうか? かなり急ぎですので、 わかる方、よろしくお願いしますっ!! 下に、作成したマクロを貼り付けます。 Sub Macro3() ' ' Macro3 Macro ' マクロ記録日 : 2005/12/5 ユーザー名 : *** Worksheets("元データ").Activate 開始行 = -6 終了行 = 0 ペースト行 = 0 Do 開始行 = 開始行 + 7 終了行 = 終了行 + 7 ペースト行 = ペースト行 + 1 開始セル番号 = "A" & 開始行 終了セル番号 = "A" & 終了行 ペーストセル番号 = "B" & ペースト行 Range("開始セル番号:終了セル番号").Select Selection.Copy Sheets("作成データ").Select Range(ペーストセル番号).Select Selection.PasteSpecial Paste:=xlAll, Operation:=xlNone, SkipBlanks:=False _ , Transpose:=True Loop End Sub

専門家に質問してみよう