• ベストアンサー

excel VBA について

画像のようにexcelファイルのD列に自動で通番を入力させたい。 フォームを利用して新しいデータは最終行に反映するように設定しています。 できれば、フォームの登録を押した時点でD列最終行に画像条件にあう通番を入力させたいのですがどうすればいいかわかりません。 今は、D列セルにCOUNTIFを使って条件を検索して通番を表示させているのですが、日々行が増え続けるためファイルが非常に重たくなってきたのでマクロにチャレンジしました。 マクロの知識はほとんどありません! よろしくお願いします。

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

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率65% (1620/2459)
回答No.6

No5の訂正です。 MyRow = .Range("B" & Rows.Count).End(xlUp).Row + 1 新しい最終行を追加した後にこのコードを追加するので最後の+1は不要でした。 あと、既存の式でカウントされているセルですが、そのセルをコピーしてそのまま「値貼り付け」してしまえば計算しない分軽くなると思います。

situmontarou123
質問者

お礼

kkkkkmさん 本当にありがとうございます! 最終的にテキスト入力マクロの後に With Sheets("Sheet2") MyRowB = .Range("B" & Rows.Count).End(xlUp).Row MyRowC = .Range("C" & Rows.Count).End(xlUp).Row MyRowF = .Range("F" & Rows.Count).End(xlUp).Row If .Range("B" & MyRowB) <> "" Then .Range("I" & MyRowC) = _ WorksheetFunction.CountIfs(.Range("B:B"), .Range("B" & MyRowB), .Range("C:C"), .Range("C" & MyRowC), .Range("F:F"), .Range("F" & MyRowF)) Else .Range("I" & MyRowB) = "" End If End With これでSheet2のI列に年月区分の通し番号が自動表示できました! 何度もご回答くださり、本当にありがとうございます。 少しでも軽くなればと思い、値貼り付けはすでに行ってました。 ありがとうございました。 無事解決出来たのでベストアンサー付けときます!

その他の回答 (5)

  • kkkkkm
  • ベストアンサー率65% (1620/2459)
回答No.5

> =IF(COUNT(A588)=1,COUNTIFS(B$2:B588,B588,C$2:C588,C588,F$2:F588,F588),IF(A588="","",COUNTIFS(B$2:B588,B588,C$2:C588,C588,F$2:F588,F588))) 上記の式ですが、私が十分理解していない可能性は大で、そのうえあまり回らない頭で考えたのですが COUNT(A588)=1 この式が数値がどうかの判定に使われているのでしたら A列が数値ならカウントしなさい A列が数値以外の場合 未入力なら未入力 未入力でなければ(数値以外が入力されていても)カウントしなさい という意味ですよね。A列に数値以外が入っていても「未入力でなければカウントしなさい」が最終で有効になりますので数値以外を除外したいのでしたら除外されていないことになります。この式の場合、前半のIFは不要で後半だけの式で結果は同じになると思われます。 以下は、数値以外の除外を考えていないコードです、未入力だけカウントから除外します。 Dim MyRow As Long With Sheets("Sheet2") MyRow = .Range("B" & Rows.Count).End(xlUp).Row + 1 If .Range("A" & MyRow) <> "" Then .Range("I" & MyRow) = _ WorksheetFunction.CountIfs(.Range("B:B"), .Range("B" & MyRow), .Range("C:C"), .Range("C" & MyRow), .Range("F:F"), .Range("F" & MyRow)) Else .Range("I" & MyRow) = "" End If End With こちらは、数値以外と未入力を除外します Dim MyRow As Long With Sheets("Sheet2") MyRow = .Range("B" & Rows.Count).End(xlUp).Row + 1 If IsNumeric(.Range("A" & MyRow)) And .Range("A" & MyRow) <> "" Then .Range("I" & MyRow) = _ WorksheetFunction.CountIfs(.Range("B:B"), .Range("B" & MyRow), .Range("C:C"), .Range("C" & MyRow), .Range("F:F"), .Range("F" & MyRow)) Else .Range("I" & MyRow) = "" End If End With 一行ずつ追加していってカウントするかどうかというようなテストはしていませんので、正常に動くかどうかは不明ですが、もしよろしかったらお試しください。

situmontarou123
質問者

お礼

kkkkkmさん ありがとうございます^^ さっそく試してみます!

  • kkkkkm
  • ベストアンサー率65% (1620/2459)
回答No.4

> よろしければ、再度お知恵を貸していただけませんでしょうかm(_ _)m 示されたコードで希望の動作になるのかどうかはこちらではテストできませんが、別シートのセルを参照するときには以下のようにしてください。 Sheet2のセルの場合 With Sheets("Sheet2") .Range("a1").Value = 1 '↑Rangeの前にドットがあります。ドットのあるRangeだけSheet2のセルの指定となります。ドットがなければシートモジュールでしたらそのシートのセルを、標準モジュールとフォームのモジュールでしたらアクティブなシートのセルの指定となります。 End With

situmontarou123
質問者

お礼

kkkkkmさん ご回答いただき、ありがとうございます。 無知な私にはこれ以上無理そうです・・・ もう少し勉強してチャレンジしてみます。 ありがとうございました。

  • kkkkkm
  • ベストアンサー率65% (1620/2459)
回答No.3

> 試してみましたがうまくカウントされませんでした。 すみません、画像が小さかったのでよく見えてなくてC列だけをカウントしてました。A列&B列&C列を一塊としてカウントしていってるのですね。WorksheetFunction.CountIfはセルに書きこむCOUNTIF関数と同じですので現状で利用されているD列の式をそのまま応用してみてください。

situmontarou123
質問者

お礼

返事が遅くなってすいません。 その後も毎日試行錯誤しておりますが・・・うまくいかないもんですね・・・。 元のセルに入っている式は下記です。 今は、この列をオートフィルでコピーしている状態です。 B列は西暦 C列は月 F列は区分 といった内容でカウントしています。(I列に式が入っていて、その年月通し番号が出るようになってます) 利用中の関数: =IF(COUNT(A588)=1,COUNTIFS(B$2:B588,B588,C$2:C588,C588,F$2:F588,F588),IF(A588="","",COUNTIFS(B$2:B588,B588,C$2:C588,C588,F$2:F588,F588))) 利用中の関数をどのように応用したらよいかわからず、下記内容に至ったのですが別シートで入力しているためRangeがうまく動きません。 Range("I" & Range("C" & Rows.Count).End(xlUp).Row) = WorksheetFunction.CountIfs(Range("B:B"), Range("B" & Range("B" & Rows.Count).End(xlUp).Row), Range("C:C"), Range("C" & Range("C" & Rows.Count).End(xlUp).Row), Range("F:F"), Range("F" & Range("F" & Rows.Count).End(xlUp).Row)) よろしければ、再度お知恵を貸していただけませんでしょうかm(_ _)m よろしくお願いします。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.2

こんばんは! 解釈が違っていたらごめんなさい。 A列~C列データが入力されたタイミングで、空白セルがない場合にマクロが動くようにしてみました。 画面左下の操作したいSheet見出し上で右クリック → コードの表示 → VBE画面のカーソルが点滅しているところに ↓のコードをコピー%&ペースト → Excel画面に戻りA~C列にデータを入力してみてください。 Private Sub Worksheet_Change(ByVal Target As Range) 'この行から Dim i As Long, lastRow As Long If Intersect(Target, Range("A:C")) Is Nothing Or Target.Count > 1 Then Exit Sub i = Target.Row If WorksheetFunction.Count(Cells(i, "A").Resize(, 3)) = 3 Then Application.ScreenUpdating = False lastRow = Cells(Rows.Count, "A").End(xlUp).Row Range("A:A").Insert Range(Cells(2, "A"), Cells(lastRow, "A")).Formula = "=B2&""_""&C2&""_""&D2" With Range(Cells(2, "E"), Cells(lastRow, "E")) .Formula = "=COUNTIF(A$2:A2,A2)" .Value = .Value End With Range("A:A").Delete Application.ScreenUpdating = True End If End Sub 'この行まで こんな感じで良いのでしょうか? ※ 関数をそのまま利用しているだけです。m(_ _)m

situmontarou123
質問者

お礼

返事が遅くなってすいません。 ご回答ありがとうございます。 試してみたのですが、うまくカウントしてくれませんでした。 ありがとうございます。

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

> フォームを利用して新しいデータは最終行に反映するように設定しています。 そのコードの最後に Range("D" & Range("C" & Rows.Count).End(xlUp).Row) = WorksheetFunction.CountIf(Range("C:C"), Range("C" & Range("C" & Rows.Count).End(xlUp).Row)) みたいなコードを入れてください。

situmontarou123
質問者

お礼

kkkkkmさん さっそくのご回答ありがとうございます。 試してみましたがうまくカウントされませんでした。 それと伝え忘れていたのですが、D列以降も利用してE列に商品名 F列に金額 といった感じです。

関連するQ&A

  • エクセルVBA(ユーザーフォーム)について質問です

    たとえばユーザーフォームを表示させSheet1のA列最終行へ入力させることは出来ましたが 同時にSheet2のA列の最終行にも同じく反映させたい

  • エクセルVBAで最終行取得ができない

    エクセルVBAでたとえばC列にどこまでデータが入力されているかを調べるとき、通常は r = Cells(Rows.Count, "C").End(xlUp).Row などでできます。 しかし添付画像のような入力フォームが出来上がっており、かつC列に最初から何らか(画像では〒マーク)の入力がされているので、そこに回答者が途中まで入力された場合、これでは最終行は取得できません。 逆に上からEnd(xlDown)でやろうとしても、途中に空白セルがあってお手上げです。 余分な〒マークを元データから削除してしまいたいのですがそれでは入力されているところのマークまで消えてしまいます。 このようなファイルが何百もあり、それを1枚のシートにまとめようとしているのですが、この最終行取得でつまずいてしまいました。 どのような方法があるでしょうか? 画像はエクセル2013ですが、実際にマクロを動かすのは2010です。

  • エクセル VBA

    最終行から順番に下へ同列で入力するVBAを教えて下さい。 EXCELのVBAで教えて下さい。 シート1のA列にはB列が入力されると自動入力されるNo.があり、C~G列もB列が入力されると自動入力されます。 B列には日付が、H列には3~4桁の数字が入力したいのですが、 入力行は必ず最下行のセルB、Gな為、VBAでフォームを作成し、 入力実行ボタンを押すことにより、最下行のセルB、Gに反映されるように したいです。 又、上記入力後に、シート2のH~N列をコピーして、シート3のA~G列に値のみの貼り付けを行い保存した後、シート3のA~G列をコピーして csvファイルを作成して保存したいです。 一連の流れを、フォームの入力実行ボタンを押すことで実行したいのですができるのでしょうか? 宜しく御願い致します。

  • ExcelのVBAについて教えて下さい

    今、日報の作成をしているのですが 1行目に「1」を入れると、C列の3行目~15行目までがねずみ色になって 休みを意味するように条件付書式を設定しています。 しかし、1を入力というのも不細工だと思い、そのセルの上に コマンドボタンをおいて、 それを押すと下のセルに1が入力されるマクロを作ろうと思ったのですが、 1を入力するまでは良いんですが、 今度同じボタンでもう一度押すと消える、 さらにもう一度押すと1が入力される、 なんていうマクロは組めますか? マクロの記録で、下記のような式は得たのですが つなぎ方等々、分からない事ばかりで出来ません。 どなたか教えて下さい。お願いします。 * * * * * * * * * * * * * * * * * * * * * * * * * * * * Private Sub CommandButton1_Click() Range("D1").Select ActiveCell.FormulaR1C1 = "1" Range("D1").Select Selection.ClearContents End Sub

  • Excel VBAのカウントについて

    Excel2003で表を作成しています。 画像のような表を作成しているのですが、 左のデータから右の表に数を入力するのに、VBAで出来ないでしょうか? COUNTIFを使おうと思ったのですが、COUNTの条件が3つありますし、 左のABCの列は500行くらいデータが入っているので出来ればVBAで出来たらと思いました。

  • EXCEL VBAの構成について

    本を買ったのですが分からないので教えて下さい。 表の最終行のA列からD列をコピーして、Y列の最終行にの1行下に貼り付けたいのですが、どうやって、構文を入力したらいいですか? お願いします。

  • (Excel VBA)困っています・・・orz

    エクセルを使うとある業務でマクロを組み、最適化を図ろうと試みているのですが 気がつけば高度な領域に突入していまして、僕みたいなレベルじゃ全然???な状況になってしまいました。 まず A列の1行目から任意の行に(10行までしかなかったり、1000行まであったりとランダムにあるとする)、任意の文字列(ABCなど)があるとします。 それからオートフィルタを使い、A列からある任意の文字列(ABCなど)を検索条件にしてデータを抽出します。 抽出されたデータベースのA列には検索条件にある「ABC」が任意の行まであり、その抽出されたデーターベースのD列に今度は「XYZ」とという文字列を 抽出された分の最終行まで割り振る・・・ つまりA列《ABC》で検索され抽出されたデータのD列には《XYZ》が自動に入力される もし、検索条件(ABC)で抽出されたデータが「0」件だった場合は、D列には何もせず、次の検索条件に進む・・・ というものをマクロで組みたいのですがどうやったらよいのでしょうか?? 何卒、ご教授お願い致します。

  • エクセル VBA 入力パターンごとの結果

    関数でもできると思うのですが、データが膨大ですごく重くなります。できたらマクロでと思ったのですが、自分ではうまくできませんでした。よろしくお願い致します。 D列5行目から、10000行目までに以下の条件で入力された場合の結果です。 【パターン(1)】 ・”1”と入力された場合、(同じ行の)GからS列までに、”1”と自動入力。 ・”2”と入力された場合、(同じ行の)GからT列までに、”1”と自動入力。 ・”3”と入力された場合、(同じ行の)HからU列までに、”1”と自動入力。 ・”4”と入力された場合、(同じ行の)IからV列までに、”1”と自動入力。 と各種パターンがあります。 【パターン(2)】 各行にパターン(1)が入力されたあと、以下の条件を加えたいのです。 E列5行目から、10000行目までに以下の条件が入ります。 ・”1”と入力された場合、(同じ行の)I列は”0”に入力が変わる ・”2”と入力された場合、(同じ行の)J列は”0”に入力が変わる。 ・”3”と入力された場合、(同じ行の)K列は”0”に入力が変わる ・”4”と入力された場合、(同じ行の)L列は”0”に入力が変わる

  • エクセル条件式について質問です

    A行に「平日」or「土日」をいれて1列目B~Dまでは時間割が入ります。 B2~D5は該当箇所に○マークを入力します。 A行に「平日」でかつB~D行に○マークが入った日の ○マークの合計を求める計算式はどうなるでしょうか。 条件分岐 Sumif や Countif を使って数式はできますか、(VBマクロなどは分かりませんので) よろしくおねがいします。

  • エクセルVBAについて

    エクセルVBAについての質問です。A1、B1と順に入力していき、最終 F1列にカーソルがいったときに(F1を空欄のまま)エンターキーを押すと次の行のD2にカーソルが飛ぶ、そしてD2、E2に入力をして、G列にカーソルを動かしエンターキーで次の行のA列にカーソルが移動する、こんな操作をしたいのですが。つまりF列にカーソルがいったらカーソルは次の行のD列に飛び、G列にカーソルがいったら次の行の先頭つまりA列にカーソルが移動するように。VBA初心者でもつくれるかどうか、よろしくお願いします。

専門家に質問してみよう