質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

2回答

2015閲覧

今日の日付を取得して、表示・非表示を行いたい

退会済みユーザー

退会済みユーザー

総合スコア0

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

0クリップ

投稿2020/02/06 11:59

今日の日付を取得して、エクセルの行を表示/非表示で切り替えたいです。

V列には「20/01/02」などの日付が並んでいます。
そのV列と今日の日付が一致するセルを見つけ、その行を基準に上下15行分(計30日分)自動で表示・非表示されるようにしたいです。

下記マクロを書きましたが、「型が一致しません」となってしまいます。
申し訳ございませんが、ご教授頂けますと幸いです。

Sub display() Dim i As Long Dim buf As String buf = Date Set Wb2 = Workbooks("日付.xlsx").Worksheets("sheet1") For i = 50 To 785  '50行目から785行目に二年間分の日付があります。 If Wb2.Range("V" & i).Value = _ buf Then Rows("i - 15 : i + 15").Hidden = False End If Next i End Sub

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2020/02/06 12:25

どの行で「型が一致しません」となったのでしょう?
guest

回答2

0

ベストアンサー

Rows("i - 15 : i + 15")

これは、まずいですね。
ダブルクォーテーションで纏めてしまうと、単に
「i - 15 : i + 15」という文字列になってしまいます。

Rows(i - 15 & ":" & i + 15)

と変数や計算の部分は文字列に含めてはいけません。

数値を数字として文字を連結して、一連の文字列を作ります。
文字列を作ることに特化して、練習してみてはいかがでしょう?
むやみやたらに実践に向っても基礎が追い付いてないです。

あと、
VBAでループ処理を書かなくても、
エクセルは強力な関数群が存在しますので、
そちらを利用するとよりよいかと。

ExcelVBA

1Sub test() 2 Dim rngDate As Range 3 Dim ix As Long 4 5 Set rngDate = ThisWorkbook.Worksheets("Sheet1").Range("V50:V785") 6 rngDate.EntireRow.Hidden = True 7 On Error GoTo ErrHandler 8 ix = WorksheetFunction.Match(CDbl(Date), rngDate, 1) 9 On Error GoTo 0 10 rngDate(ix - 15).Resize(30).EntireRow.Hidden = False 11 Exit Sub 12 13Errhanler: 14End Sub

セル範囲も変数に代入できるとより良いかと思います。
そのままMatch関数の第2引数に指定できますし。
あと、ResizeプロパティやEntireRowプロパティも使えるようになりましょう。
ExcelVBAではセル範囲の指定は必須です。
語彙を増やしましょう。

投稿2020/02/06 13:06

mattuwan

総合スコア2163

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/02/07 00:15

丁寧に教えて頂き、ありがとうございます。基礎から勉強し直します。 ちなみに上記では「行ラベルが定義されていません」と「On Error GoTo ErrHandler」の部分が指摘されてしまいました。
radames1000

2020/02/07 00:35

「Errhanler:」を「ErrHandler:」にしてみてください。
退会済みユーザー

退会済みユーザー

2020/02/07 00:53

ありがとうございました。本当に助かりました。
退会済みユーザー

退会済みユーザー

2020/02/07 01:59

また、こちらって現在本日の日付から15日分上下の行をあける処理をしてくださったのだと思うのですが、 上を30行分、下を5行分とすることは可能でしょうか?
mattuwan

2020/02/07 02:57

>可能でしょうか? という聞き方はやめましょうよ。 rngDate(ix - 15).Resize(30).EntireRow.Hidden = False ↑ここの行にブレークポイントをおいて、 プログラムを仮に止めて、 イミディエイトウィンドウに ?rngDate(ix - 15).Resize(30).address[Enter] ([Enter]はエンターキー押下の意味) と入力してみてください。 セルのアドレスが返ってくるので、 あとは、数値を微調整して、 ?rngDate(ix - 30).Resize(35).address[Enter] もういっかい確認してみる。 で、意図するセルアドレスが得られそうなら、 本文を書き換えてF5キー押下でプログラム再開 などとしてみてください。 コードを解読しようと努力されてます? 解読しようとされていたら、「可能でしょうか?」というような、 聞き方にはならないかと思います。 radames1000さん> フォローありがとうございます。
guest

0

下記の部分をこう変更することができます。
Rows("i - 15 : i + 15").Hidden = False

VBA

1Rows(i - 15 & ":" & i + 15).Hidden = Not Rows(i - 15 & ":" & i + 15).Hidden 2Exit For

なお、上下15行分でしたら合計31日分になるのでご注意くださいね。

投稿2020/02/06 23:56

radames1000

総合スコア1925

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問