ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Excel(エクセル)活用コミュのImage名の変数化

  • mixiチェック
  • このエントリーをはてなブックマークに追加
どなたかご助言をいただければと思います。

(i)ワークシートのシート2にActive Xコントロールのイメージを5個配置しました。
セルA1に入力した数字をx(1〜4)とすると, ユーザーフォーム上のコマンドボタンを押すことによって同一シート内のImage"x"の画像がImage5に表示されるように以下のコードを入力しました。

Private Sub CommandButton1_Click()

i = Worksheets("Sheet2").Cells(1, 1).Value
If i = 1 Then Worksheets("Sheet2").Image5.Picture = Worksheets("Sheet2").Image1.Picture
If i = 2 Then Worksheets("Sheet2").Image5.Picture = Worksheets("Sheet2").Image2.Picture
If i = 3 Then Worksheets("Sheet2").Image5.Picture = Worksheets("Sheet2").Image3.Picture
If i = 4 Then Worksheets("Sheet2").Image5.Picture = Worksheets("Sheet2").Image4.Picture

End Sub
(ii)上記のコードはうまく機能したのですが、その後、xの値を1〜100にすることとしました。当然、上記のコードのようにi=1からi=100まで列挙するとコードの量が膨大になりますので、以下のように変更しましたが、エラーとなっております。

Private Sub CommandButton1_Click()
For i = 1 To 100
i = Worksheets("Sheet2").Cells(1, 1).Value
Worksheets("Sheet2")..Image5.Picture = Worksheets("Sheet2")..Image("Image" & i).Picture
Next
End Sub

ネットや本を調べましたが、どう修正したらよいかどうしてもわかりません。修正方法を教えて下さい。

よろしくお願いします。

コメント(24)

初歩的な質問で申し訳ないのですが、
上記コードは、コピーペーストしたものですか?
それとも、トピックを作成する際に改めて入力したものですか?

朝は時間が無かったので質問だけ投げましたが、
時間ができたので…

エラーになるほうのコードの、
worksheetsから始まる行のカッコの後ろのドット「.」、2つあります。

もしコピーペーストでないなら、単なる入力ミスかな、と思ったので、上の質問を投稿しました。
朝は(今も)ケータイ(ガラケー)なので、まず目についたので…


もし、コピーペーストでないなら、申し訳ないですm(__)m
>エラーとなっております。
どのようなエラーなのでしょうか?

>Private Sub CommandButton1_Click()
>For i = 1 To 100
>i = Worksheets("Sheet2").Cells(1, 1).Value
>Worksheets("Sheet2")..Image5.Picture = Worksheets("Sheet2")..Image("Image" & i).Picture
>Next
>End Sub
エラー云々もありますが、このコードではご希望の動作はしないと思います
A1セルに値(例えば、1)が入力されていれば、Image5には常に同じImage(例えば、「Image1」)が表示されると思います
入力されていなければ、「Image」が表示される(「Image」というImageがなければエラーになるかもですが)

そして、Image5が表示するためのImageなのでしょうか?
Image1〜100まであるのであれば、表示するためのImageはそれら以外ではないのでしょうか?
というより、Image1〜100までをループして表示する意味はあるのでしょうか?

(ii)は(i)の拡張版ではありませんよね?
(i)はボタンが押されるとセルの値(1〜4)に応じたImageがImage5に表示される
(ii)はボタンが押されるとImage1〜100が順番にImage5に表示される

(i)を拡張してボタンが押されるとセルの値(1〜100)に応じたImageがImage5に表示されるようにする
というのがご希望のものではないのでしょうか?
であれば、(ii)のコードはエラーが解消されてもご希望の動作はしないかと思いますよ
>さくらぼうずさん
ご指摘の通り、コピーアンドペーストしたもので、かつ、元のコードにミスがあったものでした。失礼しました。ただ、修正してもエラーがでます。エラーは「実行時エラー’438’オブジェクトはこのプロパティまたはメソッドをサポートしていません」です。
>マリ男さん
ご指摘の通り、(i)を拡張してボタンが押されるとセルの値(1〜100)に応じたImageがImage5(→101に修正致します)に表示されるようにする というのが希望のものです。

また考えまして、以下のならば動くかと試しましたが、やはり実行時エラー’438’がでます。

Private Sub CommandButton1_Click()

i = Worksheets (2).Cells (1, 1) .Value
Worksheets (2) .Image101.Picture = Worksheets(2) .Image("Image" & i) .Picture

End Sub

ご意見頂ければと思います。
>>[5]
>Worksheets(2) .Image("Image" & i) .Picture
このような指定方法はなかったと思いますが、どこかに載っていたのでしょうか?
OLEオブジェクトの操作にはOLEObjectsを使えば良かったかと思いますよ
>マリ男さん
ご指摘を受け、以下のように修正しましたが、引き続き「実行時エラー’438’オブジェクトはこのプロパティまたはメソッドをサポートしていません」がでます。


Dim i As Integer

Private Sub CommandButton1_Click()

i = Worksheets(2) .Cells (1, 1) .Value

Worksheets(2).Image101 .Picture = Worksheets(2).OLEObjects("Image" & i) .OLEObjects .Picture
End Sub

ワークシート上の各imageの名前が不適当なのかと考え、Imageの数を減らし、image 5にセルの値(1〜4)に応じたImageが表示されるようにすべく、上記Image101をImage5に変え、各imageの名前がImage1〜5になっているか確認した上で再度試しましたが、やはり同様のエラーがでるようです。エラーの原因として考えられる要因はほかに何がありますでしょうか?
>>[7]
>OLEObjects("Image" & i) .OLEObjects .Picture
OLEObjectsについて調べてみましたか??
>マリ男さん
見直したところ、OLEObjects("Image" & i) .OLEObject .Picture で機能するようになりました。有難うございました。大変基本的なことでした。また勉強し直します。
>>[9]
>見直したところ、OLEObjects("Image" & i) .OLEObject .Picture で機能するようになりました
OLEObjects("Image" & i).OLEObject?
OLEObjects("Image" & i).Objectではなく?
>>[11]
OLEObjects("Image" & i).Objectです。失礼しました。
>>[12]
そうですよね
とりあえず、出来たのであれば良かったです

因みに私なら、セルの値が所定の値(1〜100のどれか)であれば、その値に対応したImageを表示
それ以外であれば、Imageなしにするというような処理もさせますね
現在のコードでは所定の値以外が入力されるとエラーになるはずですから

Private Sub CommandButton1_Click()
With Worksheets("Sheet2")
   i = .Range("A1").Value
   If i >= 1 And i <= 100 Then
    .Image101.Picture = .OLEObjects("Image" & i).Object.Picture
   Else
    .Image101.Picture = LoadPicture("")
   End If
End With
End Sub
>>[13]

有難うございます。
参考にさせて頂きます。
14までの文脈の中では次のProcedureが大した意味がないから誰も何も言わないののかもしれませんが、敢えて言います。

For i = 1 To 100
i = Worksheets("Sheet2").Cells(1, 1).Value
Worksheets("Sheet2")..Image5.Picture = Worksheets("Sheet2")..Image("Image" & i).Picture
Next

これって、わかりきっているから誰も言わないのかもしれませんが、いわゆる禁じ手の類だと思います。For...Next構文で、繰り返しを制御しているカウンタ変数。この事例の場合ならStepは1ですから、1ずつ加算していくのが通常なのですが、そこに唐突に別の値を代入するのは、For...Nextの体系を壊してしまう結果になると思います。


>>[15]
実行時点でA1セルの値が100でない限り無限ループになりますよね
16のマリ男さん、

そうですよね、無限ループに陥る可能性大ですよね!!!

でも、ごめんなさい。

"Sheet2"のセル"A1"の値が100であっても、やっぱり無限ループにはまってしまうように思いますが、どうなんでしょう??

Endの値を超えるか超えないかが、繰り返すのかその次の命令文を実行するかの判定基準である、とわたしは理解しておりますが、実際のところどうなんでしょう???

なんてことを言う暇があれば、がちゃがちゃ言わずに自分で試してみろ!!

ってことなのかもしれませんが。
>>[17]
私はセルの値が100以上の数値であれば、ループ変数の値が終了値以上になるので問題ないかと思います。
Next辺りでループ変数に増分値が加算されると思いますので、100であっても101になり
終了値を超え、ループを抜けるのではないかと思います。

まあ、やってみて無限ループに入ったら、強制中止するか
カウンタ変数で適当な値で無理やり抜けるようにすれば検証できますがね
17でのわたしの発言は適切ではありません!!!

訂正させてください。

もう一度一つ一つの手順を追い直します。


"Sheet2"のセル"A1"の値が100以上の場合

Forが最初に実行されると、カウンタ変数にStart設定値である1が一旦代入され、それが100を超えていないことで、その次のステートメントにタスキが渡る。そのステートメントによって100以上の値が代入され、Nextまで行くと、再びForにタスキが戻る。


Forはそこで100以上の値にStep値である1を加算し、End値と比較。うん、100を超えている!!

ということでNextの次のステートメントにタスキをわたす。



次は"Sheet2"のセル"A1"の値が100未満の整数の場合

Forが最初に実行されると、カウンタ変数にStart設定値である1が一旦代入されるが、そのすぐ次のステートメントによって100未満の値例えば99が代入され、Nextまで行くとForにタスキがわたる。

Forはそこで99にStep値である1を加算し、End値と比較。まだ100を超えていない!!

ということでForのすぐ次のステートメントにタスキをわたす。

Forのすぐ次のステートメントで、カウンタ変数であるiに再び100未満の整数値が代入。

そうなると、この工程は永遠に終わることはない。


で、次に思ったのは、"Sheet2"のセル"A1"の値が小数点以下の値を含んでいた場合。例えば99.4
だとか、99.5。

この場合どうなるんだろう?

きっとカウンタ変数に定義されていることによって、For...Nextの挙動は変わるのかもしれません。

小数点以下の値を含まない例えばIntegerとカウンタ変数が定義されていたら、99.4をそこに代入したら99となったしまうのかな???

99.5だったら100とみなされてしまうのかな???


再び、ガチャガチャいう暇があればとっとと自分で試してみろ、と言われちゃいそうですよね!!

そろそろおネムお時間ですからこの辺にします。
>>[21]
トピ主さんの提示されているコードを見る限りカウンタ変数iはVariant型のようですので
その通り、カウンタ変数がVariant型であれば、99より大きければ1加算されると
100を超えますので抜けるのではないでしょうか
99.000000000001 + 1 = 100.000000000001 > 100

また、カウンタ変数がInteger型であれば、値は四捨五入されるはずですので
99.5以上であれば100とされ、1加算後は100を越えるますので抜けるのではないでしょうか
22のマリ男さん、

お付き合い頂き、ありがとうございます。


> 99.000000000001 + 1 = 100.000000000001 > 100

う〜ん、これはすぐには理解できない。なぜ、99だと言いながら、なぜ極めて小さな値が加わってしまうのか?

多分、10進法と2進法の違いによる誤差なのだろうと、感覚的には推測します。

そうなってくると、整数だけを扱うことが最初っから分かっている場合なら、変数をちゃんとIntegerなりLongなりと定義しておく方が良いということのようですね!!





>>[23]
>う〜ん、これはすぐには理解できない。なぜ、99だと言いながら、なぜ極めて小さな値が加わってしまうのか?
99.000000000001 + 1 = 100.000000000001 > 100
は例です。99より大きい数値であれば無限ループを回避できるのではないか、という

ログインすると、残り3件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

Excel(エクセル)活用 更新情報

Excel(エクセル)活用のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。