• 締切済み

VBAについて

こんばんは、VBA初心者で勉強をはじめたばかりで、自分で例題を作り調べながら途中まで作成しましたが、行き詰ったのでご教授をお願いします。ECXEL2000を使用しています。 ○やりたいこと。 ・INPUTBOXを表示させ、年齢を入力してもらう。 ・年齢が、18~64歳までならA2セルに入力年齢を表示させる。     17以下は「就職前」、65歳以上は「退職済」とBOXで表示させ、セルには表示させない。 ・A2セルに入力したら、A3セルをセレクトする。 ・INPUTBOXを表示させ、再度年齢入力をしてもらい、既にA2セルに年齢が入力済みであれば、A3に表示する。これをA10セルまで行えるようにする(その都度マクロの実行で実施) ○作成したマクロです。・・・やりたいことがすべて記述できていません。 Sub 年齢入力() 'INPUTBOXに入力される年齢の変数   Dim r As Integer 'データの最終行を代入する変数 Dim k As Long r = InputBox("年齢入力") k = Rows.Count Range("a2").Select If 17 < r And r < 65 Then MsgBox ("入力します") Range("a2") = r ElseIf r >= 65 Then MsgBox ("退職済") ElseIf r <= 17 Then MsgBox ("就職前") End If Cells(k, 1).End(xlUp).Offset(1).Select End Sub 以上のマクロのどこを変更すれば、私のやりたいことができるようになりますでしょうか?よろしくお願いします。

みんなの回答

  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.2

一例です。 ★部分を変更しました。 データ未入力(含むキャンセル)、文字列の場合、InputBoxの実行エラーになるのでこの辺りも配慮した方がよい(サンプルでは入力を無視しました) Sub 年齢入力() Dim r As String '← ★ Dim k As Long r = InputBox("年齢入力") If r = "" Then Exit Sub '←★ k = Cells(Rows.Count, 1).End(xlUp).Row '←★ If k > 9 Then MsgBox "入力域オーバ": Exit Sub '←★ If 17 < r And r < 65 Then MsgBox ("入力します") Cells(k, 1).Offset(1) = r ElseIf r >= 65 Then MsgBox ("退職済") ElseIf r <= 17 Then MsgBox ("就職前") End If End Sub

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

Sub test01() p1: x = InputBox("年令=") If x = 99 Then Exit Sub If x >= 18 And x <= 64 Then d = Range("A65536").End(xlUp).Row Cells(d + 1, "A") = x ElseIf x < 18 Then MsgBox "就職前" Else MsgBox "退職後" End If GoTo p1 End Sub 終わる場合は99を入れる約束とする。>その都度マクロの実行で実施、には従ってない。 例題だからいいが、実践ではエクセルはシートにはデータを手入力するのが基本で、このような手の込んだことは考えるな。 データーフォームなどというのもある。

sukeroku111
質問者

お礼

こんばんは、早速の回答ありがとうございます。 一つ一つ勉強させていただきます。 たしかに実践ではシートに手入力になりますね!!今回は勉強のためということで・・・!! 本当にありがとうございました。

関連するQ&A

  • EXEL VBAで印刷の指定をしたいのですが

    VBA初心者、勉強中です。 sheet1に2つの表がありまして下記のとおりボタンをクリックしたらインプットボックスが立ち上がって2つの表の1か2を指定したら範囲がぷれびゅーするということなんですが、1を入れても、2を入れてもMsgBox "1か2を入力して!しか表示しません。 さんざん調べまくりましたが、どなたかご教授お願いします。 Sub 印刷() Dim SentP As Integer On Error Resume Next SentS = InputBox("どちらを印刷?1売上 2材料") If SentP = 1 Then Range("a1:g32").Select Selection.printpreiew ElseIf SentP = 2 Then Range("j1:n41").Select Selection.PrintPreview Else MsgBox "1か2を入力して!" End If End Sub

  • EXCEL VBA これであっていますか?

    エクセルに地図を貼り付け、その中のある地点Aから半径1キロ、2キロ、3キロといった具合に円を描いています。ある地点B、Cも同様に円があります。セルに“A” と入力した際に該当する地点の円(1キロ、2キロ、3キロの3種類)を赤く表示し、終了すると円が消える(線なしに変わる)ようにするために以下のようなVBAを組みました。が、円が2つしか赤くならなかったり、 ばあいによっては「インデックスが境界を超えています」とエラーが出たりします。 どうしたら良いか教えてください。 Sub iro() Dim i As Variant i = InputBox("表示する地点を指定してください", "地点指定") If i = "A" Then ActiveSheet.Shapes(1).Select ActiveSheet.Shapes(2).Select ActiveSheet.Shapes(3).Select Replace:=False hyoji MsgBox "表示を終了してよろしいですか", vbOKOnly ActiveSheet.Shapes(1).Select ActiveSheet.Shapes(2).Select ActiveSheet.Shapes(3).Select Replace:=False modosu ElseIf i = "B" Then ActiveSheet.Shapes(4).Select ActiveSheet.Shapes(5).Select ActiveSheet.Shapes(6).Select Replace:=False hyoji MsgBox "表示を終了してよろしいですか", vbOKOnly ActiveSheet.Shapes(4).Select ActiveSheet.Shapes(5).Select ActiveSheet.Shapes(6).Select Replace:=False Else MsgBox "指定した地点がありません", vbOKOnly End If End Sub Sub hyoji() Selection.ShapeRange.Line.Visible = msoTrue '「線なし」に設定されている場合、線を表示 Selection.ShapeRange.Line.ForeColor.SchemeColor = 10 Range("A1").Select End Sub Sub modosu() Selection.ShapeRange.Line.Visible = msoFalse '「線なし」に設定 Range("A1").Select End Sub

  • Excel VBAについて

    Excelで、指定したセル範囲の外枠に罫線を引き四角形を作り、B1の数字を変えていくと四角形を横に描いていくというマクロを作成したのですが、B1の数値を変えてマクロを実行すると以前に描いた四角形が残ってしまいます。これを数値を変えてマクロを実行すると、以前の四角形を消して新たに四角形を描くにはどうすればよいのでしょうか。何かいい方法があれば教えてください。宜しくお願いします。以下にコードを示しておきます。 Public Sub Main_Code() a = ThisWorkbook.Worksheets("Sheet1").Range("B1") If a = 2 Then Range("I26:K35").Select Selection.BorderAround Weight:=xlMedium Range("B1").Select ElseIf a > 2 Then Dim i As Integer For i = 3 To a Range("I26:K35").Select Selection.BorderAround Weight:=xlMedium Range("I26:K35").Select Selection.Copy Cells(26, 3 * i + 3).Select ActiveSheet.Paste Application.CutCopyMode = False Range("B1").Select  Next i  End If End Sub

  • 作成したVBAの改善点をお願いします(初心者)。

    こんばんは。VBAを勉強中ですが、参考書等を見ながら簡単なプログラムを作ってみましたが、もっと簡単な記述やベテランの方から見た改善点等があれば教えていただければと思います。(EXCEL2000を使用しています)。 ★内容 ・inputboxを使用し印刷枚数を入力し、印刷するものです(印刷枚数は1枚以上31枚以下)。 ・(K23)のセルには通し番号が入っており、印刷した枚数分だけ通し番号に1ずつ足していく。 Sub 印刷() Dim aaa As Integer aaa = InputBox("印刷枚数を入力してください", "印刷枚数", "") If 1 <= aaa And aaa <= 31 Then MsgBox "印刷を開始します" ElseIf aaa = "" Then MsgBox "キャンセルされました" ElseIf IsNumeric(aaa) = False Then MsgBox "入力内容が違います" ElseIf aaa <= 31 Then MsgBox "31日までの範囲で入力してください" Else For i = 0 To aaa Worksheets(1).PrintOut Worksheets(1).Range("k23").Value = Range("k23") + 1 Next i End If End Sub 一応、動きますが、勉強中なのでご教授をお願いいたします。

  • エクセルVBAでTargetのセルに設定された「名前の定義」の取得方法は?

    例えば、A1、B2、C3セルに「名前の定義」で、それぞれ入力A、入力B、入力C という名前がつけてあります。 それらのセルに入力があった場合、Select Caseで分岐させ作動するマクロをつくりました。 簡略化すると以下のようなもので、一応正しく作動します。 Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("入力A,入力B,入力C")) Is Nothing Then Exit Sub Select Case Target.Address(0, 0) Case "A1" MsgBox "A処理します。" Case "B2" MsgBox "B処理します。" Case "C3" MsgBox "C処理します。" End Select End Sub ただ、せっかくセルに名前を定義してあるのに、個々の入力セルの判定をTarget.Addressでしているのが不満です。 ( ̄~ ̄;) 定義された名前を使えないかと以下のようにやってみましたが実行時エラーで「サポートしてません」となってしまいます。 (T.T) Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("入力A,入力B,入力C")) Is Nothing Then Exit Sub Select Case Target.Names.Name 'ここでエラー Case "入力A" MsgBox "A処理します。" Case "入力B" MsgBox "B処理します。" Case "入力C" MsgBox "C処理します。" End Select End Sub どうやったら、Targetに設定されている名前を取得できるのでしょうか? (^∇^`)? 実際の例はもっと対象が多いので、Select Caseを使わない以下の方法は避けたいのです。 If文の羅列(これでも正しく作動はします。) Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("入力A,入力B,入力C")) Is Nothing Then Exit Sub If Not Intersect(Target, Range("入力A")) Is Nothing Then MsgBox "A処理します。" ElseIf Not Intersect(Target, Range("入力B")) Is Nothing Then MsgBox "B処理します。" Else MsgBox "C処理します。" End If End Sub なにとぞよろしくお願いします。 (o。_。)oペコッ

  • エクセル2003 特定のセルがブランクの場合

    会社でエクセル2003を使っています。 縦にデータを入力する表を作りました。 (1)氏名 (2)〒 (3)住所 (4)電話番号 (5)生年月日 (6)性別・・・など20項目を入力します。 入力完了後、別シートにデータを転記してそちらの別シートを印刷するというマクロを作りました。 例えば、その中で入力を絶対してほしい項目がありまして、それを忘れていたらメッセージボックスで「○○が未入力です」とお知らせしたいと思ってます。 いろんなサイトで調べてみたのですが…うまくいかなくて… 例文に従って作ってみたのが Sub 円楕円4_Click() Dim Lesson16 As Range Dim 会員名簿 As Worksheet If 会員名簿.Range("A8") = "" Then MsgBox "氏名が記入されていません。" 会員名簿.Range("A8").Select Exit Sub ElseIf 会員名簿.Range("A9") = "" Then MsgBox "住所が記入されていません。" 会員名簿.Range("A9").Select Exit Sub ElseIf 会員名簿.Range("A10") = "" Then MsgBox "年齢が記入されていません。 " 会員名簿.Range("A10").Select Exit Sub ElseIf 会員名簿.Range("A15") = "" Then MsgBox "生年月日が記入されていません。" 会員名簿.Range("A15").Select Exit Sub ThisWorkbook.SaveAs Lesson16 End Sub     です。 家で作ったサンプルなので、セル番号もちょっと???なのですがお許しください。 入力するデータの全てが必須入力項目ではなくて、20項目のうち7項目が必須項目と考えています。 この項目が未入力であれば「未入力ですよ」とお知らせしたいのです。 また、上の例文のセル番号は単独ですが、会社のファイルのセルは結合しています。 (たとえばA8:C8、A15:G15)と行によって結合範囲も違います。 ど素人の質問で、わかりにくいとは思いますが なにとぞ、アドバイスいただきますようよろしくお願いします。

  • VBAのinputboxで何もいれずに[OK]を押した時エラーになります

    よろしくお願い致します。 EXCELのVBAで「inputbox」を使ってセルを選択させたいと考えております。 下記のコードだと「キャンセル」や「×」で閉じられた時はmsgbox「キャンセル」が出てExit subするのですが、何も入力しないで「OK」を押した場合がどうしてもエラー(入力した数式は正しくありません)になります。 いろいろ調べて試したのですがどうしてもできず困っています。 どなたか教えてください。 Sub test() Dim myAns As Range On Error Resume Next Set myAns = Application.InputBox(Prompt:="セルを選択してください。", Title:="セル選択", Type:=8) On Error GoTo 0 If myAns Is Nothing Then MsgBox "キャンセル" Exit Sub ElseIf myAns = "" Then MsgBox "最低1つは選択してください" Exit Sub Else MsgBox myAns.Address(0, 0) End If End sub

  • エクセル VBAで

    変動する数値が、セル A1に入る状況で、 該当シートに Private Sub Worksheet_Change(ByVal Target As Range) If Range("A1").Value = 1 Then Range("C62").Value = "○" ElseIf Range("A1").Value = 2 Then Range("C62:C63").Value = "○" ElseIf Range("A1").Value = 3 Then Range("C62:C64").Value = "○" ElseIf Range("A1").Value = 4 Then Range("C62:C65").Value = "○" ElseIf Range("A1").Value = 5 Then Range("C62:C66").Value = "○" ElseIf Range("A1").Value = 6 Then Range("C62:C67").Value = "○" ElseIf Range("A1").Value = 7 Then Range("C62:C68").Value = "○" ElseIf Range("A1").Value = 8 Then Range("C62:C69").Value = "○" ElseIf Range("A1").Value = 9 Then Range("C62:C70").Value = "○" ElseIf Range("A1").Value = 10 Then Range("C62:C71").Value = "○" ElseIf Range("A1").Value = 11 Then Range("C62:C72").Value = "○" ElseIf Range("A1").Value = 12 Then Range("C62:C73").Value = "○" ElseIf Range("A1").Value = 13 Then Range("C62:C74").Value = "○" ElseIf Range("A1").Value = 14 Then Range("C62:C75").Value = "○" ElseIf Range("A1").Value = 15 Then Range("C62:C76").Value = "○" End If End Sub と言ったマクロを記述しましたが、 動作がどうにも重くて困っています。 一度、プレビューをした後は特に遅くなります。 何か良い解決方法はありますでしょうか?

  • EXCEL VBAの シートへのデータの表示

    とても単純な条件式なのですが、 どうしても値が表示されるセルとされないセルがあります。 どうしたらよいのでしょうか? 下記のような指定をしています。    K3Sa2D、K3SaWDは変数で値は入っています。(デバッグモードで確認)    しかしQ68のセルは表示されるのに、L72には表示されません。    シートもSelectしています。 If K3Sa2D > 0 Then Range("Q68") = Range("Q68") + K3Sa2D ElseIf K3SaWD > 0 Then Range("L72") = Range("L72") + K3SaWD End If 単純なことかもしれませんが、宜しくお願いします。 どうか対応をおねがいします!

  • 初心者です。エクセルVBAの質問なのですが・・・

    エクセルのVBAで 例えば・・・IF関数を使いたい時に Public Sub 練習() 年齢 = InputBox("あなたは何歳ですか。数字だけを入力して下さい。") If 年齢 < 20 Then MsgBox "未成年ですね" ElseIf 年齢 < 30 Then MsgBox "20代ですね。" Else MsgBox "その他の年代ですね" End If End Sub                            のようなものを作って、実行をしたときに、数字を入れてOKボタンではなく、ダイアログボックスのキャンセルや閉じるボタンを押したときに、「その他の年代ですね」が出てきますが、それを出てこないようにすることはできますか?(例えば、キャンセルボタンのような役割をさせるなど・・・)  結構難しいですかね? 教えて下さい。お願いします。