エクセルのマクロ(データベースの登録フォーム)について
未読分:4件
昨日以降(0) 2日前以降(0) 3日前以降(0) 4日前以降(0) 5日前以降(0)
近田 伸矢, 植木 悠二, 上田 寛
IEのデータ収集&自動操作のプログラミング本はこの1冊だけ!IEの起動やポップアップウィンドウ、表示を制御する基本的なコードはもちろん、テキストボックスやラジオボタン、表、ハイパーリンクなどのHTML部品を制御する方法など、自動操作に欠かせないノウハウを丁寧に解説。
Message#4 2014年12月16日(火)14時09分 From: ちゃーちゃー | 返事 削除 変更 |
Sub 累積保存() Dim lRow As Long lRow = Worksheets("Sheet2").Range("C" & Rows.Count).End(xlUp).Row + 1 If lRow < 5 Then lRow = 5 With Worksheets("Sheet1") Worksheets("Sheet2").Cells(lRow, 3).Value = .Cells(1, 2).Value Worksheets("Sheet2").Cells(lRow, 4).Value = .Cells(2, 2).Value Worksheets("Sheet2").Cells(lRow, 5).Value = .Cells(3, 2).Value End With End Sub |
Message#3 2014年12月16日(火)14時07分 From: マスタージョイン | 返事 削除 変更 |
ご質問の内容は やりたい事が解りやすく整理されていて 質問者の素養が感じられて好印象をえました! そこで、どうせなら1から始めましょう 1)とりあえず1言 産地コード、産地-->産地マスタ シートを作成して置く 種別コード、種別-->種別マスタ シートを作成して置く --都道府県コード(JIS規格) 産地マスタ--- A列 、 B列 産地コード、産地名 1 北海道 2 青森県 3 4 5 6 : : : : 47 沖縄県 ----------------------------- 2)TextBox3~TextBox8はやめて ComboBox1~ComboBox6に変更しましょう。理由は いちいち都道府県をテキスト入力するのは効率が悪いしタイプミスもあり得るので次に説明する方法でComboBoxにセットしておきましょう。 ///////コンボ設定方法////// VBAエディターで左ペインのUserForm1を右クリック->コード表示を左クリック 右ペインの左上▼でUserform を選択 右上の▼でInitialize を選択すると以下のような空っぽのイベントサブプロシージャができます。 これは、ユーザーフォームがShow ()やLoadで メモリに最初に読み込まれた時に1回だけ発生するイベントです。 HideのあとのShowでは発生しません。 ちなみにUserForm_Activate()イベントはアクティブになるたびに呼び出されるイベントです。どのタイミングでマスタを読むのか? たとえば商品マスタなどは稼働中に追加変更される場合を考えてUserForm_Activate()やWorkSheet_Change()イベントなどでComboBoxを再設定します。 ここでは都道府県なので、フォーム表示中の変更は無いはずなのでInitialize()で良いと思います。 [動作条件] Sheets("産地マスタ")に上記説明の都道府県データが有ること。 UserForm1.Show (vbModeless)でテストしてみてください。 ■以下をUserForm1のコード域へコピペしてください■ Private Sub ComboBox1_Change() TextBox9 = ComboBox1.Value End Sub Private Sub ComboBox2_Change() TextBox10 = ComboBox2.Value End Sub Private Sub ComboBox3_Change() TextBox11 = ComboBox3.Value End Sub Private Sub ComboBox4_Change() TextBox12 = ComboBox4.Value End Sub Private Sub ComboBox5_Change() TextBox13 = ComboBox5.Value End Sub Private Sub ComboBox6_Change() TextBox14 = ComboBox6.Value End Sub Private Sub UserForm_Initialize() Dim Rmax As Long Dim i As Byte Dim c As Byte With Sheets("産地マスタ") '1行目が見出しの場合沖縄は48行目ですが '最終行を得る方法として 最下行からCTRL+↑で止まったセルの行を得る方法が一般的です '他にSpecialCells()でVBA内の既定の定数を利用して範囲指定する場合もあります 'xlCellTypeConstants 定数が含まれているセル 定数値= 2 'xlCellTypeFormulas 数式が含まれているセル 定数値= - 4123 'この場合以下の2行の結果Rmaxの値は同じですが 途中に空白行があると結果は異なります。 ' 別法 Rmax = .Columns(1).SpecialCells(xlCellTypeConstants).Rows.Count Rmax = .Cells(Cells.Rows.Count, "A").End(xlUp).Row For i = 2 To Rmax For c = 1 To 6 Controls("Combobox" & c).ColumnCount = 2 Controls("Combobox" & c).TextColumn = 2 Controls("Combobox" & c).BoundColumn = 1 Controls("Combobox" & c).ColumnWidths = "0.4 Cm;2 Cm" Controls("Combobox" & c).AddItem Controls("Combobox" & c).List(i - 2, 0) = .Cells(i, "A") '産地名code Controls("Combobox" & c).List(i - 2, 1) = .Cells(i, "B") '産地名 Next Next End With End Sub 今後私宛に質問くだされば、何度でも回答します。段階的に行きましょう! |
Message#2 2014年12月15日(月)21時08分 From: VBAマスター | 返事 削除 変更 |
あまりにも内容が多すぎるのではまずは処理の流れを頭に入れてから考えたらどうですか? 答えを載せたところで、エラーなどが起きた場合に対応できませんよ。 とりあえず@シートに追加したい行数を求めます。のところだけでいうと 行数を求めるには最終行をVBAで取得してから、for〜Nextステートメントを利用して、 1行ずつチェックしていくといいでしょうね。 どのような構成かは分かりませんが、簡単にいうと以下のような形になるかと思います。 r=.Cells(Rows.Count, 1).End(xlUp).row for i=1 to r チェック内容 next i |
Message#1 2014年12月15日(月)21時01分 From: ジャック | 返事 削除 変更 |
エクセルマクロ初心者です。 エクセルのマクロ(データベースの登録フォーム)についてご教授お願いいたします。 大変長く、拙い文章となっております。 申し訳ございません。 また画像を参照してしていただけますと幸いです。 下記を登録ボタン(CommandButton1)を押した際に起動させたいと思っております。 @シートに追加したい行数を求めます。 産地に配置されたテキストボックス(TextBox3~8)の空白では無い物の数 × 種別に配置されたテキストボックスの空白では無い物の数(TextBox21~26)の数字を求めます。 例)全てが埋まっている場合6×6=36 TextBox3、TextBox4ならびにTextBox21が記載されている場合は2×1=2 (TextBoxは必ず若い数字の順に埋めます) 伝達事項1(TextBox27)が記載無しの場合、上記の数字+0 伝達事項1(TextBox27)が記載有り、伝達事項2(TextBox29)が記載無しの場合、上記の数字+1 伝達事項1(TextBox27)が記載有り、伝達事項2(TextBox29)も記載有りの場合、上記の数字+2 ※伝達事項1が記載無し、伝達事項2が記載無しのケースはありません。 ここで求めた数値を行数とします。 例)産地(TextBox3~8)・種別(TextBox21~26)がすべて埋まっていて、伝達事項1が記載有り、伝達事項2も記載有りの場合6×6+2=38 Aシートに行数を追加する。 追加シート名(ListBox1)で選択されたシート名を検索する。 ※ListBox1にはフォームを開いた時点で Sub Macro1() UserForm1.Show Dim sh As Worksheet For Each sh In ActiveWorkbook.Sheets UserForm1.ListBox1.AddItem (sh.Name) Next End Sub 上記マクロでシート名を読み込んでいます。 選択されたシートに@で求めた行数を最下行に加えます。 Bデータの入力 上記で選択されたシートに A列に品番(TextBox1) B列に産地(TextBox3-8) C列に産地コード(TextBox9-14) D列に種別(TextBox15-20) E列に種別コード(TextBox21-26) F列に価格(TextBox14) G列に伝達事項(TextBox27、29) H列に伝達相手(TextBox28、29) の値を入力していきます。 データ入力のルールは B-1)追加した行数の全てに記載するもの A列の品番(TextBox1)、F列の価格(TextBox14) B-2)追加した行数にTextBoxに記載されたデータに依存して記載するもの B列の産地(TextBox3-8)、C列の産地コード(TextBox9-14)、D列の種別(TextBox15-20)、E列の種別コード(TextBox21-26) ※必ず (TextBox3-8)に入力されたデータの数=(TextBox9-14)入力されたデータの数かつ (TextBox15-20)に入力されたデータの数=(TextBox21-26)入力されたデータの数です。 B-3)固定で最下行に追加するもの G列の伝達事項(TextBox27、29)、H列(TextBox28、29)の伝達相手です。 ※必ず (TextBox27、29)に入力されたデータの数=(TextBox28、29)入力されたデータの数です。 B-2)TextBoxに記載されたデータに依存して記載するもののデータ入力ルールは まず上の行からD列ならびにE列にTextBoxの数字が若い順にTextBoxに記載された内容を入力。 これを1ブロックとします。 それを産地に記載されたデータの個数分だけ繰り返す。 B列ならびにC列には1ブロックごとにTextBoxの数字が若い順にTextBoxに記載された内容を入力。 B-3)固定で最下行に追加するもの aとbの処理終了後、 伝達事項1(TextBox27)が記載無しの場合、 処理完了。 伝達事項1(TextBox27)が記載有り、伝達事項2(TextBox29)が記載無しの場合、 最下行のG列に伝達事項1(TextBox27)の内容を、最下行のH列に伝達相手1(TextBox28)の内容を記載 伝達事項1(TextBox27)が記載有り、伝達事項2(TextBox29)も記載有りの場合、 最下行の一つ上のG列に伝達事項1(TextBox27)の内容を、最下行の一つ上のH列に伝達相手1(TextBox28)の内容を記載 最下行のG列に伝達事項1(TextBox27)の内容を、最下行のH列に伝達相手1(TextBox28)の内容を記載 以上の処理を行いたいと思っております。 大変長い文章ならびに多くの処理が必要かと思います。 また大変拙い文章で誠に申し訳ございません。 つきましては、上記のマクロの記述(一部でも大変有難く存じます。)をご教授いただけませんでしょうか。 当方、現在エクセルのVBAを勉強している最中なのですが、若い頃に仕事を含めコンピューターを使うことが無かった為、かなり苦戦しております。 皆様のお力添えいただけますと幸いでございます。 長文失礼いたします。 何卒よろしくお願い申し上げます。 画像参考URLです。 フォーム http://www.fastpic.jp/images.php?file=3437327040.jpg 実行例@ http://www.fastpic.jp/images.php?file=0377730932.jpg 実行例A http://www.fastpic.jp/images.php?file=5270884660.jpg |
昨日以降 2日前以降 3日前以降 4日前以降 5日前以降