Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


836 / 13645 ツリー ←次へ | 前へ→

【78053】指定範囲内の行、及び列を、指定数おきに非表示または選択したい 困っています 16/3/17(木) 14:41 質問[未読]
【78058】Re:指定範囲内の行、及び列を、指定数おき... β 16/3/17(木) 17:34 発言[未読]
【78059】Re:指定範囲内の行、及び列を、指定数おき... β 16/3/17(木) 22:54 発言[未読]
【78060】Re:指定範囲内の行、及び列を、指定数おき... 困っています 16/3/18(金) 16:19 お礼[未読]

【78053】指定範囲内の行、及び列を、指定数おきに...
質問  困っています  - 16/3/17(木) 14:41 -

引用なし
パスワード
   初めまして。自力ではどうにもできなかったため、
お知恵をお貸し頂けないでしょうか。

Excelにて、まず範囲を選択し、その範囲内において、
飛び数を指定し、そのとび数おきに列を選択する、
または非表示にすることはできないでしょうか。

例えば、

A列からZ列を選択し、マクロを実行すると、
「飛び数を指定して下さい:」と表示され、
1を入れたら、A列からZ列の間を1列おきに選択(ないし非表示)にする。
2を入れたら、A列からZ列の間を2列おきに選択(ないし非表示)にする。

といった形です。

範囲は常にA列からZ列ではないため、決め打ちでVBAに指定はできません。
(都度取得したい)

出来れば行にも対応できると助かります。
列用と行用でマクロが2つになっても構いません。
(1つになると万々歳ではありますが・・・!)

以上、何卒ご助力の程、よろしくお願い致します。

【78058】Re:指定範囲内の行、及び列を、指定数お...
発言  β  - 16/3/17(木) 17:34 -

引用なし
パスワード
   ▼困っています さん:

これだけの選択肢があるわけですから、ユーザーフォームで条件をセット、
あるいはシート上のオプションボタン等で条件をセットして実行するのが
わかりやすいとは思いますが、以下は遊びです。
対象領域もマクロ内で選択させます。

Private Declare Function GetCurrentThreadId Lib "kernel32" () As Long
Private Declare Function SetWinEventHook Lib "user32" _
    (ByVal eventMin As Long, ByVal eventMax As Long, _
    ByVal hmodWinEventProc As Long, _
    ByVal pfnWinEventProc As Long, _
    ByVal idProcess As Long, ByVal idThread As Long, _
    ByVal dwFlags As Long) As Long
Private Declare Function UnhookWinEvent Lib "user32" _
    (ByVal hWinEventHook As Long) As Long
Const WINEVENT_OUTOFCONTEXT = &H0
Const EVENT_SYSTEM_ALERT = &H2
Private Declare Function SetDlgItemText Lib "user32" _
    Alias "SetDlgItemTextA" _
    (ByVal hDlg As Long, ByVal nIDDlgItem As Long, _
    ByVal lpString As String) As Long


Sub Test()
  Dim ans As Variant
  Dim ansStr As String
  Dim disp As VbMsgBoxResult
  Dim DoRow As VbMsgBoxResult
  Dim n As Long
  Dim r As Range
  Dim msg As String
  Dim x As Long
  Dim a As Range
  Dim func As Boolean
  
  On Error Resume Next
  Set r = Application.InputBox("処理する領域を選択してください", Type:=8)
  On Error GoTo 0
  
  If r Is Nothing Then Exit Sub
  
  SetWinEventHook EVENT_SYSTEM_ALERT, EVENT_SYSTEM_ALERT, _
          0, AddressOf WinEventProc1, 0, _
          GetCurrentThreadId(), WINEVENT_OUTOFCONTEXT
  disp = MsgBox("表示/非表示どちらにしますか?", vbYesNoCancel Or vbQuestion)
  
  If disp = vbCancel Then Exit Sub
  
  If disp = vbYes Then
    msg = "表示"
  Else
    msg = "非表示"
  End If
  
  SetWinEventHook EVENT_SYSTEM_ALERT, EVENT_SYSTEM_ALERT, _
          0, AddressOf WinEventProc2, 0, _
          GetCurrentThreadId(), WINEVENT_OUTOFCONTEXT
  DoRow = MsgBox(msg & " が選ばれました" & vbLf & _
    "行/列どちらにしますか?", vbYesNoCancel Or vbQuestion)
  
  If DoRow = vbCancel Then Exit Sub
  
  If DoRow = vbYes Then
    msg = msg & "/行 "
  Else
    msg = msg & "/列 "
  End If
  
  n = Application.InputBox(msg & "が選ばれました" & vbLf & "何行おきに処理しますか?", Type:=1)
  
  If n = 0 Then Exit Sub
  
  If disp = vbYes Then func = True
  
  If DoRow = vbYes Then
    For x = 1 To r.Rows.Count Step n
      r.Rows(x).EntireRow.Hidden = Not func
      r.Rows(x).Offset(1).Resize(n - 1).EntireRow.Hidden = func
    Next
  Else
    For x = 1 To r.Columns.Count Step n
      r.Columns(x).EntireColumn.Hidden = Not func
      r.Columns(x).Offset(, 1).Resize(, n - 1).EntireColumn.Hidden = func
    Next
  End If
  
End Sub

Private Sub WinEventProc1( _
      ByVal hEvent As Long, ByVal dwEvent As Long, _
      ByVal hwndMsg As Long, ByVal idObject As Long, _
      ByVal idChild As Long, ByVal idThread As Long, _
      ByVal dwmsEventTime As Long)
  UnhookWinEvent hEvent
  SetDlgItemText hwndMsg, vbYes, "表示"
  SetDlgItemText hwndMsg, vbNo, "非表示"
  SetDlgItemText hwndMsg, vbCancel, "や〜めた"
End Sub

Private Sub WinEventProc2( _
      ByVal hEvent As Long, ByVal dwEvent As Long, _
      ByVal hwndMsg As Long, ByVal idObject As Long, _
      ByVal idChild As Long, ByVal idThread As Long, _
      ByVal dwmsEventTime As Long)
  UnhookWinEvent hEvent
  SetDlgItemText hwndMsg, vbYes, "行"
  SetDlgItemText hwndMsg, vbNo, "列"
  SetDlgItemText hwndMsg, vbCancel, "や〜めた"
End Sub

【78059】Re:指定範囲内の行、及び列を、指定数お...
発言  β  - 16/3/17(木) 22:54 -

引用なし
パスワード
   ▼困っています さん:

アップしたコードは、たとえば 3 といれた場合、行の表示処理だとすると
3行1ブロックで ブロックの1行目が表示、2,3行目が非表示というロジックにしました。
質問を読み返してみると、1 なら 1行おき ということですから、提示要件とアップしたコードとは
整合性がとれていませんが、まぁ、そのあたりは、コードで対処している規則で
ためしてください。

どうしても 1 なら 1行おき(つまり 2行ブロック)、2 なら 2行おきということであれば

If n = 0 Then Exit Sub

この下に

n = n + 1

をいれてください。

【78060】Re:指定範囲内の行、及び列を、指定数お...
お礼  困っています  - 16/3/18(金) 16:19 -

引用なし
パスワード
   ▼β さん:

> どうしても 1 なら 1行おき(つまり 2行ブロック)、2 なら 2行おきということであれば
>
> If n = 0 Then Exit Sub
>
> この下に
>
> n = n + 1
>
> をいれてください。


こ、こんな大変なコードになるだなんて・・・!
ご提案頂いたコードに、上記の「n = n + 1」を入れることで、
私のやりたいことが完璧にできました。
本当に本当に感謝申し上げます。
私の浅い知識では、Web上の情報と書籍の情報を組み合わせても
早々たどり着けるものではないと思いました。

貴重なお時間を割いて頂き、今一度感謝申し上げます。
ありがとうございました。

836 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free