Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 7 Professional : Excel 2010)
複数列選択方法
投稿日時: 18/01/17 18:47:23
投稿者: こまじろう

いつも大変お世話になっております
ご教示頂けたら幸いです
複数列セレクトしたいのですが
単列だと出来るのですが  Range(.Cells(2, d), .Cells(20, d)).Select
複数列だと出来ません  書き方を教えてください
下記の書き方は却下されてます
 
Range(.Cells(2, d), .Cells(20, d), .Cells(2, dd), .Cells(20, dd)).Select
大変お手数お掛けしますが宜しくお願いいたします
Private Sub CommandButton3_Click()
Dim d As Long
Dim dd As Long
Dim g1a As Variant
Dim g2a As Variant
 
If Not TextBox1.Value = Empty Then
    Set g1a = Rows("2").Find(TextBox1, LookIn:=xlFormulas)
        If Not g1a Is Nothing Then
               d = g1a.Column
End If
End If
If Not TextBox2.Value = Empty Then
    Set g2a = Rows("2").Find(TextBox2, LookIn:=xlFormulas)
        If Not g2a Is Nothing Then
               dd = g2a.Column
End If
End If
With ActiveSheet
Range(.Cells(2, d), .Cells(20, d), .Cells(2, dd), .Cells(20, dd)).Select
End With
End Sub

回答
投稿日時: 18/01/17 19:30:25
投稿者: WinArrow
投稿者のウェブサイトに移動

列を操作する場合は
Colimnsプロパティを使います。
 

E列〜H列を選択する場合、
 
With Activesheet
    .Columns("E:H").Select
 
 
なお、Selectしなくても処理できるので
極力、Selectは津かwないようにしましょう。

回答
投稿日時: 18/01/17 19:36:17
投稿者: WinArrow
投稿者のウェブサイトに移動

引用:

Dim g1a As Variant
Dim g2a As Variant

 
データ型をRangeに変更しましょう。
 
引用:

 With ActiveSheet
 Range(.Cells(2, d), .Cells(20, d), .Cells(2, dd), .Cells(20, dd)).Select
 End With
 End Sub
 

> Range(
 
ここにも「.」を付けましょう
.Range(

回答
投稿日時: 18/01/17 19:37:23
投稿者: WinArrow
投稿者のウェブサイトに移動

文章訂正
>極力、Selectは津かwないようにしましょう。

極力、Selectは使わないようにしましょう。

回答
投稿日時: 18/01/17 20:13:39
投稿者: WinArrow
投稿者のウェブサイトに移動

>Range(.Cells(2, d), .Cells(20, d)).Select
と同じ考え方で
 
1行で記述するには、
 
    Union(Range(Cells(2, "C"), Cells(20, "C")), Range(Cells(2, "E"), Cells(20, "E"))).Select
 
こんな感じになります

回答
投稿日時: 18/01/18 08:08:33
投稿者: mattuwan44

引用:
With ActiveSheet
Range(.Cells(2, d), .Cells(20, d), .Cells(2, dd), .Cells(20, dd)).Select
End With

 
  
   
 ↓
   
msgbox application.range(g1a,g2a).resize(19).address
   
折角取得したセルの列番号だけを別途取り出して、
余分な変数を用意して代入して使う必要はないと思います。

回答
投稿日時: 18/01/18 08:26:33
投稿者: WinArrow
投稿者のウェブサイトに移動

>折角取得したセルの列番号だけを別途取り出して、
>余分な変数を用意して代入して使う必要はないと思います。
 
そうですね・・・・
 
それだったら
 Msgbox Union(g1a,g2a).Address
ではないでしょうか・・

回答
投稿日時: 18/01/18 08:30:28
投稿者: WinArrow
投稿者のウェブサイトに移動

ところで、
コードをよく見てなかったので、今更になってしまいますが、
 
Findで存在しなかったとき(g1a Is Nothing )でも
 
>With ActiveSheet
> Range(.Cells(2, d), .Cells(20, d), .Cells(2, dd), .Cells(20, dd)).Select
> End With
 が実行されてしまうけど・・・対応を検討してみてください。

回答
投稿日時: 18/01/18 08:31:23
投稿者: mattuwan44

Sub test()
    Dim g1a As Range
    Dim g2a As Range

    With ActiveSheet.UsedRange.Rows(2)
        Set g1a = .Find(textbox1.Text, LookIn:=xlFormulas, LookAt:=xlWhole)
        If g1a Is Nothing Then Exit Sub
        Set g2a = .Find(textbox2.Text, LookIn:=xlFormulas, LookAt:=xlWhole)
        If g2a Is Nothing Then Exit Sub
    End With

    Application.Range(g1a, g2a).Resize(19).Select
End Sub

表の中に空白セルはないだろうという前提だと、
テキストボックスが空白のまま検索ボタンを押しても、
ヒットするはずがないのでExitするかなぁ〜〜と思うと、
空白のチェックはなくてもいいかも?
(ある方が丁寧ではあります。が、無駄と言えば無駄?個人の自由だとは思います。)

投稿日時: 18/01/18 08:49:23
投稿者: こまじろう

おはよう御座います
WinArrow様
有難う御座います
selectは使用すべきでないのですが
少し解らない事があって
知り合いに聞かれたもので
出来なかったので質問させていただきました
色々有難う御座います
mattuwan44様
有難う御座います
考え方まで 本当にご指導頂き有難う御座います
 
少し試してみます

投稿日時: 18/01/18 09:03:24
投稿者: こまじろう

考え方として飛び列をセレクトしたいのです
 
A2〜A20 固定 TextBox1の値の列 TextBox2の値の列
この3列だけをセレクトしたいと考えております
 
手動でマウス等使う場合 Cirlキーを使って複数列使用する感じです
 
    Range("A2:A20,E2:E20,I2:I20").Select
上記のような感じにしたいのです
 

回答
投稿日時: 18/01/18 09:26:38
投稿者: mattuwan44

じゃ、Union関数で和集合を求めればいいと思います。
 
union(range("A2:A20",g1a.resize(19),g2a.resize(19)).select

投稿日時: 18/01/18 09:29:02
投稿者: こまじろう

  
WinArrow様
下記文で無事解決しました
有難う御座いました
Union(Range(Cells(2, "C"), Cells(20, "C")), Range(Cells(2, "E"), Cells(20, "E"))).Select