000000 ランダム
 ホーム | 日記 | プロフィール 【フォローする】 【ログイン】

ULALA13のブログ

全37件 (37件中 1-10件目)

1 2 3 4 >

VBA

2020年09月22日
XML
カテゴリ:VBA
​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​前回はタイトル行に絞って記載した。
データ行、全体行の3パターンで記載してみる
とのことで記載したが、ちょっと変更させて頂こうと思う。

今回は前回伝えきれなかった、データ行、全体行
という区分けではなく、列の指定方法について
記載してみる。
​※必然的に次回は行の指定方法になるわけだが、、​​

--------------------------------------
①Range("テーブル名").ListObject.ListColumns
②Range("テーブル名").ListObject.ListColumn
--------------------------------------

以下画像は前回のものから「テーブル列取得」
というボタンを新たに追加してみた。

ボタンを押下した時に
14、15行目にデータを
転記する、というシンプルなものを作成。
転記する元データはテーブル1のタイトル部と
データ部の1行目を対象にしている。



ソース

Sub getTableColumns()
    ' 列名をセルに表示
    Range("B14").Value = Range("テーブル1").​ListObject​.ListColumns(1)​
    Range("C14").Value = Range("テーブル1").​ListObject​.ListColumns(2).Name​
    Range("D14").Value = Range("テーブル1").​ListObject​.ListColumns("値段")​
    Range("E14").Value = Range("テーブル1").​ListObject​.ListColumns("日付").Name​

    ' 列データをセルに表示
    Range("B15").Value = Range("テーブル1").​ListObject​.ListColumns(1).Range(2)​
    Range("C15").Value = Range("テーブル1").​ListObject​.ListColumns(2).Range(2).Value​
    Range("D15").Value = Range("テーブル1").ListObject.​ListColumns("値段").DataBodyRange(1)​
    Range("E15").Value = Range("テーブル1").​ListObject​.ListColumns("日付").DataBodyRange(1).Value​

End Sub

結果



.ListColumns
→テーブルに存在する全列(データ部含む)を表す。

.ListColumns(1)
→テーブルの1列目を表す。(=
.ListColumn​)
※この場合「お店」列
​​.Nameはつけてもつけなくても良いがパターンとして記載してみた。

.ListColumns(1).Range(2)
→「お店」列の2つ目の値を表すので、上記画像の場合、
 "八百屋A"となる。

 ちなみに​​
.ListColumns(1).Range(1)とすると
 タイトルである"お店"が転記される。

.ListColumns("値段").DataBodyRange(1)
→「値段」列のデータ部の1つ目を表すので、
 上記画像の場合、"150"となる。

 同じく、
.ListColumns("値段").DataBodyRange(0)とすると​
 データ部の0番目(そんなのないが、、)である、
 "値段"、すなわちタイトル部が転記される。
 ※あまりこういう使い方することは無いと思うが、
 エラーにはならず、値として取得できる為、一応記載。


テーブルと列、データの関係を簡単に
色分けして、範囲で
表してみた。



次回は、行についての指定方法を記載する予定。






最終更新日  2020年09月22日 23時44分15秒
コメント(0) | コメントを書く


2020年09月17日
カテゴリ:VBA
​​​​前回に引き続き、テーブルについての内容を
記載していこうと思う。

--------------------------------------

①Range("テーブル名").ListObject.HeaderRowRange
--------------------------------------

本当は、タイトル行、データ行、全体
と3パターン記載したかったのだが、
タイトル行だけで
いろいろと罠?
仕掛けられているのが分かったため、

今回はタイトル行に絞って記載してみる。

​​​​​前回の画像に「テーブル行取得」というボタンを
つけて、タイトル行を取得してみる。



ソース
​​​
Sub getTableHeader()
    ' ヘッダ行の選択​​​

​​    Range("テーブル1").ListObject.HeaderRowRange.Activate
​​

    ' ヘッダ行から
​​​    MsgBox (Range("テーブル1").ListObject.HeaderRowRange(1).Value)​​​
​​​    MsgBox (Range("テーブル1").ListObject.HeaderRowRange(2).Value)​​​
​​​    MsgBox (Range("テーブル1").ListObject.HeaderRowRange(3).Value)​​​
​​​    MsgBox (Range("テーブル1").ListObject.HeaderRowRange(4).Value)​​​

    ​' 範囲外の取得がどうなるか?​
​​​    MsgBox (Range("テーブル1").ListObject.HeaderRowRange(0).Value)​​​
​​​    MsgBox (Range("テーブル1").ListObject.HeaderRowRange(26).Value)​​​
​End Sub​

結果





結果より、
上記までは想像がつく。

結果1枚目は、
Range("テーブル1")..ListObject.HeaderRowRange.Activate
テーブルのヘッダ行をアクティブにする。
つまり選択状態にすることが確認できた。

Range("テーブル1").ListObject.HeaderRowRange(1)~(4)
はヘッダ行をひとつずつダイアログで出力している。
ここまでは想定内の結果が得られた。

となると、javaの試験のクセで、テーブルの範囲外を
指定した場合、一体どうなるか?も見てみたくなる。

プログラム上では既に範囲外を表示する2文を追記
しているので、以下がその結果。

.ListObject.HeaderRowRange(0).Value​​


なるほど、、テーブルの枠を超えて外側を
指定することもできるようだ。

ちなみにもう1列テーブルの左側に増やせば、
​​
.ListObject.HeaderRowRange(-1).Value​​
で値を取得することも可能。
※今は存在しないので-1を指定した場合、エラーになる。

では+方向に超えた場合はどうなるか?
たぶん何もないメッセージが表示されるだろう
と思ったのだが、、

.ListObject.HeaderRowRange(26).Value​​​​​​​


なんと、.HeaderRowRangeと銘打って
いるのに、​データ部を表示する​ことが判明。
※これを書く前に発覚したので、
 わかりやすいようにデータがひとつしかない「梨」
 を指定してみた。


テキストにはここまで記載されていないので、
試験として出題されるかは不明だが、覚えておくと
良いかと思う。​​​​​​​​


​​​​​Excel VBAスタンダード VBAエキスパート公式テキスト [ 田中亨 ]​​​​​​
​​​​​
​​






最終更新日  2020年09月17日 22時47分30秒
コメント(0) | コメントを書く
2020年09月16日
カテゴリ:VBA
​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​今回からテーブルについて記載していこうと思う。
テーブルと言っているが、具体的には、
ListObjects(ListObject)のことを言う。​

こちらも並び替え同様、新しく追加された項目で、
量が多いため、何回かに分けて
記載してみようと思う。

今回は表からテーブルの作成方法
および、
​ListObjectからのテーブル名取得&表示​​

を実施してみる。

--------------------------------------
①ListObjects
--------------------------------------

まずは、表形式のデータをテーブル形式の
データに変換してみる。

下記画像の通り、表を作成したのち、

「Ctrl」+「T」と入力すると「テーブルの作成」
ダイアログが表示される。

見出し込みで範囲を合わせてOKボタンを押下する。



綺麗に色分けされ、「テーブル」として設定された。
※この段階でVBA的にもListObjectとして扱えることになるが、
今まで通りRange("B2").Value等での値の取得も可能。(メリットは無いだろうが、、)




テーブルにはテーブル名がつけられる。
ルールとしては、記載したExcelブック内で唯一の
名前となる。





確認の為、追加で2つほど表を作り、それらをテーブル化し、
それぞれ、テーブル2、テーブル3、という名前を付けた。
テーブル右下にテーブルの名前の画像を証拠として貼り付け。



ソース

Sub getTableNames()
    ' シートに存在するテーブルの数を表示
    MsgBox ("テーブルの数は" & ​Sheets(4).ListObjects.Count​ & "です")

    ' テーブル名を表示
    Dim i As Long
    For i = 1 To Sheets(4).ListObjects.Count Step 1
        MsgBox (​Sheets(4).ListObjects(i)​)
    Next i
    ' テーブル名は以下の方法でも取得可
    'Sheets(4).ListObjects(2).Name
    'Sheets(4).ListObjects(3).DisplayName
End Sub

結果



Sheet(4)は今回利用したシートの番号。
本シートには
Sheets(4).ListObjects.Count
により、3つのListObjectつまりテーブルが
設定されており、きちんとテーブル名が
表示されたことが確認できた。


また、ListObjectsは、
0番目ではなく、
1番目から始まるところに注意

今回は簡単にテーブルの名称を表示する処理を記載してみた。
次回からはデータ部についての操作方法などを記載しようと思う。







最終更新日  2020年09月16日 22時56分48秒
コメント(0) | コメントを書く
2020年09月15日
カテゴリ:VBA
​​​​​​​​​​​​​​​​​​​​​​​​​​引き続き、データの並び替えを記載。
今回はExcel2003での簡易的な並び替えでの記述方法と、
漢字による並び替えの挙動を見ていこうと思う。


--------------------------------------
①Range.Sort
--------------------------------------

​下記画像は苗字による並び替えを行おうと思う。
感のいい方は既にこの段階で疑問が出てきている
と思うが、とりあえずボタン押下で、
どのように並び変わるかを見てみる。



ソース

​​Sub sortFamilyName()​
    Range("B19").Sort key1:=Range("B19"), order1:=xlAscending, Header:=xlYes
End Sub

結果


​皆さんの思った通りに並び変わっただろうか?
漢字で並び替えを行った場合、
元の情報がどのようになっているかによって
並び替えが変わる。

つまり、漢字変換前に入力した"読み"がセル内に
登録されている為、上記のような並びとなる。

ふりがなを表示してみる。

苗字を選択した状態で、
ホーム→下記画像の「ア亜」アイコン?より、
ふりがなの表示を押下。





苗字(漢字)の上にフリガナが表示された。



画像の通り、
ひとつめの新垣はアラガキ
ふたつめの新垣はニイガキ
と入力して漢字変換したため、それぞれ、同一漢字にも
関わらず、アラガキ、ニイガキ、のように
異なるフリガナでセルに登録されている為、ふたつめの新垣が
いちばん最後に並び変わっていることになる。


テストとして出題されそうなのは、

①漢字はふりがなで並び替えられる
②ふりがなが設定されないケース3種
 ②-1:​他のアプリケーションからコピーしてきた時​
 ②-2:​マクロでセルに漢字を代入した時​
 ②-3:​CSVファイルを読み込んだ時​

これくらいかと思う。

​​​​​






最終更新日  2020年09月15日 23時39分29秒
コメント(0) | コメントを書く
2020年09月12日
カテゴリ:VBA
​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​今回からデータの並び替えについて記載。

尚、テキストを持っている方は分かると思うが、
Excel2007からは以前(2003)よりも記載内容が多く、
複雑になったので少し整理しながら記載したいと思う。

--------------------------------------
①Worksheets.Sort(設定)
②Worksheets.Sort.Apply(実行)
--------------------------------------

下記画像にて、
並替対象欄:お店、商品、値段、日付で指定可能
順欄:昇順か降順で指定可能
とした。

なお、並び替え前の状態を保持しておくため、
G列以降に並べ替える前の状態を記載しておく。



ソース

Sub setSortBasic()
    ' 初期設定
    Worksheets(3).Sort.SortFields.Clear

    ' 並替対象
    Dim sortPoint ​As ​String​​
    ​Select Case​ Range("C2").Value
        Case "お店"
            sortPoint = "B5"
        Case "商品"
            sortPoint = "C5"
        Case "値段"
            sortPoint = "D5"
        Case "日付"
            sortPoint = "E5"
        Case Else
            ' 取得できなかった時のデフォルト(値段)
            sortPoint = "D5"
        End Select

    ' 順取得
    Dim ​​sortOrder ​​As Integer
    Select Case Range("E2").Value
        Case "昇順"
            sortOrder = 1   ' xlAscending
        Case "降順"
            sortOrder = 2   ' xlDescending
        Case Else
            ' 取得できなかった時のデフォルト(昇順)
            sortOrder = 1
        End Select

    ' ソート条件設定
    Worksheets(3).​​Sort.SortFields.Add Key:=Range(sortPoint), _​​
        ​SortOn:=xlSortOnValues, Order:=​​​sortOrder​​, ​DataOption:=xlSortNormal​

    ' ソート実行
    With Worksheets(3).​Sort​
        ​.SetRange Range("B5:E14")​
        ​.Header = xlNo​
        ​.Orientation = xlTopToBottom​
        ​.Apply​
    End With

End Sub

結果



値段の昇順で並び替えられたことが確認できた。

​​​​​ソースが長くなってしまったが、
Excel2007以降は、
ソート条件設定ソート実行の2つで構成
されるようになった。

ソート条件の方から分解してみていく。

と、その前に初期設定の
​​Worksheets(3).Sort.SortFields.Clear​​
についてだが、
これはマクロ実行前にソート
されていた際ソート条件が追加されてしまうため、
念のためソート条件をクリアしておこう、ということ。

では気を取り直して、、

Worksheets(3).​Sort.SortFields.Add​
→並び替えの設定開始

​​Key:=Range(sortPoint)​​
→どの列を基準に並び替えを行うかを指定
​​​​​ この場合、値段を基準とするため、
 case式の"D5"が設定されることになる。

SortOn:=xlSortOnValues, 
→何をもとに並び替えをするか?ということ。
 上記指定の場合、セル内の値を元に並び替えをするということ。
 ほかにも、セル内の文字の色(xlSortOnFontColor)や
 セルの背景色(xlSortOnCellColor)で
 並び替えを行う指定が可能。​(今回は割愛)​


​Order:=sortOrder,​
→今回はソート順をExcelのセル内で指定できるように
 したため、必然的に変数を利用することになる。
 テキストや一般的なサイトには、
 xlAscending:昇順
 xlDescending:降順

 で記載されることが多いが、この値自体が定数なので、
 F2を押下し、ライブラリ検索してみれば実際の値がみられる。

昇順の定数)


降順の定数)


 ここだけに限った話ではないが、
 定数指定されている箇所はライブラリ検索でどういう値が
 設定されているかを確認すれば、変数として設定する
 ことも可能なのでF2のクセを付けておくと良いかと思う。

DataOption:=xlSortNormal
→並び替え対象のデータに数値と文字列が混在していた場合
 の並べ替え方法を指定。
 xlSortNormal:文字列と数値を別々に並び替える
 xlSortTextAsNumbers:文字列を数値として並び替える

 上記の画像例だと、値段欄の書式に文字列が混ざって
 いた場合に、それを加味して並び替える(
xlSortTextAsNumbers)か
 数値と文字列は別々に並び替える(
xlSortNormal)かということ。


​続いて、ソート実行の方を見ていく。​

With Worksheets(3).Sort
 →Sort実行するための条件を設定する為、With句で宣言

.SetRange Range("B5:E14")​
 →並び替えるデータの範囲を指定

.Header = xlNo​
 →上記で指定した範囲にヘッダ(タイトル)行が含まれるかどうか?
   xlNo:ヘッダ行含まないので上記範囲をそのまま並び替え

   xlYes:ヘッダ行含むので上記範囲の2行目から並び替え

.Orientation = xlTopToBottom​
 →並び替える方向をどうするか?
  xlTopToBottom:上から下、つまり行を並び替える
  xlLeftToRight:左から右、列を並び替える


.Apply​
 →並び替え実行
​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​
以上、並び替えの基本的な部分について記載。

​​






最終更新日  2020年09月12日 23時04分53秒
コメント(0) | コメントを書く
2020年09月10日
カテゴリ:VBA
​​​​​前回でAutoFilterは終了、と記載したが、
書き忘れたものがあったので追記。

--------------------------------------
①Range.AutoFilter
--------------------------------------

画像はオートフィルタを設定⇔解除
をボタンで交互に行う方法。



ソース

Sub setFilter()​
​    ​' オートフィルタが設定されていた場合​
​​    If ActiveSheet.AutoFilterMode = ​True Then​​
        ​' オートフィルタクリア​
​​        Range("B127").AutoFilter​​
    ​Else​
        ​' オートフィルタ設定​

​​        Range("B127").​AutoFilter 1
    ​End If​
​End Sub​

結果



Range("B127").​AutoFilter 1

​​のように、AutoFilterの後に絞り込みの列番号だけを指定
すると、フィルタ機能だけを付けることができる。​​
※第2引数以降は記入しない
​​​
この状態で再度ボタンを押下すると、今度は
フィルタ機能を解除することができる。

オートフィルタが設定されているかどうかの条件式は
テキストには出てきていない為、参考程度でどうぞ。






最終更新日  2020年09月10日 23時43分51秒
コメント(0) | コメントを書く
2020年09月09日
カテゴリ:VBA
​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​今回は絞り込んだデータを一括で編集する
方法を記載する。

--------------------------------------
①Range.AutoFilter
②.End(xlUp)、.End(xlDown)
--------------------------------------

112行目の指定商品で記入された商品を
絞り込んで、その横の金額​で一括設定し
絞り込みを解除して表示する、というような
動きにしてみた。

※メロンが大豊作だったという設定のもと、
全ての店で売られるメロンを
無料にしてみる。



ソース

Sub setAlllPrice()

    ' オートフィルタクリア
    Range("B114").AutoFilter

    ' 指定商品による絞り込み
    Range("B114").AutoFilter 2, Range("C112").Value

    ' 絞り込み後データを全て指定の値段にする
    Range(Range("D115"), Cells(Rows.Count, 4)​.End(xlUp)​) = Range("E112").Value

    ​' オートフィルタクリア​
    Range("B114").AutoFilter

End Sub

結果



全てのメロンの値段が無料になっている
ことが確認できた。

Range(Range("D115"), Cells(Rows.Count, 4)​.End(xlUp)​)

について、Rangeが入れ子になっており、
少し複雑なので分解して書いてみると、、

​​Rangeは、Range(,)で指定するので、​​
​​Range(Range("D115"),  ​Cells(Rows.Count, 4)​.End(xlUp)​​)​​

​​Range("D115")
 結局の所、115行目というだけのこと。​​

Cells
(Rows.Count, 4)​.End(xlUp)は、
 Rows.Countがエクセルの最終行を表す関数
 (すなわち1048576行)なので
Cells(1048576, 4)となる。

 さらにその場所から、.Endプロパティによりデータの終端を探す。
 終端といっても下に行くだけでなく、この場合は、
 ​​.End(xlUp)​の通り、UPということなので、
 Cells(1048576, 4)からデータのある個所まで上へさかのぼれ

​ということになる。
※.End(xlDown)だったら逆に、データのある個所まで
下へ降りろ、ということ。

さかのぼった結果、見つかったデータが最終データ
となるので、
上記画像の場合、D124が最終データ
となる。

よって
Range(Range("D115"),  ​Cells(Rows.Count, 4)​.End(xlUp)​​)

​​​Range("D115:D124")​​​
ということになる。
​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​
こうして​晴れて絞り込みを行ったデータのみを

一括で変更することができた。

今回で一通り絞り込みについての内容が記載できたので、

次回からはデータの並べ替えについて記載してみようと思う。






最終更新日  2020年09月09日 21時29分12秒
コメント(0) | コメントを書く
2020年09月08日
カテゴリ:VBA
​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​今回は絞り込んだデータを元に合計値を
算出する方法を記載する。

--------------------------------------
①Range.AutoFilter
②WorksheetFunction.Subtotal
--------------------------------------

指定商品に商品名を入力し、
「絞り込み&合計算出」ボタンを押下すると
絞り込みされた商品の合計値を算出し
合計欄に記載する。



ソース

Sub setAutoFilterAndSubtotal()

    ' 合計金額格納用変数
    Dim sumPrice As Long

    ' オートフィルタクリア
    Range("B87").AutoFilter

    ' 指定商品による絞り込み
    Range("B87").AutoFilter 2, Range("C85").Value

    ' 絞り込み後合計値算出
    sumPrice = ​WorksheetFunction.Subtotal​(​9​, Range("D88:D97"))

    ' 合計値セット
    Range("E85").Value = sumPrice

End Sub

結果




WorksheetFunction.Subtotalの引数は、、
第1引数:集計方法
第2引数:範囲

となっており、第1引数は以下のように

指定する数値で集計方法が決まっている。

1:平均値

2:数値の個数の合計
3:データの個数の合計
4:最大値
5:最小値
6:積(掛け算)
7:不偏標準偏差
8:標本標準偏差
9:合計値
10:不偏分散
11:標本分散

※1の代わりに101、2の代わりに102、、
と、+100した値を引数に指定しても同じ結果が返却される。

1番台は、VBAからではなくExcelを手作業で非表示にした場合は計算対象にする。
100番台は、手作業で非表示した分も計算対象にする。

という違いがあるが、試験にはまず出ないと思うので覚えなくて良いかと。
Excel関数として設定した場合の話だし、
そもそも手作業はVBAプログラムの範囲外だから。

​​​​​全ての集計方法で表示してみる。
​​※数値の個数とデータの個数の違いを見るため
りんごに"無料"と記載したデータを用意している。




ソース(抜粋)

Range("B100").Value = WorksheetFunction.Subtotal(1, Range("D88:D97"))   ' 平均
Range("C100").Value = ​WorksheetFunction.Subtotal​(2, Range("D88:D97"))   ' 数値の個数
Range("D100").Value = WorksheetFunction.Subtotal(3, Range("D88:D97"))   ' データの個数
Range("E100").Value = WorksheetFunction.Subtotal(4, Range("D88:D97"))   ' 最大値
Range("F100").Value = WorksheetFunction.Subtotal(5, Range("D88:D97"))   ' 最小値
Range("B104").Value = WorksheetFunction.Subtotal(6, Range("D88:D97"))   ' 積
Range("C104").Value = WorksheetFunction.Subtotal(7, Range("D88:D97"))   ' 不偏標準偏差
Range("D104").Value = WorksheetFunction.Subtotal(8, Range("D88:D97"))   ' 標本標準偏差
Range("E104").Value = WorksheetFunction.Subtotal(9, Range("D88:D97"))   ' 合計値
Range("F104").Value = WorksheetFunction.Subtotal(10, Range("D88:D97"))  ' 不偏分散
Range("G104").Value = WorksheetFunction.Subtotal(11, Range("D88:D97"))  ' 標本分散

結果



りんごひとつに"無料"​​​​​と記載したことで、
数値の個数が2、データの個数が3と、

差異が出ていることが確認できた。

恐らく試験には、3、9あたりしか出ないと思うので、
標準偏差などは特に覚えなくても良いかと思う。






最終更新日  2020年09月08日 23時28分52秒
コメント(0) | コメントを書く
2020年09月06日
カテゴリ:VBA
​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​今回は絞り込んだデータをコピペする
方法を記載する。

--------------------------------------
①Range.AutoFilter
CurrentRegion
--------------------------------------

長い名前のボタンで恐縮だが、、
ボタン名の通り
バナナorメロンで絞り込みした後、
B79セル以下に
絞り込みしたデータを張り付ける。

良くやってしまいがちなNGパターンを先に見てみる。



ソース(NG例)

Sub setAutoFilterAndRangeCopy()

    ' オートフィルタクリア
    Range("B66").AutoFilter

    ' バナナ or メロンで絞り込み
    Range("B66").AutoFilter 2, "バナナ", xlOr, "メロン"

    ' 範囲コピー
    'Range("B66").​CurrentRegion​.Copy Range("B79")

End Sub

結果(NG例)



抽出対象のデータのタイトル部を元に、
CurrentRegionを利用することで

見えている範囲(=アクティブセルの範囲)を
指定することができる

見てわかる通り、
79行目にタイトル部が入ってしまって
いるため
データ部だけを範囲としてコピーする必要が
ある
のでプログラムを修正する。
※データ部を開始行とすると、上記の場合、B67セルが
リンゴの為、絞り込みの非表示部に入ってしまうので、
場合によっては正常な範囲データが取得できなくなる
可能性があるので、タイトル行を範囲取得の開始行としている。

ソース(OK例)

Sub setAutoFilterAndRangeCopy()

    ' オートフィルタクリア
    Range("B66").AutoFilter

    ' バナナ or メロンで絞り込み
    Range("B66").AutoFilter 2, "バナナ", xlOr, "メロン"

    ' 範囲コピー(NG)
    'Range("B66").CurrentRegion.Copy Range("B79")

    ' 範囲コピー(OK)
    Range("B66").​CurrentRegion.Offset(1, 0)​.Copy Range("B79")

End Sub

結果(OK)



ソースより

Range("B66").CurrentRegion.Offset(1, 0)

のようにCurrentRegionにoffsetを利用することで
​タイトル行のひとつ下の見えている行​
範囲の開始行としたため、データ部から
範囲コピーできるようになる。

次回は絞り込んだデータを元に
計算処理を行う方法を記載しようと思う。






最終更新日  2020年09月06日 23時25分16秒
コメント(0) | コメントを書く
2020年09月05日
カテゴリ:VBA
​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​引き続きAutoFilterについてだが、
今回はひとつの列に3つ以上を
条件として指定したい場合に、
配列を指定する方法を記載する。​

--------------------------------------
①Range.AutoFilter
--------------------------------------

下記画像の通り、「指定商品」欄に絞り込みしたい
商品を3つ記入して「絞り込み」ボタンを押下する。



ソース

Sub setAutoFilterArray()

    ' オートフィルタクリア
    Range("B50").AutoFilter

    ' 配列を用意しシートから絞り込み条件を設定
    Dim fil(2) As String
    fil(0) = Range("C48").Value
    fil(1) = Range("D48").Value
    fil(2) = Range("E48").Value

    ' 配列を元に絞り込み
    Range("B50").AutoFilter 2, ​fil, xlFilterValues​

End Sub

​結果​



バナナ、梨、りんごで絞り込みされ、
メロンは表示されていないことが確認できた。


引数について、、

第1引数:絞り込みさせたい列番号
第2引数:配列の変数名
第3引数:値(※)
※複数の値で絞り込みする場合「xlFilterValues」と記入する
​​​​​​​​​​​​​​​​​​​​​​​
配列については3つ以上に限った話ではなく、
2つでも1つでも可能。
※その場合わざわざ配列指定しないだろうが
実務で動的配列を扱う場合等が考えられるため、
試験用に覚えておくと良いかと思う。
​​​​​






最終更新日  2020年09月06日 18時08分04秒
コメント(0) | コメントを書く

全37件 (37件中 1-10件目)

1 2 3 4 >


Copyright (c) 1997-2020 Rakuten, Inc. All Rights Reserved.