電子書籍の厳選無料作品が豊富!

Dim i as integer
 i=A1
Sheets(2).ScrollArea = "Ai: Ni+100"

仮にこのようなコードを書いたとして、
実行したのですが、""の中は変数が効かないようなのですが、
これを行う方法はあるのでしょうか。
VBA初心者なのですが、
どなたかお答えいただけますでしょうか。
よろしくお願い致します。

A 回答 (7件)

こんばんは。

Wendy02です。

ちょうど、今日は、たまたま、いろんなことを考えていた矢先でした。

私が、特別な入力を覚えたとき、結構、重い病気で、入院して時間が空いてしまって、できるかできないかわからないけれど、まあ、やってみるとか、覚えたこととか、仕事が、閑職になってしまった時とかも、そうでした。

そういえば、人生の節目で、技術的なことは、習得しているなぁ、なんて思いました。

入院中は、あまりいろんなことを考えずに、お体が許せる限り、一心に、何か別なことをおやりになってみるのもよいかと思います。ある意味では、絶好のチャンスかもしれません。それと、ちょうど、本日、別の場所で書きましたが、私のパソコンの覚え方は、イメージ優先なんです。実際に、PCに向かわなくても、イメージさえもてれば、いろんなことが覚えられます。

最後に、遠藤周作さんが、昔、病気の人は、病気の人の人生がある、と言っていました。決して、健康体の人に対するハンディではない、というようなことを本で書いていました。

気長に、養生をなさってください。またよろしくお願いします。
    • good
    • 0
この回答へのお礼

Wendy02 様

お久しぶりです。
とても良いお言葉を頂いていたのにもかかわらず、
返信が出来ておらず、大変失礼致しました。

会社で作成中のマクロを用いたエクセルのデータは
中止してしまいました。

まだ会社へは復帰しておらず、入退院の繰り返す日々です。
(来年2月には仕事復帰できるかもしれません)
視野が欠損していたためパソコンを見るのも大変だったの
ですが、今は大分回復しました。
病気に対しては、ひとつの経験としてプラスに考える
ように心がけております。
人には運命があるし、こういった逆境も私なら耐えられる
からこそ与えられた運命なのだと思います。(宗教チック?)

しかし、イメージでのPCを覚えるというのはすごいですね!
確かに何をやるにもイメージはとても大事なことだと思います。
私もイメージでPCを覚えることのできる領域になれるといいです。

こんな私にお気遣いの言葉をいただきまして、
ありがとうございました。
また機会があった際にはよろしくお願い致します。

お礼日時:2006/11/30 20:25

こんにちは。

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のコンセプトを受け入れて使いこなすには、ややこしすぎます。誰でも、というわけにはいかないと思います。
    • good
    • 0
この回答へのお礼

だいぶ時間があきました。
VBAの書籍は初歩的なものをひとつ持ってます。

しかし、今重い病気にかかり、入院療養中でいったん休憩しております。結構重いのでしんどいです・・・。
院内から書き込み中です。

いろいろお教えいただきましたが、またお会いできたらそのときよろしくお願い致します。

お礼日時:2006/09/06 18:03

こんにちは。

Wend02です。

元の質問から離れてしまうかもしれませんが、一応、ここが開いていて、レスが付く限りは、コメントさせていただきます。(クレームが付くかもしれませんが)

>マクロは色々な書き方があるようで、作者によってかなりちがうようですね。

同じようなコーディング・ルールを持った人は、コードは、全体的に同じ雰囲気を持っています。一概には言えませんが、プログラミングって、相手への思いやりも反映すると思います。

>一番動作が速く、シンプルで、わかりやすいものが素人の私には好ましく思います。しかし、バージョンによって書き方が変わるのも一苦労ですね・・・

私もその通りだと思います。あまり、神経質にコードを書いても、読みにくくします。適材適所ですが、上達にしたがって、細かい部分で気を抜けないところが出てきます。

もし、バージョン違いで問題が発生したら、掲示板(できれば専門掲示板)で質問すれば、必ず回答してくれる人がいます。その違いの資料とか、なかなか見つけにくいし、自分で何もかも把握するのは困難ですからね。正しくコーディングすれば、根本的な問題は起こらないと思います。しかし、過去は過去のものとして、下位バージョンの問題は、いずれ淘汰される、と考えて、前に進んでいくしかないと思います。

なお、以下の問題が解ければ、一応、私の話は、見えるようになると思います。最初、どれひとつとして、さっぱり手が付きません。

この問題集は、いくつかのVBAのルールを私に教えてくれました。

http://hp.vector.co.jp/authors/VA016119/excel/te …

Excel VBA テスト2(ベータ版)
作者:芳坂 和行氏
「正しい/誤り」の理由が言えなければ、ダメです。
この解答は、ほとんど、「誤り」です。

理由を教わっても無駄だと思います。それを自分で気がつくことが大事です。これは、Yes/No では割り切れないものが入っています。だから、その解答の理由が書いていないのだと思います。

よろしかったら。
    • good
    • 0
この回答へのお礼

多くのご回答ありがとうございました。
問題集も見てみましたが、やはりさっぱりわかりません。
が、一つ一つ見て行きたいと思います。

2000以下のバージョンもためしてみました。
動かなかったので一部変更したらできました。

Set rng = Range("A1", Range("A60000").End(xlUp))
 というところを
Set rng = Range("N1", Range("N60000").End(xlUp))
 と変えたところ動きました。

色々とお教えいただきましてありがとうございました。
また、機会がありました時お答えいただけると幸いです。

お礼日時:2006/08/21 15:19

こんばんは。

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にはありません)では、いずれ選択肢としてあるかもしれません。

もし、本当に、データ型をきちんと把握していれば、予想外のエラーなどは少なくなるのですが、なかなか、それは、面倒な作業になるかもしれません。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
また、お礼も遅くなり申し訳ありません。
少々忙しく、大変失礼しております。

マクロは色々な書き方があるようで、作者によってかなりちがうようですね。
一番動作が速く、シンプルで、わかりやすいものが素人の私には好ましく思います。しかし、バージョンによって書き方が変わるのも一苦労ですね・・・

さて、お教え頂きました通り、さっそく動作の確認をしたところ異常なくうごきました。
データ型は気になるところです。 単純に+100とやっても、動かない時、そこへ(+100)と括弧をつけると動いたりするように、
おくの深さを感じます。
(ちょっと意味が違うかも・・・)

お礼日時:2006/08/09 18:40

こんばんは。

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等の型の宣言がないというわけにはいかないのです。

この回答への補足

ご回答ありがとうございます。
お礼が遅くなりました。

アンダーバーにそのような意味があったんですね。
何もしらなくて、申し訳ありません。

メッセージボックスに値等を返すコードが2行程で出来ることなのかと、少し頭がすっきりした感じがします。

今後もちょこちょこ、改変していきたいと思います。
下位バージョンについては、まだしっかりと目を通せていないため、
再度お聞きしたい点がありました際には、お願いできれば幸いです。

補足日時:2006/08/01 12:10
    • good
    • 0

こんにちは。

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
 

この回答への補足

こんばんは、今回もきれいにして頂いてありがとうございます。
ちゃんとそのセルへスクロールするようにもしていただいて、
それを直しているところでした。
下位バージョンはとてもごちゃごちゃしてしまうんですね。
Dimがすごく使われているため、理解にくるしみます。
下位はとりあえず置いておいて、上位バージョンの中でわからないものがあったため、
よろしければ解説をしていただけないでしょうか。

アンダーバーで行が終わるのは何ででしょうか。
setはセットするということでしょうか。

 Set c = ActiveSheet.Range("A:A").Find( _
     What:=dt, _
     LookIn:=xlValues, _
     LookAt:=xlWhole, _
     SearchOrder:=xlByColumns, _
     SearchDirection:=xlNext)

補足日時:2006/07/30 21:47
    • good
    • 0

こんばんは。



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

この回答への補足

またまたご回答ありがとうございます。

お蔭様で出来ました。
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さんに作ってもらったみたいですが、ありがとうございました。

補足日時:2006/07/28 21:37
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!