• ベストアンサー

プログラムの作り方

noname#245936の回答

noname#245936
noname#245936
回答No.1

IT屋のものです。 んー、私も昔、そういうプログラムから始めたような気がします。 Excelマクロは入門しやすいので。 何でもやってみるのはいいことだと思います。 さて、結論から申しますと。 エクセルのセル上、つまり画面上のデータを直接プログラムで ゴソゴソいじる貴方の方法は、ちょっとしんどいと思います。 何故かというと、 ・Excelの表は各セルの条件がとても緩く、入力審査しづらい。  (例えば、数字を入力すべき所に文字を入れたりできる) ・画面に依存したプログラムを作ると、  (1)処理が遅い、プログラムがとてつもなく長くなりやすい。  (2)データの構成が変わったとき(例えば1列でも増えると)   プログラムの変更箇所が膨大になる。  (3)画面依存プログラムは、画面であるソフトのバージョン(Excel)   に依存するため、バージョンアップに弱い。 …という理由で、普通はこういうテーブルを扱うプログラムは、 画面とデータを分けて作るのが一般です。 「データベース -> プログラム -> 画面や帳票、Excel」 という感じです。 データベースは一般に、SQLと呼ばれる汎用構文で操作できるので 貴方のDBの場合なら 「SELECT B列,C列 FROM Table Where B列 IN ('X','Y')」という 構文で読めます。 DBアクセスのプログラミングに関しては、別途書籍など参照ください。 なお、Excelのセルを、PickUpする、グループ集計をするなどは プログラムが無くても、フィルタリング、ソート、ピボット、集計 関数で目的の動きを一瞬でさせることができるので、どうしても プログラムを書きたければ、そこを制御するプログラムを書いた方が とても短いプログラムになることが一つ。 また、単にプログラムで行列の配列を単純に取り扱ってみたいと いうことであれば、構造体配列を使った方がいいことも一つ。 例) '列の定義 private type typTableCols ColX as integer ColY As string End type '表の定義 Private tblData() As typTableCols 'コレで2次元配列 …アクセスするときは、tblData(1).ColX = "X" というように 見やすい文章でアクセス可能 もっといえば、単に50,000件以下のDBを扱うなら、手っ取り早く FileMakerなどの商品を使うのも手。 …と思います。 最近は、何でもかんでもプログラムを書かず、各ソフトの特徴を知り 便利な部分だけをつなぎ合わせたようなプログラムを書くほうが 効率的ではあります。 …が、何でもチャレンジはいいことだと思います。 がんばってください。 なお、Excelで完全にDBアプリを作ろうとすると、まず難問に かかるのは、「行確定の判断」になるでしょう。

nosense
質問者

お礼

早速のご回答、誠にありがとうございます。 仰せのとおり、出来上がっているものを使用することは 考えました。(必要に迫られているので。汗) オートフィルタなどで、フィルタすると抽出できるデータ(x)とその後のデータ(y)の相関が取れなくなることが問題になり悩んでいます。 やはり、小生のレベルでチャレンジするのは無理があったのか う~ん、どうしよう。。

関連するQ&A

  • マクロの処理速度向上

    教えてください。マクロ初心者です。以下のようなマクロを組みました。 Sub 処方箋一覧() Dim vbOK As Integer Set WS1 = Worksheets("sheet1") Set WS7 = Worksheets("sheet7") WS7.Select Range("b2").Select Selection.End(xlDown).Select ActiveCell.Offset(1, -1).Select ActiveCell.Offset(0, 1) = WS1.Range("B3") ActiveCell.Offset(0, 2) = WS1.Range("h3") ActiveCell.Offset(0, 3) = WS1.Range("q3") ActiveCell.Offset(0, 4) = WS1.Range("v3") ActiveCell.Offset(0, 5) = WS1.Range("y3")         ~中略~ ActiveCell.Offset(0, 167) = WS1.Range("w75") ActiveCell.Offset(0, 168) = WS1.Range("x75") vbOK = MsgBox("入力完了!!", vbOKOnly, "処理確認") If vbOK = 1 Then Worksheets("sheet1").Activate End If End Sub 合計で167のセルを違うシートに転記するマクロです。 動作するのですが、速度が非常に遅くて困っています。 処理速度を向上させるようなマクロの組み方を調べているのですが、わからず困っています。どなたか、教えていただけると助かります。 よろしくお願いいたします。

  • EXCEL VBA FREQUENCY関数での設定について

    我流でVBAを勉強し、マクロを作っている者です あるデータの度数分布を調べるマクロをつろうとしていますが、うまくいきません。 FREQUENCY関数のデータ範囲の指定で変数を使いたい(元のデータが日を追う毎に増えていくので・・・)のですが、エラーになります。どこが変でしょうか? よろしくお願いします。 Sub データ最終行を調べる() Dim 総件数 As Long Dim 値 As Integer 総件数 = 100000 Sheets("データシート").Select Range("d2").Select For G = 1 To 総件数 値 = ActiveCell.Value If 値 = 0 Then Exit For Else ActiveCell.Offset(1, 0).Activate End If Next G gyou = ActiveCell.Row dataHANI = Range("d2:d" & gyou) End Sub Sub 度数分布を調べる() データ最終行を調べる Sheets("度数分布").Select Range("B2:B21").Select Selection.FormulaArray = "=FREQUENCY(dataHANI,a2:a21)" End Sub

  • マクロでテーターを転記した時の空白なしに

    いつもお世話になります。 WINDOWS7 EXCEL2010 です。 添付図で説明させていただきますと、 右側の「請求書」のL5:O9 のデーターを左の「売上表」に下記のマクロにて転記します。 元の値(請求書 L5:O9)の範囲内のデーターが1行 2行 3行 4行は空白行が又は5行の場合はすべてが埋まったりします。 この場合5行の時はいいのですが、例えばデーターが3行の時は添付図で言いますと5の行6の行のように2行が空白になります。 下記のマクロの構文をどういう具合にすればいいか御指導願えませんでしょうか。 参考に、 L5 =IF(B15="","",B15) M5 =IF(L5="","",$A$2) N5 =IF(L5="","",C15) O5 =IF(L5="","",H15) ※ 下記のようにしたかったのですがそれ程詳しくないのと時間がないので上記のような方法になり少し遠回りです。 ‘Range("B1").Select ‘ActiveCell.Offset(1, 0).Activate マクロです。 Sub 売上表へ転記() Dim ID As Long Dim 納品日 As Date ID = Range("M5").Value 日付 = Range("L5").Value Range("L5:O9").Copy Sheets("売上表").Activate Range("A65536").End(xlUp).Activate '販売記録A2がアクティブセル(タイトル行) ActiveCell.Offset(1, 0).Activate ActiveCell.PasteSpecial Paste:=xlPasteValues Application.CutCopyMode = False 'A2:E2 ActiveCell.Offset(0, 4).Activate 'C2が空白 Do Until ActiveCell.Offset(2, 0).Value = "" ActiveCell.Value = ID 'G2 ActiveCell.Offset(0, 0).Value = 納品日 'A3 ActiveCell.Offset(1, 0).Activate Loop End Sub

  • マクロでテーターを転記した時の空白なしに

    いつもお世話になります。 WINDOWS7 EXCEL2010 です。 添付図で説明させていただきますと、 右側の「請求書」のL5:O9 のデーターを左の「売上表」に下記のマクロにて転記します。 元の値(請求書 L5:O9)の範囲内のデーターが1行 2行 3行 4行は空白行が又は5行の場合はすべてが埋まったりします。 この場合5行の時はいいのですが、例えばデーターが3行の時は添付図で言いますと5の行6の行のように2行が空白になります。 下記のマクロの構文をどういう具合にすればいいか御指導願えませんでしょうか。 参考に、 L5 =IF(B15="","",B15) M5 =IF(L5="","",$A$2) N5 =IF(L5="","",C15) O5 =IF(L5="","",H15) ※ 下記のようにしたかったのですがマクロに詳しくないのと時間がないので上記のような方法になり少し遠回りです。 ‘Range("B1").Select ‘ActiveCell.Offset(1, 0).Activate マクロです。 Sub 売上表へ転記() Dim ID As Long Dim 納品日 As Date ID = Range("M5").Value 日付 = Range("L5").Value Range("L5:O9").Copy Sheets("売上表").Activate Range("A65536").End(xlUp).Activate '販売記録A2がアクティブセル(タイトル行) ActiveCell.Offset(1, 0).Activate ActiveCell.PasteSpecial Paste:=xlPasteValues Application.CutCopyMode = False 'A2:E2 ActiveCell.Offset(0, 4).Activate 'C2が空白 Do Until ActiveCell.Offset(2, 0).Value = "" ActiveCell.Value = ID 'G2 ActiveCell.Offset(0, 0).Value = 納品日 'A3 ActiveCell.Offset(1, 0).Activate Loop End Sub

  • Excel 総括表のデータを分類して別シートにコピー

    マクロの初心者です。 Excel で次の形の総括表(Sheet "TOP")から、項目1の分類にしたがって同名のシートにコピーしてゆき、コピーしてないデータがなくなるまで続けるマクロを作りました。 ----------------------------------------------------- Sheet "TOP" 項目1____項目2_____項目3____項目4____項目5_____項目6_____転記 _ad_______あ________い_______う_______え________お_______レ _bf_______い________ろ_______は_______に________ほ _ck_______A_________B________C________D_________E _dg_______1_________2________3________4_________5 ------------------------------------------------------ 二つめ以降の Sheet名は "ad" "bf" "ck" "dg" ------------------------------------------------------ Sub 転記() ' データ分別転記 Dim a As Variant Dim b As Variant Range("G1").Select '空行検索列の第1行 Do ActiveCell.Offset(1, 0).Activate '空白でなければ一つ下に移る a = ActiveCell.Value '変数宣言 Loop While Not IsEmpty(a) '空行検索終了 Selection.End(xlToLeft).Select Selection.End(xlToLeft).Select '行先頭に移動 Do b = ActiveCell.Value 'セルの文字を記憶 If b = " " Then Exit Do End If Range(Selection, Selection.End(xlToRight)).Select 'コピー範囲を指定 Selection.Copy 'コピーデータ記憶 Sheets(b).Select 'コピー先シートに移動  ★ Range("A1").Select '空行検索列の第1行 Do ActiveCell.Offset(1, 0).Activate '空白でなければ一つ下に移る d = ActiveCell.Value '変数宣言 Loop While Not IsEmpty(d) '空行検索終了 Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False 'データ貼りつけ Range("A1").Select 'トップセルに戻る Application.CutCopyMode = False 'コピー範囲指定を解除 Sheets("TOP").Select '始めのシートに戻る Selection.End(xlToRight).Select ActiveCell.Offset(0, 1).Activate '転記済みチェック欄に移動 ActiveCell.FormulaR1C1 = "レ" '転記欄にチェック ActiveCell.Offset(1, 0).Activate '一つ下に移る Selection.End(xlToLeft).Select Selection.End(xlToLeft).Select '行先頭に移動 Loop While Not IsEmpty(b) '空行になるまで繰り返し End Sub ----------------------------------------------------------------- ひととおり1行ごとにコピー、分類貼り付けはできましたが、最後に Sheet "TOP" の空行の最上行全体が範囲指定され copy mode におかれたような状態になって止まり、次のメッセージが出ます。 「実行時エラー '9'  インデックスが有効範囲にありません」   ここでデバッグ・ボタンを押すと、上記の★印の行が指定されます。 どこか正しくないところがあるはずですがよくわかりません。 間違いの箇所と正しい記述を教えて下さい。よろしくお願いします。

  • Excel VBAを使った重複行の抜き出しについて教えてください

    以下のような2シートから、重複する「商品番号」のあるsheet1の行を抜き出して、別シートに書き出したいと思っております。 sheet1  |  A   |  B   | C -+--------+-------+----- 1|      |      | -+--------+------+-------- 2|商品番号|商品名|責任者 -+--------+------+-------- 3|  123456|  ガム|山田太郎 -+--------+------+-------- 4| 2345678| チョコ|田中花子 ・・・ sheet2  |  A   |  B   | C -+--------+-------+----- 1|      |     | -+--------+------+-------- 2|商品番号|商品名|責任者 -+--------+------+-------- 3| 3987624|     | -+--------+------+-------- 4| 193678|      | ・・・ そこでVBAを作成したのですが、例えば商品番号「222011001」の行を抜き出したいのに、「22011001」の行も一緒に抜き出してしまいます。 どこがいけないのか、教えて頂けないでしょうか。 作成したVBAは以下の通りです。 VBA初心者で本を見ながら作ったため、大変見にくくなっているかと思います。申し訳ありませんが、どなたかおわかりになる方がいらっしゃいましたら、どうぞ宜しくお願い致します。 Option Base 1 Option Explicit Sub 重複データ抽出書き直し() Dim シート(2) As Worksheet Dim 比較列(2) As Integer Dim 一致セル As Range Dim 検索範囲 As Range Dim i As Integer Set シート(1) = Sheets("sheet1") Set シート(2) = Sheets("sheet2") 比較列(1) = 1: 比較列(2) = 1 シート(2).Activate ActiveCell.CurrentRegion.Select Selection.Offset(1, 比較列(2) - 1) _ .Resize(Selection.Rows.Count - 1, 1) _ .Select Set 検索範囲 = Selection Sheets.Add After:=Sheets(Sheets.Count) シート(1).Activate ActiveCell.CurrentRegion.Select Selection.Resize(1).Copy With Sheets(Sheets.Count).Range("A1") If Application.Version >= 9 Then .PasteSpecial 8 End If .PasteSpecial End With For i = 2 To Selection.Rows.Count Set 一致セル = 検索範囲.Find(Selection.Cells(i, 比較列(1)).Value) If Not 一致セル Is Nothing Then Selection.Offset(i - 1).Resize(1) _ .Copy Sheets(Sheets.Count) _ .Range("A65536").End(xlUp) _ .Offset(1) End If Next i Sheets(Sheets.Count).Activate End Sub

  • EXCELでENTERキーでセルの移動マクロ

    こんにちは。 EXCELでENTERキーでセルの移動マクロを使いたいのですが、下記のマクロで改良を教えてもらいたいと思います。 まず、最初は必ず、セルB5にフォーカスしたいということ。そうして、できればOFFSETを使わないで、rangeかcellを使いたいのですが、お願いします。 Sub セル移動() Range("B5").Select Select Case ActiveCell.Column Case 1 ActiveCell.Offset(1, 1).Activate Case 2 ActiveCell.Offset(2, 2).Activate Case 3 ActiveCell.Offset(1, 1).Activate Case 4 ActiveCell.Offset(1, 1).Activate End Select End Sub

  • VBAについて

    いつもお世話になっています マクロ・VBA超初心者です。 質問させてください。 現在シート1の完売のセルの欄に○が入っていれば日付をみてシート2の同じ日付の隣のセルに○を入力しようと思っているのですが、シート2の日付を検索はしているんですが入力がいきません Sheet1  ↓セルA1 ↓セルB1  5月26日   26           B1のセルはDAY(A1)にて出してます         完売  A氏     ○             Sheet2  ↓A列   ↓B列 5月  1日  ・  ・  ・  26日    ○           ←シート1の所に○が付いているとシート1セルB1と同じ  27日                  日付の隣のセルに○を入力  28日 VBA Sub test() Sheets("Sheet2").Select Range("A1").Select Do Until ActiveCell = "" ActiveCell.Offset(1, 0).Activate If ActiveCell.Value = Worksheets("Sheet1").Range("B2") Then ActiveCell.Offset(0, 1).Activate If ActiveCell.Value <> "○" Then ActiveCell.Valu = "○" ActiveCell.Offset(0, -1).Activate Else ActiveCell.Offset(0, -1).Activate End If Else End If Loop Sheets("Sheet2").Select Range("A1").Select End Sub どこが間違っているかわからない状態です。 分かりにくい説明ではあるんですが教えてください お願いします。

  • Excelマクロ:変数でセル範囲指定

    マクロの迷い人です。 Excelの表をマクロで印刷しようと思っています。 行の数が毎回違うため、最終セルもその都度指定しなければなりません。 A1 B1 A2 B2 A3 B3 A4 B4 この例で、A5 B5 以降は空セルとします。 印刷範囲を Range("A1:B4")と書かずに、そのときどきのアクティブセルを変数に代入し、変数を使って範囲指定したいのです。 Sub MacroTest () Dim a As Variant Dim b As Variant Range("B1").Activate Do While a <> 0 ActiveCell.Offset(1, 0).Activate '空白でなければ一つ下に移る a = ActiveCell.Value Loop ActiveCell.Offset(-1, 0).Activate '上の行に移る b = ActiveCell.Value Range("A1:"& b).Select End Sub こうしてみましたがダメでした。 デバッグの方法がわからないので教えて下さい。よろしくお願いします。

  • エクセルでデータの比較をしたいです。お教え頂けないでしょうか

    エクセルでデータの比較をしたいです。お教え頂けないでしょうか エクセルで2つのシートにある同一の商品コードと 在庫数を比較するマクロを作成中です。 シート1のA列にある商品コードとB列にある在庫数を取得し シート2のA列にある商品コードから同じ商品コードを探します。 同一の商品コードがあった場合に在庫数を比較して その数が減少していなければC列に次の処理を加える。  商品コードが合致した後は 処理を抜けて次の商品コードを比較させたいのですが 下行にある商品コードを探し続けてしまいます。(データの総当りとなる) つきましては どの様に記述すれば良いのでしょうか お教え頂けます様 よろしくお願い致します。 *********** Sub check1() Dim kz1 As long 'シート1データ数 Dim kz2 As long 'シート2データ数 Dim st1 As String 'シート名 Dim dt1 As Variant '商品コード Dim dt2 As Variant '在庫数 Sheets("sheet1").Select st1 = ActiveSheet.Name kz1 = Range("a65536").End(xlUp).Row Range("a1").Select ActiveCell.Offset(1, 0).Select For a = 0 To kz1 - 2 Sheets(st1).Select dt1 = ActiveCell.Value '商品コード dt2 = ActiveCell.Offset(0, 1).Value '在庫数 Sheets("sheet2").Select kz2 = Range("a65536").End(xlUp).Row Range("a1").Select ActiveCell.Offset(1, 0).Select For b = 0 To kz2 - 1 '同一商品コードを検索 if activecell.value = dt1 '在庫数を比較 if activecell.value >= dt2 '在庫数が同じ もしくは増加していた場合に処理 '次の処理を追加 endif else ActiveCell.Offset(1, 0).Select endif Next b Sheets(st1).Select Next a end sub