- ベストアンサー
プログラムの作り方
noname#245936の回答
No.1/2の者です。 …なんとなし、判ってきました。 これって、工業用機械のヘッド位置など制御座標指示系のダンプ データ(データ羅列)を重複データを除いたりしつつ、データ量を 最適化したいと伺えますがよろしいでしょうか? で、この情報を一瞬で出せる仕組みが欲しいということですね? 多分なんですが、貴方の欲しい情報はExcelマクロを組むより Accessなどデータベースを使うのが手っ取り早いと思います。 (Excelはセル座標系の制御がとても面倒なので、データベースで 一瞬でデータ集合を取り扱う方が早いです) 理屈的には、DBに放り込んで、自己結合型のSQLを発行し、 データを一撃で出力する仕組みです。 1.まず、Accessなどでテーブルを作ります。 Table名をTDataDumpと仮にしまして。 フィールドを仮に 1.RowNum (長整数型:主キー) ExcelのA列相当。順序を保持。 2.Coordinate(文字型(1)) ExcelのB列相当。「X」「Y」を入れる。 3.Point(長整数型か小数があれば10進型など) ExcelのC列相当。座標系を入れる。 とします。 2.これに一度データをExcelなどからインポートします。 A列がない場合はExcelで先に作成をしてから入れます。 3.これに対して、クエリ(SQL)を作成します。 4.そのSQLを実行すると、欲しいデータがすぐに取り出せるように します。 なお、SQLの考え方はこちらです。 ※当方、SQL Serverの構文で書きますので、Accessではちょっと 方言があり、エラーになるかもしれません。 1.全部のデータを昇順でとるには。 SELECT RowNum,Coordinate,Point From TDataDump Order By RowNum になります。 2.Y列のみ、次の行が欲しい場合がありますので、 SELECT RowNum,Coordinate,Point,RowNum + 1 AS NextRowNum From TDataDump Order By RowNum と加工。D列相当に次の行番号を作成しておきます。 3.Y列の場合、次のデータが欲しいのでNextRowNumに対し、 データを再結合します。 SELECT tDataDump1.RowNum, --該当行番号 tDataDump1.Coordinate, --該当行のXY tDataDump1.Point, --該当行の座標 tDataDump1.RowNum + 1 AS NextRowNum,--次の行番号 tDataDump2.RowNum AS NextRowNum2, --結合された次行番号 tDataDump2.Coordinate AS NextCoordinate2, -- 次行XY tDataDump2.Point AS NextPoint2 -- 次行座標 From TDataDump AS tDataDump1 Left Join TDataDump AS tDataDump2 On tDataDump1.RowNum = tDataDump2.RowNum Order By RowNum これにXとYでWhere縛りをつけ、PickUpしたいところだけ取り出す SQLに整形すれば完了です。 …実際書いてみましたが…長いSQLになるので貴方にとって正しい 回答かどうか判らないので割愛します。(笑) 何にせよ、 Excelでデータ整形 -> Accessへインポート -> SQLのKick -> 結果を別で保存という形にすれば貴方のやりたいことは一撃で できると思います。
関連する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のセルを違うシートに転記するマクロです。 動作するのですが、速度が非常に遅くて困っています。 処理速度を向上させるようなマクロの組み方を調べているのですが、わからず困っています。どなたか、教えていただけると助かります。 よろしくお願いいたします。
- ベストアンサー
- その他MS Office製品
- 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
- 締切済み
- Excel(エクセル)
- マクロでテーターを転記した時の空白なしに
いつもお世話になります。 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 総括表のデータを分類して別シートにコピー
マクロの初心者です。 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
- ベストアンサー
- Visual Basic
お礼
ご回答ありがとうございます。 すごいですね。 専門の方でしたか。 生産された製品のデータ値を吸い取り そのデータ値をまとめ分布を取りたいと 考えてます。 上記に記載いただきました内容専門用語すぎて 小生には理解できませんでした。 (すみません。アクセスの知識もほとんど無く、ほとんど使わないので。)