[[20180320205729]] 『マクロの記録について』(胃の上腰椎) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『マクロの記録について』(胃の上腰椎)

こんにちは。

今、次のような処理をしていますす。
1.A2セルに文字列を入力(セル内改行を使った複数行にまたがる文字列)
2.Substitute関数を使ってA2セルの文字列から特定の文字列を削除したものをC2セルにコピー(C2セルにSubstitute関数が入っています)
3.C2セルの値をD2セルにコピペ(値のみコピペ)
4.「区切り位置」の機能を使って、D2セル内の文字列を改行マークで区切ってE2セル以下に振り分ける

C2セルの値をD2セルにコピペしたのは、C2セルには関数が入っているため、C2セルに対して「区切り位置」の機能を使うことが出来ないため、D2セルにいったん値だけをコピペしました。

以上の処理のうち3以降をマクロにしようと思うのですが、VBAの知識がないので「マクロの記録」で前記3以降のような処理をしてくれるマクロを作ってみました。

今困っているのは、次の2点です。
1.前記3以降の処理をマクロに記録した時、C2セルが選択された状態から始めたため、マクロを実行する時にも必ず先ずC2セルを選択してからマクロを実行しないと、思ったような結果が得られません。マクロ実行前に先ずC2セルを選択しなくても(どこのセルが選択されているかに関わらず)前述のような処理が出来るようにすることは可能でしょうか。
2.実際に使う際には、2行目だけではなく、複数行に対して処理をします(D3セルやD4セル等々に対しても区切り位置の処理をします)。ところが、先の方法で記録したマクロだと、仮にD2セル、D3セル、D4セルを選択してからマクロを実行しても、現実にはD2セルだけしか区切り位置の機能が働きません。何個のセルについて処理するのかはその時々で一定していないのですが、処理対象が何個になっても一回のマクロ実行で処理することは出来ないでしょうか。

よろしくお願いいたします。

< 使用 Excel:Excel2016、使用 OS:Windows10 >


>何個のセルについて処理するのかはその時々で一定していないのですが、

だとすると、

>処理対象が何個

であるかを、マクロ実行者は、どうすれば判断できますか?
すべてのデータということでしょうか。

(マナ) 2018/03/20(火) 21:10


もう一つ、

現在のマクロを提示していただけますか。

(マナ) 2018/03/20(火) 21:12


マナ 様

早速にありがとうございます。

>処理対象が何個であるかを、マクロ実行者は、どうすれば判断できますか?

A2セル文字列は、既存のものではなく、作業する日に新たに入力します(実際には、他のファイルからコピペするのですが)。例えば、今日、A2セルからA50セルまで文字列を入力したとすれば、それに続いてD2セルからD50セルまで「区切り位置」の処理をすることになります。自分が今日はA2セルからA50まで入力したことは分かっていますから、マクロの実行はその範囲ということになります。このマクロを組み込んだファイルを日々別のものにすることも可能ですので(今日はファイル1にA2セルからA50まで入力し、次の日は別のファイル2にA2セルからA35セルまで入力するとか)、そのようなやり方をすれば、すべてのデータにマクロを実行するということになるでしょうか。

>現在のマクロを提示していただけますか。

マクロは、下記のとおりです。

Sub Macro2()
'
' Macro2 Macro
'

'

    Selection.Copy
    ActiveCell.Offset(0, 1).Range("A1").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Application.CutCopyMode = False
    Selection.TextToColumns Destination:=ActiveCell.Offset(0, 1).Range("A1"), _
        DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter _
        :=False, Tab:=False, Semicolon:=False, Comma:=False, Space:=False, _
        Other:=True, OtherChar:="" & Chr(10) & "", FieldInfo:=Array(Array(1, 1), Array(2, 1), Array _
        (3, 1), Array(4, 1), Array(5, 1), Array(6, 1), Array(7, 1)), TrailingMinusNumbers:= _
        True
End Sub 
(胃の上腰椎) 2018/03/20(火) 21:42

深く考えないで適当に、C2からC1000まで(想定される最大数)を処理してしまうと問題ですか。

(マナ) 2018/03/20(火) 22:23


マナ 様

再度のレスをありがとうございます。

>深く考えないで適当に、C2からC1000まで(想定される最大数)を処理してしまうと問題ですか。

仮にC2からC200までに今回データを入力したとして、C2からC1000まで(想定される最大数)を処理したとすると、C201からC1000までは、特に何の変化も起きないということになるでしょうか。他に方法がなければ、その方法を選択するしかないかと思ったりもしているのですが、ファイルが重くならないかとか、前回までのデータが入っているファイルを引き続き使った場合に(前回までのデータがC1000までに含まれているとして)、前回までのデータに何か影響が出ないかとかが気になり、出来れば、今回処理する範囲だけを選択してマクロを適用出来るに越したことはないと思っています。
(胃の上腰椎) 2018/03/20(火) 22:35


>C201からC1000までは、特に何の変化も起きないということになるでしょうか。

無駄に同じ処理をすることになりますが、結果は変わらないはずなので
見た目、何の変化もないと思います。

>ファイルが重くならないかとか、

重くなりません。

>前回までのデータに何か影響が出ないかとかが気になり、

上述の通りです。影響ありません。

>出来れば、今回処理する範囲だけを選択してマクロを適用出来るに越したことはないと思っています。

できますが、
選択範囲を間違えることはありませんか?
そのために対策をとるとマクロが複雑になるかもしれません。
何より、毎回選択するという行為が面倒でありませんか?

(マナ) 2018/03/20(火) 22:57


マナ 様

先の私の不安が杞憂であるならば、想定される最大数を処理する方法を選択したいと思います。何か良い方法がありますでしょうか。

(胃の上腰椎) 2018/03/20(火) 23:09


こんなマクロでどうでしょうか

1)D2:Z1000のデータを消去
2)C2:C1000をコピー
3)D2に値貼り付け
4)D2:D1000を区切り位置で分割(分割先はE2)

マクロ記録の結果が使えます。
Selectionを具体的な範囲に置き換えるとよいです。

例えば、

>Selection.Copy

 Range("C2:C1000")>Copy

のようにします。

(マナ) 2018/03/20(火) 23:20


マナ 様

最初の投稿でも申し上げましたが、当方VBAの知識がなく「マクロの記録」を使ってマクロを作成するのが精一杯の状況です。何度もお手数をおかけして恐縮ですが、具体的にマクロ記録の結果をどう編集すればよいのでしょうか。ご教示頂けましたら幸いです。
(胃の上腰椎) 2018/03/20(火) 23:39


>「マクロの記録」を使ってマクロを作成する

と、こんな感じになります。

 Sub test()

    Range("D2:Z1000").ClearContents
    Range("C2:C1000").Copy
    Range("D2").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("D2:D1000").TextToColumns Destination:=Range("E2"), _
        DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter _
        :=False, Tab:=False, Semicolon:=False, Comma:=False, Space:=False, _
        Other:=True, OtherChar:="" & Chr(10) & "", FieldInfo:=Array(Array(1, 1), Array(2, 1), Array _
        (3, 1), Array(4, 1), Array(5, 1), Array(6, 1), Array(7, 1)), TrailingMinusNumbers:= _
        True

 End Sub

>1)D2:Z1000のデータを消去

この部分も「マクロの記録」でわかります。

(マナ) 2018/03/21(水) 00:08


マナ 様

お陰様で希望どおりの処理が可能になりました。何度もレスを頂き、大変ありがとうございました。
(胃の上腰椎) 2018/03/21(水) 08:49


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.