- ベストアンサー
Excel VBAで名前を一気に処理する方法
- ExcelのVBAを利用して、名前を一気に処理する方法について教えてください。
- 現在はオートフィルを使って名前を処理していますが、今後はもっと多くの人数で同じ処理をしなければならなくなりました。
- 名前の処理を効率的に行うためのVBAのアイディアやヒントがあれば教えてください。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
以前、一万人分の年間データを処理後のようにしようと朝早くから出勤し頑張っている人がいました。いつ終わるか分からないので、以下のような方法を教えました。何件あっても操作のみで数秒です。以下はExcel2010で行いました。 名前を埋めるには、(例示の1行目の「処理前」を消しておきます) 1.(処理前の)表の内部を選択して、Ctrl-A 2.F5キーを押す 3.ジャンプダイアログで「セル選択」ボタンを押す 4.選択オプションダイアログで「空白セル」を選択して「OK」 5.この例の場合、セルA4が選択されるので、セルA4に算式「=A3」と入力し、Ctrl+Enter 一旦埋めた後、元に戻したいとの要望がでてきました。 名前を消去するには、 1.セルA3を選択し、Shift+End+下矢印で名前データを全て選択し、 2.F5キーを押す 3.ジャンプダイアログで「セル選択」ボタンを押す 4.選択オプションダイアログで「数式セル」を選択して「OK」 5.「Delete」キーを押す この他に、処理後のように入力し、条件付き書式をを使って2つ目以降の名前を見せないようにする方法が一番スマートかもしれません。表示の切り替えは外部にフラグ(セルC1とします)を一つ作っておけばいいでしょう。 条件は名前のセルについて、算式で「=AND($C$1=1,A3=A2)」、見せなくする設定はフォントの色を「白」にします。セルC1が「1」なら見えません。 マクロ(VBA)を使えば、自動化ができますが、誰でもわかるわけではないので、極力マクロは使わないように指導していました。自分で作ったマクロでもすぐ忘れます。 とりあえず作ってみました。上の2手順をVBAで書いただけです。 「セルA3」を決め打ちしています。 Cells(Rows.Count, 1)の「1」はA列の意味です。 '// 空白セルを埋める Sub setName() Range("A3:A" & Cells(Rows.Count, 1).End(xlUp).Row).Select Selection.SpecialCells(xlCellTypeBlanks).Select Selection.FormulaR1C1 = "=R[-1]C" Range("A3").Select End Sub '// マクロで埋めた名前を削除する Sub delName() Range("A3:A" & Cells(Rows.Count, 1).End(xlUp).Row).Select Selection.SpecialCells(xlCellTypeFormulas, 23).Select Selection.ClearContents Range("A3").Select End Sub
その他の回答 (5)
- Mathmi
- ベストアンサー率46% (54/115)
こういう場合、自分ならフィルタを使います。 1.A列の該当部分にフィルタを設定。 2.フィルタで空白セルのみを表示させる。 3.A4セルに[=A3]と入力する(名前が入力されている直下のセルに、直上のセルの値を表示させるよう設定する)。 4.A4セルをコピーする。 5.名前を入力する範囲を選択する(この時点では、空白か入力済みかは区別しない)。 6.[alt+;]で、非表示になっているセル(=名前が入力されているセル)を選択から外す。 7.上記4でコピーしておいた関数を、選択範囲にペーストする。 8.改めて上記5で選択した、名前の入力されたセル範囲をコピーし、値として張り付ける。 複数のシートに同じ処理を繰り返すのではないなら、こちらの方が簡単です。 VBAでシートの内容を変更した場合、やりなおし(Ctrl+Z)はできないですし。
- imogasi
- ベストアンサー率27% (4737/17070)
#1です。 いろいろな処理ロジックがあるという例を1つ。 Sub test02() lr = Range("B100000").End(xlUp).Row MsgBox lr '--- i = 2 Do While i < lr If Cells(i, "A") <> "" Then simei = Cells(i, "A") dr = Cells(i, "A").End(xlDown).Row MsgBox dr Range(Cells(i + 1, "A"), Cells(dr - 1, "A")) = simei i = dr End If Loop End Sub '--- 上記のdr = Cells(i, "A").End(xlDown).Rowは 、 [END]キーを押して続けて下↓キーを押すと 空白でない行のセルを指して、カーソルが止まります。 この仕組みのVBAを使ったものです。 ーー これらの仕組は、いくらJavaなどのプログラムの経験があっても、エクセルの操作の経験が豊富でないと、思いつかないかもしれません。
- watabe007
- ベストアンサー率62% (476/760)
参考に Sub Test() Dim blRang As Range, c As Range, LastRow As Variant With ActiveSheet LastRow = Application.Match("総計", .Columns(1), 0) If IsError(LastRow) Then MsgBox "総計が見つかりません", 48 Exit Sub End If Set blRang = .Range("A3:A" & LastRow).SpecialCells(xlCellTypeBlanks) End With For Each c In blRang.Areas c.Value = c.Cells(1).Offset(-1).Value Next End Sub
- kon555
- ベストアンサー率51% (1848/3569)
VBAで組んでもいいのですが、if関数で処理するのも手っ取り早いと思いますよ。どこか別の列に、『A列セルを参照して空白なら一つ上のセルの内容を表示。空白でなければそのセルの内容を表示』のif関数を入力。これでお望みの結果が出ます。 後は値貼り付けでA列にもっていけば完了です。 またこうした同値入力であれば、オートフィルよりも任意範囲を選択した後で「Ctrlとエンター」で一括入力する方が適切かと思います。オートフィルだと、たまに思いもよらぬ所を数値と認識して変更されたりしますからね。 https://dekiru.net/article/11942/ 個人的に、もし貴方がVBAを覚えようとするなら、今回の質問の件は悪くない課題だと思います。 ただ、理解しないまま使用するVBAは予想外のエラーなどでむしろ効率が悪くなったりもしますので、覚えるつもりまではないなら、通常機能を使って工夫した方がいいと思います。 今回の件で言えば、そんなに差は出ないはずですので。
- imogasi
- ベストアンサー率27% (4737/17070)
VBAをやるというなら、まずどういう処理ロジックで、やればよいかを自分なりに考えてみること。その段階で、本当は適切か質問すべきというのが、小生の持論。本件など簡単なものだ。 一番初歩的なのは、上行セルから、下行のセルに向かって、考えているセルが空白セルかどうか判断して、空白なら、変数に覚えている氏名をセットする。 空白でないなら、そのA列の名前を変数に仮に覚えて、次行処理に移る。 繰り返しを終了する条件だが、B列データは途切れなく入力されているとしてよいようなので、その最下行をVBAで割り出す。初心者は無理せず、目視で最終行を察知でもよいじゃないか。 ーー 例データ A1:B9 氏名 計数 山本太郎 12 3 5 木村次郎 6 8 23 田中三郎 1 2 総計 ーーー VBE画面で、標準モジュールに Sub test01() lr = Range("B100000").End(xlUp).Row MsgBox lr For i = 2 To lr If Cells(i, "A") = "" Then Cells(i, "A") = simei Else simei = Cells(i, "A") End If Next i End Sub ーー 実行して 結果 氏名 計数 山本太郎 12 山本太郎 3 山本太郎 5 木村次郎 6 木村次郎 8 木村次郎 23 田中三郎 1 田中三郎 2 総計 1つづつ、課題のタイプに応じて、レパードリーを増やして、いくしかない」。 短い簡単な課題でも、やり方は数通りあるのが通例。