ExcelのVBAです。
オートフィルタの▼をクリックすると、
重複していないリストが出ます。
このリストを列ごと(指定列)取得したいです。
できれば、Functionで組み、
配列に格納し、使いたいと思っています。
戻り値で配列は出来なかった気がしますが、
どうでしょうか…
やりたいことをまとめます。
----------------------
Call オートフィルタリスト("A")
配列をリストボックスに表示
選択し、上下の配置などを変更できるように
(Excelも連動し、2行目と3行目の位置を変更したりすることができる)
新規追加
そのリスト最終行に新規データを入力
そして、それをExcelにも反映
------------------------
Function オートフィルタリスト(指定列)
配列定義
指定列の範囲選択
オートフィルタのリストを配列に格納
(重複は削除します)
配列を返します。
End Function
------------------------------
まとめるどころか余計ぐちゃぐちゃした気もしますが、
回答よろしくお願い致します。
No.2ベストアンサー
- 回答日時:
#1、cjです。
#1補足欄へのレスです。> 指定列の重複部分を削除したリスト(配列変数でも可)
> が欲しいのです。
...
> というデータを配列などに格納したいのです。
Sub Re8336497c()
の、
vRtn = オートフィルタリスト(Range(sColRef), 列数) ' 複数列を返す場合
' vRtn = オートフィルタリスト(Range(sColRef)) ' 単列を返す場合
の部分、vRtnには配列が格納されている筈ですけれど?
何が違うのでしょうか?
> Call フィルタ抽出("A")
> などと、A列を指定すれば
Functionプロシージャは関数として値を返すものですから、普通は、
戻り値 = フィルタ抽出("A")
のような書式で、(Variant型の)変数に戻り値を格納するものですよね?
#1で私が書いたものでは、Variant型の変数 vRtn に、お望みのリスト配列が
二次元配列として格納されます。
先にも書きましたが添付画像に合わせて、わざわざ2列のリスト配列を返す
ように書きましたが、単列の場合は
vRtn = オートフィルタリスト(Range(sColRef)) ' 単列を返す場合
こちらの記述を活かして貰えればいいです。
変数を直値に替えて示すと、
vRtn = オートフィルタリスト(Range("A:A")) ' 単列を返す場合
という内容です。
文字列としての引数ではなくて、Range 型の引数で渡した方が合理的で扱い易い、
ので、引数にはRange 型を指定するだけの違いです。
どうしても、"A"、という記述にに固執するなら、
vRtn = オートフィルタリスト(Columns("A")) ' 単列を返す場合
とでも、そちらで書き替えて貰えばいいと思いますけれど、、、。
また、変数に格納しなくても、オートフィルタリスト()関数の戻りが配列ですから
そのまま直接、、
UserForm1.ListBox1.List = オートフィルタリスト(Range("A:A"))
のように少し雑な書き方でも望み通りに出来ます。
何れにしても、あなたが確認しようともしないだけで、
配列を返す関数を提示して、変数に配列を格納するサンプルを添えて、
配列変数の値をListBoxのListに渡すところまで、テストコードを提示して
テストの仕方まで説明してある、のが、#1なのですけれど、、、
力及ばず、残念です。
> また、マクロ(フォーム)間のデータの受け渡し方法が
> 良く分かりません。
この説明では、何をお訊ねなのか解りません。
Function()関数に引数を渡して、戻り値を配列で得る、配列をListBoxのListに渡す
という”データの受け渡し方法”の例ならご注文通り示しました。
この他にも知りたい、ということなのでしょうか。
繰り返しになりますが、あれやこれや一度に抱えて迷う位なら、
今目の前にあることを、ひとつずつ、確かめながら、習得するようにしては如何でしょう。
> 戻り値は1つしか戻せませんし、何か
> 方法はあるのでしょうか?
戻り値を複数戻したい、という意味ですかね?
ListBoxの.MultiSelectプロパティを fmMultiSelectMulti で指定してある、
ということでいいですか?
では、例えば、リストの2行め、5行め、8行め、が選択された、として、
「何を契機に」「どんな戻り値を得て」「どんな結果を返したい」のですか?
.Selectedプロパティと.ListIndexプロパティや.Listプロパティについて、
ヘルプに書かれている程度に理解することが出来れば、大抵のことは出来ると思いますけれど、
こちらとしては、注文が無いのに料理を出すことは出来ないですし、残念ですけれど。
せめて、#1で提示したものを試して、思っていたのとどう違う、とか、
対話的にやりとりが出来れば、そこから汲み取ることは出来たのかも知れません。
とりあえず、私としては既に応えられるものは惜しみなく大盛りでお応えしたつもりなので、
対話的な進展がなければ、今回、書き加えることはないものと思っています。
失礼しました。
回答ありがとうございました!
言葉足らずで質問ばかりの内容を
ひとつひとつ丁寧に回答してくださり、ありがとうございます。
教えて頂いたプログラムで上手く起動したので、
内容を少しずつ理解していこうと思います。
ありがとうございました!
No.1
- 回答日時:
こんにちは。
一度に食べ切れない料理を注文されているように思えたので、
私はメインの一皿分だけ応えてみます。
> オートフィルタの▼をクリックすると、
> 重複していないリストが出ます。
ということですから、単列を指定して単列のリストを返すもの
が欲しいのかと思ったのですが、画像は2列ですね。
例示では[名前]と[選択]がすべて一意の対応になっていますから、
(偶々ではなくて、そういう暗黙の前提があるということ?だと推して)
[指定列]を基準に重複を除いて、複数列返すこともある、ということなのかと考えました。
一応、複数(または単)列、丸ごと、二次元配列で返すように書いてあります。
必要と十分をこちらで理解し切れてませんので、若干欲張りな仕様
でお応えしています。
諸々事情が解れば、多少簡略化できると見込んでいますけれども。。。
但し、要点が霞んでしまわない様にエラー処理を消したものをあげます。
また、日付型のデータについては、そもそものオートフィルタのリストが、
リストボックスに表示できる内容ではありませんから、必然、未対応です。
Function オートフィルタリスト()
が、こちらからのメインの回答に当たります。
Sub test8336497c()
は、テスト用のサンプルです。
試す時は、
新規のユーザーフォーム=UserForm1、リストボックス=ListBox1
と、サンプルデータのあるシート、の3点
用意してからにした方が紛れがないと思います。。
運用(または実情)に合わせて指定が必要なのはSub test8336497c()の◆4カ所です。
> できれば、Functionで組み、
> 配列に格納し、使いたいと思っています。
> 戻り値で配列は出来なかった気がしますが、
> どうでしょうか…
戻り値をVariant 型にすれば、Function内で宣言した配列変数を代入する形で
実現出来ます。
> Call オートフィルタリスト("A")
引数[指定列]のこういう指定方法は、Excelには馴染まないかな、と思います。
まだしも"A:A"のようにA1形式のセルアドレスを指定するならアリかも知れませんが、
扱い易さと可読性を重視して[指定列]はRange型にしてあります。
[指定列]には必ず単列を指定するようにしてください。
> 配列をリストボックスに表示
> 選択し、上下の配置などを変更できるように
>(Excelも連動し、2行目と3行目の位置を変更したりすることができる)
>
> 新規追加
> そのリスト最終行に新規データを入力
> そして、それをExcelにも反映
こちらでは、画像と説明された情報を元に実際にサンプルブックを作成してテストしていますが、
(例えば、コマンドボタンなのかスピンボタンなのか、画像からは見分け付かない、とか)
再現できない部分には手が出せないです。
> 配列をリストボックスに表示
この部分だけについて、お応えしていますが、既に十分に厚量になってしまいました。
1段階ずつ、試して、整理して、試して、整理して、、、見通しが付いたら、次の段階、
という風にでも、もう少しスローに進めていった方が、
結果的には早く習得できるようにも思います。
縁があれば、また次の段階でレスすることもあるかも知れませんね。
部分部分はオーソドックスなことしかしていません。
簡単なものには見えないでしょうけれど、それは、不足が無いように
必要以上、十分以上、を書いているからです。
、、、試してみてくださいね。
' ' 標準モジュール
Sub Re8336497c()
Dim vRtn As Variant
Dim sColRef As String
Dim sBuf As String
Dim sngLBFontSize As Single
Dim 列数 As Long
Dim i As Long
sColRef = "B:B" ' 要◆指定 [指定列]のアドレスをセル参照(A1形式)文字列で
列数 = 2 ' option 複数列を返す場合のみ 要◆指定
vRtn = オートフィルタリスト(Range(sColRef), 列数) ' 複数列を返す場合
' vRtn = オートフィルタリスト(Range(sColRef)) ' 単列を返す場合
With UserForm1 ' 要◆指定
With .ListBox1 ' 要◆指定
sngLBFontSize = .Font.Size
With Range(sColRef)
For i = 1 To UBound(vRtn)
sBuf = sBuf & ";" & .Cells(1, i).Width * sngLBFontSize / .Cells(3, i).Font.Size ' フォントサイズ比:リストボックス / セル
Next i
End With
.ColumnCount = UBound(vRtn)
.ColumnWidths = Mid(sBuf, 2)
.List = vRtn
End With
.Show vbModeless
End With
End Sub
' ' /// [指定列](Range型)を基準に値が重複するセルを除いたリストを二次元配列で返す。
' ' [列数](Long型)は[指定列]以降のリスト列数(省略可。既定値は1。)。
Private Function オートフィルタリスト(ByVal 指定列 As Range, Optional ByVal 列数 As Long = 1)
Dim vRtn()
Dim Target As Range
Dim c As Range
Dim cnRc As Long
Dim iC As Long
Dim iR As Long
With 指定列
.AdvancedFilter Action:=xlFilterInPlace, Unique:=True
cnRc = Application.Subtotal(3, .Cells)
Set Target = .Cells(2, 1).CurrentRegion.SpecialCells(xlCellTypeVisible)
Set Target = Application.Intersect(Target, .Resize(, 列数))
End With
列数 = Target.Columns.Count
ReDim vRtn(1 To cnRc, 1 To 列数)
iR = 1: iC = 1
For Each c In Target
vRtn(iR, iC) = c.Text
If iC Mod 列数 = 0 Then
iR = iR + 1: iC = 1
Else
iC = iC + 1
End If
Next
指定列.Worksheet.ShowAllData
オートフィルタリスト = vRtn()
Set Target = Nothing: Erase vRtn()
End Function
この回答への補足
回答ありがとうございます!
色々文章不足で申し訳ないです。
やりたいこととしまして、
指定列の重複部分を削除したリスト(配列変数でも可)
が欲しいのです。
Call フィルタ抽出("A")
などと、A列を指定すれば
田中
佐藤
斉藤
有野
吉田
鈴木
山下
木村
中野
石川
岩下
というデータを配列などに格納したいのです。
また、マクロ(フォーム)間のデータの受け渡し方法が
良く分かりません。
戻り値は1つしか戻せませんし、何か
方法はあるのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
あるあるbotに投稿したけど採用されなかったあるある募集
あるあるbotに投稿したけど採用されなかったあるあるをこちらに投稿してください
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
オートフィルタで表示されるリスト全部をマクロで抽出したい
Access(アクセス)
-
エクセルVBAでオートフィルター最上行を取得するには
Excel(エクセル)
-
【VBA】【ユーザーフォーム_ListBox】オートフィルタで絞りこんだ値だけを取り出したい
Visual Basic(VBA)
-
-
4
IF関数で空欄(")の時、Nullにしたい
その他(Microsoft Office)
-
5
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
6
オートフィルタのリストを順番に印刷できるマクロ
Windows Vista・XP
-
7
Excelのマクロ名の並び順の法則は?
Excel(エクセル)
-
8
オートフィルターで指定した値を取得したい
Excel(エクセル)
-
9
表にフィルターをかけ、絞ったデータ(可視化セルのみ)を一次元配列として変数に入れるという動作を書きた
Visual Basic(VBA)
-
10
オートフィルタの選択肢数を数えたいのですが・・・
Excel(エクセル)
-
11
Excelの条件付き書式設定の太い罫線
Excel(エクセル)
-
12
エクセルVBAで5行目からオートフィルタモードに設定したいたい
Excel(エクセル)
-
13
for each の現在の配列ポインタ VBA
Excel(エクセル)
-
14
VBA Shapes コピーと名前
Excel(エクセル)
-
15
無線LAN使用時と有線LAN使用時のIPアドレスの違いについて
その他(インターネット接続・インフラ)
-
16
ユーザーフォーム スクロールバー 非表示にしたい
Excel(エクセル)
-
17
ユーザーフォームに最小化・最大化ボタンを付ける
Access(アクセス)
-
18
エクセルマクロで指定範囲内の図形を削除
Excel(エクセル)
-
19
VBA 1次元配列を2次元に追加する
Visual Basic(VBA)
-
20
VBAでファイルを開くときにファイル名でワイルドカードを使用したいです
その他(プログラミング・Web制作)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excelのセルの色指定をVBAから...
-
ExcelのINDEXとMATCH関数でスピ...
-
配列がとびとびである場合の書き方
-
array関数で格納した配列の型を...
-
EXCEL VBA 2次元配列に格納さ...
-
VB6.0 ファイルの一括読込み
-
SUMPRODUCT関数を用いた最小値
-
C#で配列のフィールドを取得したい
-
エクセルで、絶対値の平均を算...
-
【VBA】配列に数式を仕込む方法...
-
配列のSession格納、及び取得方...
-
読み込みで一行おきに配列に格納
-
仮想リストコントロールの表示
-
Excel VBA 配列の分割について
-
過去ログの配列について質問
-
表にフィルターをかけ、絞った...
-
.NET - 配列変数を省略可能の引...
-
以下のプログラムについて教え...
-
VBA 配列に格納した値の平均の...
-
[VBA]改行入りのセルの値を配列...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excelのセルの色指定をVBAから...
-
エクセルで、絶対値の平均を算...
-
表にフィルターをかけ、絞った...
-
ExcelのINDEXとMATCH関数でスピ...
-
[エクセル]連続する指定範囲か...
-
array関数で格納した配列の型を...
-
配列がとびとびである場合の書き方
-
VBA 配列に格納した値の平均の...
-
DataSetから、DataTableを取得...
-
[VBA]改行入りのセルの値を配列...
-
読み込みで一行おきに配列に格納
-
Excel オートフィルタのリスト...
-
iniファイルのキーと値を取得す...
-
【VBA】ユーザーフォーム リス...
-
Split関数でLong配列に格納する...
-
配列のSession格納、及び取得方...
-
VB6.0 ファイルの一括読込み
-
Dictionaryを使い4つの条件の一...
-
INDEX(D:D,L3)の意味は?
-
SUMPRODUCT関数を用いた最小値
おすすめ情報