Excel VBA質問箱 IV

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

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


6929 / 13644 ツリー ←次へ | 前へ→

【42267】特定文字間の列の非表示について 氷室 06/9/5(火) 11:14 質問[未読]
【42268】Re:特定文字間の列の非表示について ハチ 06/9/5(火) 11:29 発言[未読]
【42269】Re:特定文字間の列の非表示について 氷室 06/9/5(火) 11:40 発言[未読]
【42272】Re:特定文字間の列の非表示について ハチ 06/9/5(火) 12:12 回答[未読]
【42274】Re:特定文字間の列の非表示について Jaka 06/9/5(火) 13:11 発言[未読]
【42275】↑ 追伸 Jaka 06/9/5(火) 13:14 発言[未読]
【42276】Re:特定文字間の列の非表示について Kein 06/9/5(火) 13:33 回答[未読]
【42279】Re:特定文字間の列の非表示について 氷室 06/9/5(火) 13:59 質問[未読]
【42280】Re:特定文字間の列の非表示について ハチ 06/9/5(火) 14:06 発言[未読]
【42281】Re:特定文字間の列の非表示について 氷室 06/9/5(火) 14:12 発言[未読]
【42282】Re:特定文字間の列の非表示について 氷室 06/9/5(火) 14:13 発言[未読]
【42283】Re:特定文字間の列の非表示について ハチ 06/9/5(火) 14:36 発言[未読]
【42284】Re:特定文字間の列の非表示について 氷室 06/9/5(火) 14:48 お礼[未読]

【42267】特定文字間の列の非表示について
質問  氷室  - 06/9/5(火) 11:14 -

引用なし
パスワード
   お世話になっております、氷室と申します。

VBでの開発経験有ですが、Excel のVBAは初心者です。
VBAを学習し始めて2週間くらいになります。
タイトルの内容で詰まってしまったのでどなたかご教授ください。

Excelのシート(Sheet1、Sheet2)の2枚を持っています。
機能概要はSheet1の内容をSheet2に若干整理して転記します。内容は線表です。

転記の作業は上手く動いてくれているのですが、
Sheet1の、1行目のG列からBG列までに、特定の文字(☆)を二つ書き、
Sheet1からSheet2へ転記する際に、
☆から☆の範囲のみを非表示にする機能を追加しようとしてつまずいています。


<Sheet1>
  A   B   C   D   E   F     G   H    I   J   K
1                        | ☆|    |☆ |  |    |
------------------------------------------------------------------------
2                        |8/1|8/2|8/3|8/4|8/5|
------------------------------------------------------------------------
3 項1|項2|項3|項4|項5|項6|      


<Sheet2>
   A    B     J    K    L 
1            |   |   |   |
----------------------------------------------------
2            |8/4|8/5|8/6|
----------------------------------------------------
3 項目1|項目2|

上の図の様な作りになる事が目標です。

☆が複数あった場合には初めに見つけた2個までで処理を行います。
G1に☆は必ずつきます、固定です。(A〜Fまでは項目で使用)
※Sheet1には非表示の機能をつけませんが、☆を書くのはSheet1です。

色々考えてみたのですが
Sheet1のG1を(1,7)と書いて、BG列(55列目)までループで処理しようとしました。
☆から☆まではカウントしています。
☆が2つか最後の列(55行目)まで行くとループを抜ける作りです。
実行すると、エラーは起きずどこも非表示にならないまま表示されてしまいます。
問題はいろいろあると思うのですが、Sheet1とSheet2では項目数が変わり、
非表示にする部分がずれてしまうのではないかという点でも煮詰まってしまいました。
(まず非表示から出来てないので、ずれる心配以前の問題ですが。)

追加したソースは下記です。転記する部分のソースを省いています。
------------------------------------------------------
  'シート1(PJ)をアクティブにする
  Sheet1.Activate

  Dim Star As Integer          '☆のカウント
  Dim S As Integer           ’列番号
  Dim Zahyou As String         ’座標

  Star = 0                '☆のカウントリセット
  R = "7"                 '☆検索開始列の指定
  
  While Star = 2 Or R = 55        '55列目までループを行う。
    Zahyou = "1," & R          'セル値を指定(行,列)
      If Cells(Zahyou).Value = "☆" Then
        Star = Star + 1       '☆のカウント。
        Sheet2.Activate       'シート2へ非表示をしにいく。
        Selection.EntireColumn.Hidden = True  '対象列非表示
        Sheet1.Activate       'シート1へ戻って処理を続ける。
      End If
    R = R + 1              '隣のセルへ。
  Wend
------------------------------------------------------
これだけで上手く伝わるか分かりませんが、
対象範囲を別シートから検索し、非表示にさせる方法について
教えていただければと思います。

長々と失礼しました、よろしくお願いいたします。

【42268】Re:特定文字間の列の非表示について
発言  ハチ  - 06/9/5(火) 11:29 -

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

>転記の作業は上手く動いてくれているのですが、
>Sheet1の、1行目のG列からBG列までに、特定の文字(☆)を二つ書き、
>Sheet1からSheet2へ転記する際に、
>☆から☆の範囲のみを非表示にする機能を追加しようとしてつまずいています。

ここは非表示で、データ自体は転記したい ということですか?

>☆が複数あった場合には初めに見つけた2個までで処理を行います。
>G1に☆は必ずつきます、固定です。(A〜Fまでは項目で使用)
>※Sheet1には非表示の機能をつけませんが、☆を書くのはSheet1です。

Sheet1の「G〜最初に☆のついている列」までを
Sheet2側で非表示にしたい ということですか?
G列以降BG列までに☆がついてない場合はどうなるのでしょう?

【42269】Re:特定文字間の列の非表示について
発言  氷室  - 06/9/5(火) 11:40 -

引用なし
パスワード
   ◆ハチさん へ

初めまして、早速のお返事ありがとうございます。

データ自体の転記はしたいです。ので非表示だけ。
先に出来上がってるソースの部分に手を加えずにやりたいです。

>Sheet1の「G〜最初に☆のついている列」までを
>Sheet2側で非表示にしたい ということですか?
はい。その通りです。

>G列以降BG列までに☆がついてない場合はどうなるのでしょう?
Sheet1でG列以降、BG列までに☆が無かった場合は、
処理を取り消し、全て表示する様にしたいです。

(☆が無かった場合を考えていなかったので
 その処理が上のソースには書いてありませんでした。)

【42272】Re:特定文字間の列の非表示について
回答  ハチ  - 06/9/5(火) 12:12 -

引用なし
パスワード
   ▼氷室 さん:
>問題はいろいろあると思うのですが、Sheet1とSheet2では項目数が変わり、
>非表示にする部分がずれてしまうのではないかという点でも煮詰まってしまいました。

これは開始のG列がズレるかも? ということですか?

Find と FindNext を使えばできると思います。
詳細はヘルプで調べてみてください。

Option Explicit

Sub Test()

Dim Fi As Variant
Dim St As Integer, En As Integer
  '範囲指定ならRows(1)→Range("G1:BG1")に変更
  Set Fi = Worksheets("Sheet1").Rows(1).Find _
  ("☆", , xlValues, xlWhole, , xlNext, False, False)
  If Not Fi Is Nothing Then
    St = Fi.Column
  Else
    Exit Sub
  End If
  
  Set Fi = Worksheets("Sheet1").Rows(1).FindNext(Fi)
  If St <> Fi.Column Then
    En = Fi.Column
  Else
    Exit Sub
  End If
  
  With Worksheets("Sheet2")
    .Range(.Columns(St), .Columns(En)).Hidden = True
  End With
  
  Set Fi = Nothing
  
End Sub

【42274】Re:特定文字間の列の非表示について
発言  Jaka  - 06/9/5(火) 13:11 -

引用なし
パスワード
   ☆位置の状態をよく把握してないけど。
シート名は直してください。

Sub Macro1()
  With Sheets("Sheet3")
    Set Rg = .Cells.Find(What:="☆", After:=.Range("G1"), LookIn:=xlFormulas, LookAt:= _
      xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
      , MatchByte:=False, SearchFormat:=False)
  End With
  Sheets("Sheet2").Columns(7).Resize(, Rg.Column - 7 + 1).Hidden = True
End Sub

【42275】↑ 追伸
発言  Jaka  - 06/9/5(火) 13:14 -

引用なし
パスワード
   エラー判定(処理)はしてないので、適当に追加してください。

【42276】Re:特定文字間の列の非表示について
回答  Kein  - 06/9/5(火) 13:33 -

引用なし
パスワード
   これでどうでしょーか ?

Sub Hide_Col()
  Dim FR As Range
  Dim MyC As Integer
 
  Set FR = Sheets("Sheet1").Range("H1:BG1") _
  .Find("☆", , xlValues, xlWhole)
  If Not FR Is Nothing Then
   MyC = FR.Column
   With Sheets("Sheet2")
     .Columns.Hidden = False
     .Range(.Columns(7), .Columns(MyC)).Hidden = True
   End With
   Set FR = Nothing
  End If
End Sub 

【42279】Re:特定文字間の列の非表示について
質問  氷室  - 06/9/5(火) 13:59 -

引用なし
パスワード
   ハチさん、Jakaさん、Keinさん 回答ありがとうございます。
一つずつ動かしながらやっていたので返事が遅れて申し訳ありません。

どれも実行した所、問題なく動作したのですが
最初の図が少しおかしかった様で
どうも思う所に範囲が指定できませんでした。
訂正し、図は再度書かせていただきました。


<Sheet1>
  A   B   C   D   E   F     G   H    I   J   K
1                        | ☆|    |☆ |  |    |
-----------------------------------------------------------
2                        |8/1|8/2|8/3|8/4|8/5|
-----------------------------------------------------------
3 項1|項2|項3|項4|項5|項6|      


<Sheet2>

【1】転記のみ(☆がSheet1のG1(固定)しかなかった場合もこちら。)
  A   B   C   D   E    F   G   H    I   J   K
1        | ☆|    |☆ |  |    |   |    |    |
------------------------------------------------------------
2        |8/1|8/2|8/3|8/4|8/5| 8/6 |
------------------------------------------------------------
3 項1|項2|  

     ↓

【2】転記 + ☆から☆までを非表示
   A    B       F   G    H
1            |   |   |   |
----------------------------------------------------
2            |8/4|8/5|8/6|
----------------------------------------------------
3 項目1|項目2|

範囲指定(☆が二つある)がOKであれば、【2】にする事が目標です。

Sheet1にあった項3〜6(C〜F列)がSheet2では無くなってしまう
(詰まってしまう)ので、非表示の処理をする時のずれが解決できません。


せっかく回答いただいたのですが、説明不足の為にすいません。
もう少し教えてください、よろしくお願いいたします。

【42280】Re:特定文字間の列の非表示について
発言  ハチ  - 06/9/5(火) 14:06 -

引用なし
パスワード
   ▼氷室 さん:
>Sheet1にあった項3〜6(C〜F列)がSheet2では無くなってしまう
>(詰まってしまう)ので、非表示の処理をする時のずれが解決できません。

??
Sheet2にも☆は、転記されているということですか?
自分のマクロなら"Sheet1"となっているところを
"Sheet2"に変更すれば動くと思います。
Withの位置を替えればもう少し省略して書けますけど。

【42281】Re:特定文字間の列の非表示について
発言  氷室  - 06/9/5(火) 14:12 -

引用なし
パスワード
   >Sheet2にも☆は、転記されているということですか?
すいません、Sheet2には☆は転記されません。


それと、関係ないかと思って書き漏らした点が。

上の図で日付になっている所ですが、

------------------------
  |   8月     |
------------------------
項1 |1|2|3|4|5|

という様に連結したセルが一部含まれています。
もしかしてこれも考慮しなければならないのでしょうか・・・?

【42282】Re:特定文字間の列の非表示について
発言  氷室  - 06/9/5(火) 14:13 -

引用なし
パスワード
   ※項1 は日付の下の行にきます。

バタバタして申し訳ありません。

【42283】Re:特定文字間の列の非表示について
発言  ハチ  - 06/9/5(火) 14:36 -

引用なし
パスワード
   ▼氷室 さん:
>※項1 は日付の下の行にきます。
>
>バタバタして申し訳ありません。

結合は、関係ないような気がしますが。
Sheet1とSheet2の違いが
「C〜F列を削除している」だけなら
.Range(.Columns(St), .Columns(En)).Offset(, -4).Hidden = True

Offset(,-4)することでどの方のマクロでもいけると思いますよ。

【42284】Re:特定文字間の列の非表示について
お礼  氷室  - 06/9/5(火) 14:48 -

引用なし
パスワード
   ▼ハチ さん
>.Range(.Columns(St), .Columns(En)).Offset(, -4).Hidden = True

で思うとおりの動きが出来る様になりました。
Sheet1とSheet2のズレもきちんと処理できていて、
どの方のソースでも編集して動きました。

今回は本当にありがとうございました。
説明不足な点もありましたが、無事解決しました。
また、色んなソースの書き方を参考にさせていただきました。

こちらで教えられる事があれば私も手を貸せる様頑張ります。
ありがとうございました。

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