• ベストアンサー

VBA スクロールのコードの中に変数を入れることは

Dim i as integer  i=A1 Sheets(2).ScrollArea = "Ai: Ni+100" 仮にこのようなコードを書いたとして、 実行したのですが、""の中は変数が効かないようなのですが、 これを行う方法はあるのでしょうか。 VBA初心者なのですが、 どなたかお答えいただけますでしょうか。 よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.7

こんばんは。Wendy02です。 ちょうど、今日は、たまたま、いろんなことを考えていた矢先でした。 私が、特別な入力を覚えたとき、結構、重い病気で、入院して時間が空いてしまって、できるかできないかわからないけれど、まあ、やってみるとか、覚えたこととか、仕事が、閑職になってしまった時とかも、そうでした。 そういえば、人生の節目で、技術的なことは、習得しているなぁ、なんて思いました。 入院中は、あまりいろんなことを考えずに、お体が許せる限り、一心に、何か別なことをおやりになってみるのもよいかと思います。ある意味では、絶好のチャンスかもしれません。それと、ちょうど、本日、別の場所で書きましたが、私のパソコンの覚え方は、イメージ優先なんです。実際に、PCに向かわなくても、イメージさえもてれば、いろんなことが覚えられます。 最後に、遠藤周作さんが、昔、病気の人は、病気の人の人生がある、と言っていました。決して、健康体の人に対するハンディではない、というようなことを本で書いていました。 気長に、養生をなさってください。またよろしくお願いします。

teruku106
質問者

お礼

Wendy02 様 お久しぶりです。 とても良いお言葉を頂いていたのにもかかわらず、 返信が出来ておらず、大変失礼致しました。 会社で作成中のマクロを用いたエクセルのデータは 中止してしまいました。 まだ会社へは復帰しておらず、入退院の繰り返す日々です。 (来年2月には仕事復帰できるかもしれません) 視野が欠損していたためパソコンを見るのも大変だったの ですが、今は大分回復しました。 病気に対しては、ひとつの経験としてプラスに考える ように心がけております。 人には運命があるし、こういった逆境も私なら耐えられる からこそ与えられた運命なのだと思います。(宗教チック?) しかし、イメージでのPCを覚えるというのはすごいですね! 確かに何をやるにもイメージはとても大事なことだと思います。 私もイメージでPCを覚えることのできる領域になれるといいです。 こんな私にお気遣いの言葉をいただきまして、 ありがとうございました。 また機会があった際にはよろしくお願い致します。

その他の回答 (6)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.6

こんにちは。Wendy02です。 お礼を付けてありがとうございます。 >Set rng = Range("A1", Range("A60000").End(xlUp)) > というところを >Set rng = Range("N1", Range("N60000").End(xlUp)) > と変えたところ動きました。 データの量をN列で取るのですね。 なお、 >'65536行目まで取ると、エラーになる場合があります。 > Set rng = Range("A1", Range("A60000").End(xlUp)) というのは、配列をワークシート関数に入れるとき、列の行数をフルに入れるとエラーになることがあると理由からです。 それと、前回の #理由を教わっても無駄だと思います。それを自分で気がつくことが大事です。 今、読むと、なんと、私は偉そうなことを書いてしまったなって思います。大変にすみません。 今は、過渡期で、その問題集なんかも、役に立たなくなるときは、そんなに遠くなさそうです。作者さんも、それについては顧みていないようですし、内容的に少し古いのです。 結局、先のことをみて、進んでいくしかありませんからね。私は、いつまでついて行けるか分かりません。私は、Windows になって、もうダメだと、一度は、もう諦めた人です。 VBA関連の書籍は、お持ちですか?一部のExcel VBAの上級の本は、もうそろそろ絶版になっていく可能性が強いです。ここ数年で、VB6を含めて、名著と呼ばれる本が、ずいぶん、絶版になっています。その割りに、新しいものが出ていません。 新製品側のVBAは、もう、そんなに長い間続くとは思えませんが、Excel 97 を始め、多くの 旧Office 製品が、これからかなり長い間使われていくと思います。不況が長いせいで、こうした新バージョンのソフトウェアの導入をためらう企業が多いようです。また、新製品の必要性もそれほど感じられません。私個人、Office 2007のコンセプトを受け入れて使いこなすには、ややこしすぎます。誰でも、というわけにはいかないと思います。

teruku106
質問者

お礼

だいぶ時間があきました。 VBAの書籍は初歩的なものをひとつ持ってます。 しかし、今重い病気にかかり、入院療養中でいったん休憩しております。結構重いのでしんどいです・・・。 院内から書き込み中です。 いろいろお教えいただきましたが、またお会いできたらそのときよろしくお願い致します。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

こんにちは。Wend02です。 元の質問から離れてしまうかもしれませんが、一応、ここが開いていて、レスが付く限りは、コメントさせていただきます。(クレームが付くかもしれませんが) >マクロは色々な書き方があるようで、作者によってかなりちがうようですね。 同じようなコーディング・ルールを持った人は、コードは、全体的に同じ雰囲気を持っています。一概には言えませんが、プログラミングって、相手への思いやりも反映すると思います。 >一番動作が速く、シンプルで、わかりやすいものが素人の私には好ましく思います。しかし、バージョンによって書き方が変わるのも一苦労ですね・・・ 私もその通りだと思います。あまり、神経質にコードを書いても、読みにくくします。適材適所ですが、上達にしたがって、細かい部分で気を抜けないところが出てきます。 もし、バージョン違いで問題が発生したら、掲示板(できれば専門掲示板)で質問すれば、必ず回答してくれる人がいます。その違いの資料とか、なかなか見つけにくいし、自分で何もかも把握するのは困難ですからね。正しくコーディングすれば、根本的な問題は起こらないと思います。しかし、過去は過去のものとして、下位バージョンの問題は、いずれ淘汰される、と考えて、前に進んでいくしかないと思います。 なお、以下の問題が解ければ、一応、私の話は、見えるようになると思います。最初、どれひとつとして、さっぱり手が付きません。 この問題集は、いくつかのVBAのルールを私に教えてくれました。 http://hp.vector.co.jp/authors/VA016119/excel/test2.html Excel VBA テスト2(ベータ版) 作者:芳坂 和行氏 「正しい/誤り」の理由が言えなければ、ダメです。 この解答は、ほとんど、「誤り」です。 理由を教わっても無駄だと思います。それを自分で気がつくことが大事です。これは、Yes/No では割り切れないものが入っています。だから、その解答の理由が書いていないのだと思います。 よろしかったら。

teruku106
質問者

お礼

多くのご回答ありがとうございました。 問題集も見てみましたが、やはりさっぱりわかりません。 が、一つ一つ見て行きたいと思います。 2000以下のバージョンもためしてみました。 動かなかったので一部変更したらできました。 Set rng = Range("A1", Range("A60000").End(xlUp))  というところを Set rng = Range("N1", Range("N60000").End(xlUp))  と変えたところ動きました。 色々とお教えいただきましてありがとうございました。 また、機会がありました時お答えいただけると幸いです。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんばんは。Wendy02です。 補足というか、混乱させる目的ではありませんが、ここの掲示板で、かなりVBAのできる方がいらっしゃいますが、その方が、別の書き方をしています。実は、私は、この問題は、一応、自分の中では結論はついているのですが、ただ、多少、それをつつかれると痛いなっていう感じなので、先に書いておきます。 '--------------------------------------------------------- '前回書いた私のコード: ActiveSheet.ScrollArea = "A" & c.Row & ":N" & c.Row + 100 '--------------------------------------------------------- 'その方が書くだろうコード: ActiveSheet.ScrollArea = "A" & CStr(c.Row) & ":N" & CStr(c.Row + 100) 'CStr は、文字列に変換する関数 '--------------------------------------------------------- 文字は文字、数値は数値で、コードの中で自動的に型の変換(キャスト)を認めないという考え方です。理屈からすると、後者のほうが正しいのです。このモードは、VBAにはありませんが、Strict On という設定で、次期VBA(VSTA-Excel2007にはありません)では、いずれ選択肢としてあるかもしれません。 もし、本当に、データ型をきちんと把握していれば、予想外のエラーなどは少なくなるのですが、なかなか、それは、面倒な作業になるかもしれません。

teruku106
質問者

お礼

ご回答ありがとうございます。 また、お礼も遅くなり申し訳ありません。 少々忙しく、大変失礼しております。 マクロは色々な書き方があるようで、作者によってかなりちがうようですね。 一番動作が速く、シンプルで、わかりやすいものが素人の私には好ましく思います。しかし、バージョンによって書き方が変わるのも一苦労ですね・・・ さて、お教え頂きました通り、さっそく動作の確認をしたところ異常なくうごきました。 データ型は気になるところです。 単純に+100とやっても、動かない時、そこへ(+100)と括弧をつけると動いたりするように、 おくの深さを感じます。 (ちょっと意味が違うかも・・・)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんばんは。Wendy02です。 >アンダーバーで行が終わるのは何ででしょうか。 Set c = ActiveSheet.Range("A:A").Find( What:=dt, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext) 途中で、改行をさせても、ひとつのまとまりの行を続けさせるためです。 これは、コードを見易くさせるために、このような方法を取っています。ただし、誰も見せる必要がなければ、このようなことは必要ありません。名前付き引数(例;What:=)さえ必要ありません。 ただし、Findメソッドは、マクロの教本などでは、あまり長く書かれていないことが多いのですが、また、Findメソッドは、実務では、引数を省略すると、ワークシートの操作で入力したものが、そのまま、デフォルトとして操作をしてしまうので、なるべく、きちんと、書いたほうがよいです。 なお、私は、この分かち書きした定型文を、VBEditorにショートカットで登録して、すぐに出せるようにしてあります。 >setはセットするということでしょうか。 これは、VBA/VB6 のオブジェクト変数に、オブジェクトの戻り値を代入するための基本的な操作です。 Set は、英語の「配置させる」とか「位置させる」という意味ではなく、あくまでも、独特なVBA/VBの用法のひとつです。なお、VB.Net では、この方法はなくなります。 例えば、A1 に、「12」 と入れて、 Set rng = Range("A1") Msgbox rng v = Range("A1") Msgbox v どちらも、結果は同じです。 ところが、 Set rng = Range("A1") Msgbox rng.NumberFormatLocal 設定された書式が出てくるはずです。つまり、rng は、値だけではなく、書式やさまざまな値(プロパティ)が含まれています。 v = Range("A1") Msgbox v これは、VBAが、暗黙的に、値を返すように作られています。 ただし、これは、Office の VBAとして使う時のみ可能だ、と解釈したほうがよいようです。 >Dimがすごく使われているため、理解にくるしみます。 私は、入門レベルでは、通常は、Dim の型の宣言がなくてもよいと思っています。 Dim は、そのコーディングの理解度に依存しています。数値が入るのに、なぜ、Variant 型だとか、それは、なかなか理解しにくいところだと思います。私自身、良く見えていないことがありましたね。自分で作ってみると、失敗するのですが、なぜ失敗(エラー)しているのか、しばらく気が付かないことがありました。 掲示板で公開する場合、相手の人は、Option Explicit で、型の宣言の強制をしていると想定したほうがよいので、Dim等の型の宣言がないというわけにはいかないのです。

teruku106
質問者

補足

ご回答ありがとうございます。 お礼が遅くなりました。 アンダーバーにそのような意味があったんですね。 何もしらなくて、申し訳ありません。 メッセージボックスに値等を返すコードが2行程で出来ることなのかと、少し頭がすっきりした感じがします。 今後もちょこちょこ、改変していきたいと思います。 下位バージョンについては、まだしっかりと目を通せていないため、 再度お聞きしたい点がありました際には、お願いできれば幸いです。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんにちは。Wendy02です。 回答に対する補足 で、コードの意味が少し分からない部分がありますが、もしかしたら、このようなことかもしれないと思い、作ってみました。 日付を探してスクロール範囲を決める方法のコードです。 以下をご覧になって分かるかと思いますが、XL2002以上とXL2000とのコードの違いがあります。これは、下位バージョンは、バグが存在すると思ってよいと考えてもよいかと思います。下位バージョンのコードは、XL2003まで稼動しますが、上位バージョンのコードは、XL2000では、うまく行かないことがあると思います。 どちらかというと、下位バージョンの書き方は、現在では、書法ルール違反という感じです。 どちらも、表示テキストに対して検索します。 ただし、これは、私の解釈している書き方ですから、必ずしも、一般的だとは言えません。 なお、検索列は、下位バージョン用は、1列のみで、2列は検索できません。 '-------------------------------------------------------------- Sub SettingArea()  'XL2002 以上(XL2000以下は、うまくいかない可能性が強い)  Dim dt As Variant  Dim c As Range    dt = Application.InputBox("選択したい日付を入力して下さい。" & _     vbCrLf & vbCrLf & " 例) 1/ 23→ 23", "日付指定", Type:=2)      If dt = "" Or VarType(dt) = vbBoolean Then Exit Sub    Set c = ActiveSheet.Range("A:A").Find( _      What:=dt, _      LookIn:=xlValues, _      LookAt:=xlWhole, _      SearchOrder:=xlByColumns, _      SearchDirection:=xlNext)    If Not c Is Nothing Then    c.Select    ActiveSheet.ScrollArea = "A" & c.Row & ":N" & c.Row + 100    ActiveWindow.ScrollRow = c.Row  Else   MsgBox "指示された日にちは存在しません。", vbCritical  End If End Sub '------------------------------------------------------------- Sub SettingArea_2K()  'XL97以上-XL2000以下  Dim rng As Range  Dim Dates As Variant  Dim dt As Variant  Dim c As Variant  Dim k As Long  Dim i As Variant    dt = Application.InputBox("選択したい日付を入力して下さい。" & _   vbCrLf & vbCrLf & " 例) 1/ 23→ 23", "日付指定", Type:=2)    If dt = "" Or VarType(dt) = vbBoolean Then Exit Sub  '65536行目まで取ると、エラーになる場合があります。  Set rng = Range("A1", Range("A60000").End(xlUp))  ReDim Dates(0 To rng.Count -1)  For Each c In rng   Dates(k) = c.Text '一次元配列の作成   k = k + 1  Next   'XL97の書法    '日付のみの検索ですから、同じ日付があれば、最初のものがヒットします。   i = Application.Match(dt, Dates, 0)     If Not IsError(i) Then   rng.Cells(i).Select   ActiveSheet.ScrollArea = "A" & rng.Cells(i).Row & ":N" & _                rng.Cells(i).Row + 100                  ActiveWindow.ScrollRow = rng.Cells(i).Row  Else   MsgBox "指示された日にちは存在しません。", vbCritical  End If  Set rng = Nothing End Sub  

teruku106
質問者

補足

こんばんは、今回もきれいにして頂いてありがとうございます。 ちゃんとそのセルへスクロールするようにもしていただいて、 それを直しているところでした。 下位バージョンはとてもごちゃごちゃしてしまうんですね。 Dimがすごく使われているため、理解にくるしみます。 下位はとりあえず置いておいて、上位バージョンの中でわからないものがあったため、 よろしければ解説をしていただけないでしょうか。 アンダーバーで行が終わるのは何ででしょうか。 setはセットするということでしょうか。  Set c = ActiveSheet.Range("A:A").Find( _      What:=dt, _      LookIn:=xlValues, _      LookAt:=xlWhole, _      SearchOrder:=xlByColumns, _      SearchDirection:=xlNext)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

こんばんは。 Sheets(2) という意味は、Sheets の2番目という意味です。誤動作することがありますから、用いないほうがよいと思います。もちろん、重箱の隅をつつく人がいれば、私のもダメ出しするのでしょうけれど、その対処法、別途トラブルが起こったら、お答えします。 Sub ScrollAreaSetting() Dim i As Integer With Worksheets("Sheet2")  i = .Range("A1").Value  If i > 0 Then  .ScrollArea = "A" & i & ": N" & i + 100  End If End With End Sub

teruku106
質問者

補足

またまたご回答ありがとうございます。 お蔭様で出来ました。 Sheets(2)の誤作動の件、ありがとうございます。 今回のものは、前回教え頂いたものにミックスしようと考えているものでした。ミックスした結果、 Sub sample() Dim h As Integer Dim i As Variant h = Application.ExecuteExcel4Macro("GET.DOCUMENT(50)") i = Application.InputBox("選択したい日付を入力して下さい。" & vbCrLf & vbCrLf & " 例) 1/ 23→ 23", "日付指定", Type:=2) If i = "" Or VarType(i) = vbBoolean Then Exit Sub If i <= h Then ScrollArea = "A" & i & ":N" & i + 100 Else MsgBox "指示された日にちは存在しません。", vbCritical End If End Sub このようになりました。すべてWendy02さんに作ってもらったみたいですが、ありがとうございました。