[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『データの転記なのですが…』(プリン)
過去ログからの応用で少しづつですが進歩?
ですが本を調べてもログを検索してもわからないことがあるので教えてください。
Sub ボタン1_Click()
Dim i As Long
Dim MyCount As Long
If vbNo = MsgBox("データを登録します。OK?", vbQuestion + vbYesNo, "確認") Then
Exit Sub
End If
With Worksheets("在庫表")
i = .Range("A65536").End(xlUp).Row + 1
V = .Range("A65536").End(xlUp).Row
Rem 在庫表データ範囲A列〜I列データ範囲でオートフィルタ
Rem 各フィールドでフィルタを実行
For MyCount = 1 To 12
.Range("A1:M" & i - 1).AutoFilter _
Field:=MyCount, _
Criteria1:=Cells(6, MyCount).Value
Next MyCount
Rem オートフィルタ後の可視セルをカウント↓
If .Range("A1:A" & i - 1).SpecialCells(xlCellTypeVisible).Count = 1 Then
Rem フィルタの結果、可視セルが見出し行のみになった(重複レコードがない)場合は
Rem ↓ For〜Nextを実行して転記。
For MyCount = 1 To 13
.Cells(i, MyCount).Value = Cells(6, MyCount).Value
Next MyCount
ElseIf .Range("A1:A" & i - 1).SpecialCells(xlCellTypeVisible).Count = 2 Then
Rem フィルタの結果、可視セルが2行のみになった(重複レコードがひとつ)場合は
Rem ↓ For〜Nextを実行して転記。
MyCount = 13
.Cells(v, MyCount).Value = Cells(6, MyCount).Value
End If
Rem オートフィルタ解除
.Cells.AutoFilter
End With
End Sub
上記の場合データがあった場合上書きされてしまうので上書きではなくシート1の13番目の値とシート2のフィルター後の13番目の値を合計してシート2の13番目に求める方法を教えてください
プリン
なかなかレスが付きませんね。 もし可能であれば、簡単なサンプルを作って以下のramrunさんのアップローダに ファイルをアップしてみては如何でしょうか。 http://ryusendo.no-ip.com/cgi-bin/upload/upload.html そうすれば回答者の方の手間がかなり省けて回答が付きやすいかと思います。 ※個人名、固有の会社名等不都合のある部分(プロパティ内も含め)は消去しておいてください。
(川野鮎太郎)
どちら様か宜しくお願いします。
http://ryusendo.no-ip.com/cgi-bin/upload/src/up0338.xls
プリン
完全に理解していないかもしれませんので違うかも・・・。 在庫表シートのフィルタされた行のケース数に足し合わせていくだけですか? .Cells(v, MyCount).Value = Cells(6, MyCount).Value の部分を
こうしたらどうなりますか。
.Cells(v, MyCount).Value = .Cells(v, MyCount).Value + Worksheets("Sheet1").Cells(6, MyCount).Value
それとも現在の質問はループ処理かな・・・?(^_^A;
ループ処理はこんな感じです。
Sub MyLoop()
For Each C In Range(Worksheets("Sheet1").Range("M6"), Worksheets("Sheet1").Range("M65536").End(xlUp))
'ここに処理を入れる。
Next C
End Sub
(川野鮎太郎)
プリン・・・元メープル
>こうしたらどうなりますか。
>.Cells(v, MyCount).Value = .Cells(v, MyCount).Value + Worksheets("Sheet1").Cells(6, MyCount).Value
やってみましたがフィルタされた行でなく、シート2の最下行のデータにプラスされてしまいます。なぜでしょう?
>ループ処理はこんな感じです。
>Sub MyLoop()
> For Each C In Range(Worksheets("Sheet1").Range("M6"), Worksheets("Sheet1").Range("M65536").End(xlUp))
> 'ここに処理を入れる。
> Next C >End Sub
ループもなぜか途中で止まってしまうのですが?
必ず最終の一行が残ってしまいます。途中でもなぜか処理が終わっていないのに何行か残してループを抜けてしまいます。
とりあえず私はシート2から何行かコピーしてきてシート1に貼り付けて様子を見たのですが…
untilやwhileを使用しないdo loopで強制にループさせてexitdoにシート1の参照結果がspecialcells(xlcelltypeblanks)だったら抜けるというのは?
抜けなくなったらどうしようとまだやっていませんが(^_^A;
あと少しってなかなかうまくいきませんね。所詮一夜漬けのアマチュアだから…
ご指導いただけますでしょうか?
お願いします プリン
途中見てません。一点だけ。
>抜けなくなったらどうしようとまだやっていませんが(^_^A; もし永久ループに陥ったら、Escキーでコードを実行を中断できます。 あまり恐れず、思ったとおりに記述して実行してテストテスト。 動きがおかしいな?と思った部分にはブレークポイントを置いてコードを止めて F8キーでステップ実行。 どうしても実行するのが怖かったら、 実行する前にそのファイルのバックアップを取っておけば必ずその時点までは戻れます。 (ご近所PG)デバッグの仕方(←メモ書き)
私もよく見てませんが、気になったとこを一点だけ、、、
>Rem 在庫表データ範囲A列〜I列データ範囲でオートフィルタ
>Rem 各フィールドでフィルタを実行
>For MyCount = 1 To 12
>.Range("A1:M" & i - 1).AutoFilter _
> Field:=MyCount, _
> Criteria1:=Cells(6, MyCount).Value
>Next MyCount
これはちょっと無理があるんじゃないかと思います。
私なら、ユニークな主キーを作ってそれで管理すると思います。
重複というのを何をもって重複しているかとみるかですよね。
マクロだけでするのが必ずしも有効的な方法とはかぎりませんよ。
例えば、
=A1&B1&C1
こんな数式をセットしておけばそうそう重複することもないでしょうし、
重複さえしていなければ後の操作が楽になりますからね。
作業列や数式を使ってExcelの本来の機能で抽出する。
シンプルIsベストですよ。(^^;
どうでしょうか?
あっ、それからここに書き込む時は文節の先頭に半角のスペースを空けるといいですよ。
←ここです。ここに半角のスペースを入力してみてください。
編集画面で見比べていただければすぐにわかります。
(SoulMan)
(ご近所PG)デバッグの仕方(←メモ書き)様、ご意見ありがとうございます。 早々やってみて何回もはまりましたがループに関してはやっと出来たみたいです とりあえずシート1の6行目が13列空白なら抜ける?を意識して…
http://ryusendo.no-ip.com/cgi-bin/upload/src/up0343.xls
(SoulMan)様のご意見は編集中に発見したのでこれから見てみますが 数式をどこにどう入れるのか?わけわかりません… あとは上記のフィルタで同じアイテムがあった場合は同じアイテムの 最終セルの数量にプラスし
なかった場合はそっくりシート2に転記するという作業のみ!
そっくり転記は出来るようになり、検索したものに同じアイテムがある場合は 上書きなら出来るのに足したり引いたりがうまくいきません。
一応現状をアップしました。ご意見お待ちします プリン
一応私の考える作成中のファイルのイメージとは 12の条件セル全てが一致したセルに数量を足し引きする(今回は足す) 一致したセルがない場合は新規として追加する。 上記の動作はシート1からシート2への転記 これからの取り組みは上記の点とシート2を順番に並べる。
こんな感じです プリン
勘違いしていたらすみません… シート1とシート2に関数や数式を65536まで入力したらとんでもないことに なったので一切を苦手なマクロでやってみようと思いました。 >(SoulMan)様
プリン
>12の条件セル全てが一致したセルに数量を足し引きする(今回は足す)
なので12フィールドをすべてフィルタするのではなくて
例えば↓こんな数式をN列に入力しておくのはどうですか?とご提案しているのです。
=A2&B2&C2&D2&E2&F2&G2&H2&I2&J2&K2&L2&M2
ぱっとみですが行位置がお知りになりたいようなので
このN列だけを対象にMATCHで検索しても同じことですよね?
どうでしょうか?
Option Explicit
Sub てすと()
Dim x As Variant
Dim Wh1 As Worksheet
Dim wh2 As Worksheet
Dim i As Long
Set Wh1 = Sheets("Sheet1")
Set wh2 = Sheets("在庫表")
For i = 6 To Wh1.Range("A65536").End(xlUp).Row
x = Application.Match(Wh1.Cells(i, "N").Value, wh2.Range("N:N"), 0)
If Not IsError(x) Then
MsgBox x & "行目です。"
Else
MsgBox "一致するデータはありません。"
End If
Next
Set Wh1 = Nothing
Set wh2 = Nothing
End Sub
(SoulMan)
>上記の場合データがあった場合上書きされてしまうので上書きではなく >シート1の13 番目の値とシート2のフィルター後の13番目の値を合計して >シート2の13番目に求める方法を教えてください
>こうしたらどうなりますか。
>.Cells(v, MyCount).Value = .Cells(v, MyCount).Value + Worksheets("Sheet1").Cells(6, MyCount).Value
現状の一行の改善では出来ないでしょうか? シート2は最下行まで数式を入れたら凄い容量になってしまいます。 全てのアイテムを打ち込むと何万というアイテムになるので なるべくマクロで行いたいのです。
プリン
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.