プロが教えるわが家の防犯対策術!

Sheets("抽出").Select
Sheets("売上").range("a1").currentregion.action:=xlfiltercopy,copytorange:=range("a1:c1")

Sheets("売上")には
日付 担当 売上金額
5/5  A  50000
6/7  B  10000

Sheets("売上").range("a1").currentregion.action:=xlfiltercopy,copytorange:=range("a1:c1")
で行うと列は任意に決めると列の順番どおり、
抽出できます。が
 担当 売上金額 日付
  A  50000 5/5
  B  10000 6/7
とできますが、
あらかじめ担当Aだけで絞り
 担当 売上金額 日付
  A  50000 5/5
このように抽出することは可能でしょうか

質問者からの補足コメント

  • どう思う?

    Sub j()
    Range("a5").CurrentRegion.AdvancedFilter Action:=xlFilterInPlace,
    criteriarange:=Range("a1:g2")
    Range("a5").CurrentRegion.SpecialCells(xlCellTypeVisible).Select
    Selection.Copy Destination:=Sheets("sheet1").Range("a1")
    End Sub
    この場合だと列は 担当 売上金額 日付の順でしかでません。
     担当 売上金額 日付 

      A  50000 5/5

    列のの順番を変えることはかのうでしょうか

      補足日時:2018/04/19 15:00
  • ムッ

    どうやっていれかえるのでしょうか

    No.2の回答に寄せられた補足コメントです。 補足日時:2018/04/19 16:39

A 回答 (3件)

No2です



>どうやっていれかえるのでしょうか
単にデータを入れ替えるだけですから、プリミティブにやるなら値を取得して入れ替えればよいでしょう。
原理的には変数の値の入れ替えと同じような考え方です
 tmp = a
 a = b
 b = tmp
みたいな。
とはいえ、シートであることを有効に利用するなら、手作業と同様に挿入や削除を使うのが簡単かもしれません。

No2にも書きましたように、どうせ並び替えるのなら、コピーする際に入れ替えながらコピーする方法も考えられます。
データ範囲や(CurrentRegionになっているので)、どこをどう入れ替えたいのかが不明なので例示しようがないので、例としてはだいぶ適当ですが・・・

◆コピーする際に、各列の順序をランダムにして入れ替える例
ランダムな順序を作成するのに却って行数を使ってしまいましたが(本末転倒?)、実際にはどのような順にするのかは決まっているのでしょうから、配列などに定義してそれを参照しながらコピペすればよいので、順序を作成すると言ってもほぼ1行ですみます。

Set sorc = Range("A5").CurrentRegion
Set dest = Worksheets("Sheet1").Range("A1").Resize(1, sorc.Columns.Count)
sorc.AdvancedFilter Action:=xlFilterInPlace, criteriarange:=Range("a1:g2")

'ランダムな順序を作成
dest.Formula = "=Rand()"
dest.Offset(1).Formula = "=Rank(A1," & dest.Address & ")"
dest.Offset(1).Copy
dest.PasteSpecial Paste:=xlPasteValues
dest.Offset(1).ClearContents

'各列を上のランダム順に従ってコピペ
For Each c In dest
sorc.Columns(c.Value).SpecialCells(xlCellTypeVisible).Copy Destination:=c
Next c


入れ替える列が少なく単純なものなら、コピーした後に入れ替えてもよいでしょう。

◆ふたつの列を入れ替えるだけならこんな感じで可能です。
 他にも方法はいくらでもあると思いますが・・・
(コピペ先のCurrentRegionでデータ範囲が取得できるものと仮定しています)

Set rng = Worksheets("Sheet1").Range("A1").CurrentRegion
col1 = 2
col2 = 5

a = rng.Columns(col1)
b = rng.Columns(col2)
rng.Columns(col2) = a
rng.Columns(col1) = b

col1、col2は、当然ながらデータ範囲の列数以下である必要があります。
(範囲外の場合はエラーになります)

※ 上例では、単純なコピーで処理を行っていますので、非コピーセルの内容に関数式等が含まれている場合には、列を入れ替えると参照関係がおかしくなる可能性が大です。(定数のみとあらかじめわかっていれば問題はありません)
関数式が含まれているような場合は、「値をペースト」で定数化するように変えるのが簡単だと思います。ただし、この場合は関数の機能は失われます。

なお、元データと値を連動させたいような場合には、元のセルへの参照式を作成して、その式を設定するようなことになりますが、これには「位置関係を計算して参照式を作成する処理」が必要となりますので、ご提示の処理とはまったく内容が異なるものとなります。
    • good
    • 0

No1です。



>列のの順番を変えることはかのうでしょうか
プログラムなんだから好きに入れ替えればよいだけでは?
別シートで他に影響が無いのであれば、列ごと入れ替えてしまえばよい。
(他に影響する場合は、その表の範囲内だけ入れ替える)

コピペで処理する方法に変えたようなので、コピペする時に順序を入れ替える方法でもよさそう。
この回答への補足あり
    • good
    • 0

こんにちは



抽出条件(CriteriaRange)を指定してあげればよいのではないの?
(当然ながら、条件の内容もセットしておく必要があります)
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!