トップページtech
1002コメント383KB

Excel VBA 質問スレ Part39 [転載禁止]©5ch.io

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2015/11/27(金) 20:36:45.35ID:9HV+ag/s
ExcelのVBAに関する質問スレです

                   ___
       ___      /____ヽ      ____
      /____\    | |´・ω・`| |    /___ヽ
      .l |´・ω・`|  ニX二 . ̄ ̄ ̄  二X二  |´・ω・`| l 俺たちに任せろ
      !、 ̄ ̄ ̄  ヽ   |       |    /    ̄ ̄ ̄/
       ヽ_/ヽ、  ヽ__)  \__/\_/.   /_/  ノヽ_/
             ̄                ̄ ̄

このスレはコード書き込みOKです。
作成依頼もOKですが、作成依頼限定ではありません。

コードが嫌な人・作成依頼が嫌な人は別スレ建ててください。

※前スレ
Excel VBA 質問スレ Part38 [転載禁止]2ch.net
http://peace.2ch.net/test/read.cgi/tech/1441619979/
0652デフォルトの名無しさん2016/01/28(木) 21:22:55.28ID:9fWHkl7R
basicなんだから
メモリとか考えずにどういう仕様か注釈なくても
わかるように書け
i = UBound(arr) To LBound(arr) Step -1
と徹底してたら
i = UBound(arr) To 0 Step -1
が特別だと区別がつく
0653デフォルトの名無しさん2016/01/28(木) 21:27:03.38ID:NmcV3G4I
>>648
これって何かいいことあるの?何か悪いことあるの?>>651
0654デフォルトの名無しさん2016/01/28(木) 21:28:24.36ID:Px8oTJsB
basicでなければわからんように書いてもいいのか?と問いただしたい気持ち
0655デフォルトの名無しさん2016/01/28(木) 21:41:49.39ID:Og0hCXDt
VBAならたぶん正常に動く
他の言語だとループの終了値が再評価されてループ回数がおかしくなる場合があるし、
それを逆手に取るようなコードをわざと書く場合もある
言語仕様をいちいち確認しなきゃならんようなコードは悪手かなあ
0656デフォルトの名無しさん2016/01/28(木) 21:58:29.74ID:BRaPySJX
>>653
良いことなんて特に無い
だって普通に
For i = 1 To UBound(arr)
って書いたほうが読みやすいし行数も少ない
0657デフォルトの名無しさん2016/01/28(木) 22:11:22.26ID:w3bB+ovg
何かVB6じゃUsingが使えないから
With New とかやるって旧VBスレで言ってたのを思い出した
0658デフォルトの名無しさん2016/01/28(木) 22:36:03.92ID:zD2EcWsW
>>651
> VBAは変数を宣言するともれなく初期化がついてくるから
> これを抑制する為
抑制する理由書いてみ
君のアホさがわかると思う

> 非常に限定された例で
限定されてると思ってる時点で何も理解してないことが良くわかる w
0659デフォルトの名無しさん2016/01/28(木) 23:00:29.67ID:D0vEBF/4
すいません、
2つセルのアドレスを取得したのですが、
そこまで何列離れているかが知りたいのですが、
どうやって求めれば良いでしょうか?
0660デフォルトの名無しさん2016/01/28(木) 23:25:11.76ID:BRaPySJX
>>659
その二つのセルのColumnを引き算したら分かるんでないの?
0661デフォルトの名無しさん2016/01/28(木) 23:27:32.34ID:D0vEBF/4
>>660
ありがとうございます。
0662デフォルトの名無しさん2016/01/28(木) 23:32:05.18ID:YELEWwrc
まあ LBound も UBound は十分速いから気にする必要はもともとないけどな
0663デフォルトの名無しさん2016/01/28(木) 23:33:03.80ID:YELEWwrc
誤 LBound も UBound は
正 LBound も UBound も
0664デフォルトの名無しさん2016/01/29(金) 00:42:17.43ID:/cWmSx8U
そもそもVBAでは宣言と同時に代入するような構文はないし
宣言時の初期化を抑制する構文もないから
宣言と同時に変数を初期化するのを抑制なんてできないわけだが

まあ変数の数を減らす事によってその分のメモリと初期化時間を節約できるのは確かかもしれんが
それを当たり前にやらないとダメなような環境なら、VBA使うのがそもそも間違ってる
巨大な配列ならまだしも、可読性落としてまでやるような事じゃない
0665デフォルトの名無しさん2016/01/29(金) 00:47:48.27ID:/cWmSx8U
ああ
For i = 1 to i
なんてコード書いて可読性が落ちてないとか言う主張してるのか
俺とは完全に別次元の人だわ
俺の意見も、このスレのほとんどの人の意見も忘れてくれていいんじゃない
0666デフォルトの名無しさん2016/01/29(金) 00:52:17.65ID:u6PJbYuv
そもそもループカウンタ変数なんて使うのが時代遅れ
0667デフォルトの名無しさん2016/01/29(金) 00:57:19.20ID:mcgCrfPK
えっ
それ以外に効率的にやる方法あんの?
0668デフォルトの名無しさん2016/01/29(金) 01:38:47.60ID:u6PJbYuv
for each
0669デフォルトの名無しさん2016/01/29(金) 01:52:49.80ID:DJFadGs/
他の言語ではFor Each的なループが主流になってるが
VBAではその存在を知らない人さえいるんじゃないかな
0670デフォルトの名無しさん2016/01/29(金) 02:08:08.30ID:EuNL8AIn
はてさてFor EachはVBAではご存知の通り配列では使えない。

ループの対象がRangeとかであれば有効だろうけど、配列の中をガラガラと回す機会も少なくは無いだろう。
そうしたとき、配列の代わりにCollectionやScripting Dictionaryを使ってまでFor Eachを使うことによって
何の恩恵が受けられるのだろうか?

そもそもそれを言ってしまうのであればVBA自体が時代遅れの言語な訳だから
それに合わせて使い分けなければならないんじゃないかな。
0671デフォルトの名無しさん2016/01/29(金) 02:19:34.89ID:u6PJbYuv
使えるだろ何言ってんだハゲ
0672デフォルトの名無しさん2016/01/29(金) 03:03:52.29ID:EuNL8AIn
本当だ。
受け取り側をVariantに設定すれば出来るんだな。済まん。
0673デフォルトの名無しさん2016/01/29(金) 04:05:19.53ID:vu3Qsjkg
なぜ理解していないのに文句を言ってしまうのか
0674デフォルトの名無しさん2016/01/29(金) 06:41:43.06ID:zKTo8s/w
For Eachの使いにくさはこのスレでも何度か指摘されてるだろ。
まずひとつのシーケンスしか扱えないのがつらいし、コピーベースだから効率的でもない。
結局はカウンタを使うことが多い。
0675デフォルトの名無しさん2016/01/29(金) 06:49:02.29ID:zKTo8s/w
とにかくVBAのFor Eachは全然ダメだ。
0676デフォルトの名無しさん2016/01/29(金) 08:18:18.44ID:n4JmA3/2
>>674
0677デフォルトの名無しさん2016/01/29(金) 10:09:18.99ID:eO+SXLpF
>>649
ループの変数にiではなくて何を使うの?
素朴な疑問です。
行をループさせるときはrとか使うけど、なんてない?ループのときはiって書く癖が付いてる。
0678デフォルトの名無しさん2016/01/29(金) 10:21:38.80ID:n4JmA3/2
>>649は典型的な馬鹿
0679デフォルトの名無しさん2016/01/29(金) 10:26:37.59ID:Cfolpywf
>>677
よく詠め
0680デフォルトの名無しさん2016/01/29(金) 11:26:35.90ID:zKTo8s/w
風流だな
0681デフォルトの名無しさん2016/01/29(金) 12:41:18.50ID:OZjYu77z
>>678
>>658
> > VBAは変数を宣言するともれなく初期化がついてくるから
> > これを抑制する為
> 抑制する理由書いてみ
に答えてからほざかないとかわいそうな奴にしか見えないぞ w
0682デフォルトの名無しさん2016/01/29(金) 15:51:56.92ID:zKTo8s/w
>>666
VBAではループカウンタを使うのがベター、という結論でいいのか?
0683デフォルトの名無しさん2016/01/29(金) 16:10:50.46ID:u6PJbYuv
いいわけないだろハゲ
0684デフォルトの名無しさん2016/01/29(金) 16:23:04.02ID:zKTo8s/w
>>683
使いにくさは認識しているだろババア
0685デフォルトの名無しさん2016/01/29(金) 16:33:33.32ID:u8nDFqF+
要素の順序に関係なくとにかく列挙したい → For Each
要素の順序に合わせてやりたい処理がある → ただのFor
それぞれ使いどころが違うんだから
こっちがベターとか、あっちは時代遅れとか
どちらも的外れな気がするけど
0686デフォルトの名無しさん2016/01/29(金) 18:20:31.74ID:/cWmSx8U
ああ、俺、For Eachで特定の順序で列挙される事を期待してるコード書いてるわ

今まで問題になった事ないけど、これからも問題にならないように祈ろう
0687デフォルトの名無しさん2016/01/29(金) 19:11:10.65ID:zKTo8s/w
For Each自体は良いものだ。しかし、

ひとつのシーケンスしか扱えない
→ arr1(i) + arr2(i) を簡単に書けない

同時に複数の要素にアクセスできない
→ arr(i+1) - arr(i) を簡単に書けない

コピーなので代入ができない(配列)
→ Each z... z = z * 2 とできない

コピーコストがある(配列)
→ ただループを回すだけで時間がかかることがある

というようなトレードオフがある。
最初の二つは標準のコンテナライブラリが充実してる言語だと大した問題にならないが、VBAにはそういうものがない。
For Eachの使いどころは相対的に狭いと思う。
0688デフォルトの名無しさん2016/01/29(金) 20:54:13.12ID:GirFGy8a
>>687
トレードオフという言葉の使い方が変だと思う
矢印の前後が同じ事の言い換えにすぎないので
そういうのはトレードオフとは言わない
0689デフォルトの名無しさん2016/01/29(金) 21:08:56.19ID:zKTo8s/w
>>688
おお、そうだな。
違うことを書いたり消したりしてるうち「トレードオフ」だけ変に残ってた。

「というような難点もある。」
に言い換えます。
0690デフォルトの名無しさん2016/01/29(金) 22:26:51.74ID:vu3Qsjkg
「For文とForEach文」っていう対比だけで考えている限り、効率的に使い分けるってのは出来なさそうだな
0691デフォルトの名無しさん2016/01/29(金) 22:41:31.80ID:Cfolpywf
VBAのFor Eachは順序が保障されてるってどっかで見たような
記憶違いだったかなあ
0692デフォルトの名無しさん2016/01/29(金) 22:46:41.43ID:3bay7YeG
VBAでIE操作する際にUA偽装することはかのうでしょうか?
0693デフォルトの名無しさん2016/01/29(金) 22:56:37.31ID:xL/2dOZ2
コレクションはaddした順になってるってどっかで読んだな
0694デフォルトの名無しさん2016/01/29(金) 22:59:33.85ID:SzcTnZpo
>>692
できるはずだけど
0695デフォルトの名無しさん2016/01/29(金) 23:03:44.66ID:x5GxlBbm
>>694
どのようにやるのか教えていただけませんか?
0696デフォルトの名無しさん2016/01/29(金) 23:11:05.17ID:zGtXhGWM
>>695
それはトレードオフだな
0697デフォルトの名無しさん2016/01/29(金) 23:33:04.61ID:SzcTnZpo
>>695
ieオブジェクトから探してみたら
useragentプロパティとかそれらしいの
または偽装のpostデータを送信すれば偽装できる
0698デフォルトの名無しさん2016/01/30(土) 00:18:29.02ID:WsSatOj8
>>695
Navigateメソッドに Headersパラメータあるよ ここで指定する
0699デフォルトの名無しさん2016/01/30(土) 01:09:42.28ID:QZN0GaAw
符号なし32bit値を普通に扱いたいのだが
所々にオーバーフローの罠が仕掛けられている
どうしたものか
0700デフォルトの名無しさん2016/01/30(土) 02:47:34.76ID:wZlCWGLp
>>699
64bit版ならlonglongをマスクして使う
32bit版ならあきらめてVBを使うとか文字列で処理するとか
0701デフォルトの名無しさん2016/01/30(土) 21:48:03.29ID:9q1UC1/m
(単位百万円)ってよく書いてるだろ
0702sage2016/01/30(土) 22:42:24.01ID:DtupSwoU
貼り付けをする時は、「値のみ貼り付け」のみにしたいのですが

Sub 値貼り付け()
Dim SEL As String
SEL = ActiveCell.Address
On Error Resume Next
Range(SEL).PasteSpecial Paste:=xlValues
Application.CutCopyMode = False
End Sub


これで制御できたと思ったんですが、ENTERキーを押すと
数式まで貼り付けられてしまうのでENTERキーでも「値のみの貼り付け」はできないでしょうか?
0703デフォルトの名無しさん2016/01/30(土) 23:17:21.27ID:WsSatOj8
>>702
やりたい事がわからない もうすこし詳細な説明をして下さい

そのマクロとENTERキーの関係とか
0704sage2016/01/30(土) 23:53:42.67ID:DtupSwoU
>>703
週のはじめに各従業員が行先と訪問時間などを入力する
表を作りたいのです。
毎週、お客さんのところに行く曜日や時間が変わるので
コピペして運用したいのです。

しかしあまりPCに不慣れな人もいて、コピペしてしまい
関数が乱れてしまいます。

そこで、貼り付けを制御をしたいです。
上のマクロで用意してあるフォームボタンだけなら
問題ないのですが、コピーした後にENTERキーを押してしまう
人がいて困っています。
0705デフォルトの名無しさん2016/01/31(日) 00:29:23.55ID:GHH7Ytwp
>>704
データ入力者が複数いる場合は、ワークシートに時間などを直接入れるんじゃなくて
入力フォームを使うのが定番の方法です
0706デフォルトの名無しさん2016/01/31(日) 00:43:56.18ID:MM1DiLhb
>>704
だいたいさ、なんでお前が
考えることを放棄してるような感じになってるの
どこの能力が足りないわけ
0707デフォルトの名無しさん2016/01/31(日) 00:53:42.54ID:hQeW+ttM
>>704
コピペ運用そのものを やめて見直すべきだと思うよ

どうしてもというなら
↓のようにCopy/Paste 両方ボタンにして モジュール変数を使うとか

Private BUF As Variant

Sub 値Copy()
BUF = ActiveCell.Value
End Sub

Sub 値Paste()
ActiveCell.Value = BUF
End Sub
0708デフォルトの名無しさん2016/01/31(日) 14:40:54.90ID:yZ5QuPZH
IFの入れ子は何個まで書きますか?
皆さんの経験上大体何回ぐらいが限界だとおもいますか?
0709デフォルトの名無しさん2016/01/31(日) 14:55:35.44ID:fJmO8CE1
純粋にIfだけの入れ子にするくらいなら、

Dim S As Long
If (条件A) Then S = 1
If (条件B) Then S = S + 2
If (条件C) Then S = S + 4
...
Select Case S
Case 1

Case 2

...

みたいな形にした方がいいと思う。
途中にループとか挟まるなら関数として分けろ。
0710デフォルトの名無しさん2016/01/31(日) 17:31:33.51ID:oGNCocg8
初稿では基本入れ子にならないように書いてる
でも増改築していくと結局4つぐらいになってる
0711デフォルトの名無しさん2016/01/31(日) 17:46:37.03ID:k5bfrJJo
>>708
前に書いたけど、分岐はその使い方によって以降の分岐を避けられる場合がある。
Case文の場合は作られたケースを順番に評価するのはトレースすると解るよね。

まずそこで使い分けが発生するんだけど、単純にそれで書くと読みにくくなることがある。
処理のレスポンスと可読性どちらを取るかはケースバイケースで、組んでる人のセンスの見せ処にもなる。

後は上の人がループの切り分けの話をしていたけど俺の感覚からすれば
関数やメソッドは単一責任原則に則って作っていればループや分岐は別に分かれていなくてもいいと思ってる。

つまり何が幾つまでという切り分けで作るのではなく一つの役割で一つの関数やメソッドを作っておけば、
基本スパゲティコードになることはない筈なので
後は分岐数は見やすければお好きにどうぞと言いたい。俺個人の意見としてはね。
0712デフォルトの名無しさん2016/01/31(日) 21:42:48.93ID:3A1xW7mu
>>709
>>710
>>711
ありがとうございます。
1行だけの単純命令ならいくらでも入れ子できそうですが
本日多数の関数を持ったelse付きの数行あるコードを4層構造に仕込もうとしましたが
複雑に入り組みすぎて、途中で脳が沸騰しそうになり未だに完成していません。
Caseでやるのもよさそうですね
正直もうくたくたで何もやる気も起きません。
0713デフォルトの名無しさん2016/01/31(日) 21:49:46.31ID:3A1xW7mu
VBAのコードを半日近く書き続けて煮詰まってくると頭痛がしてくるのは私だけでしょうか?
0714デフォルトの名無しさん2016/01/31(日) 22:37:46.23ID:fN9K6rqb
老化といいます
0715デフォルトの名無しさん2016/01/31(日) 22:44:30.24ID:/MiBgNRG
たいへんもうしわけごさいません
0716デフォルトの名無しさん2016/01/31(日) 22:54:07.60ID:fJmO8CE1
コードはこんがらがってきたら無理せずに一回捨てて、
それまでで得られた結果を反映した強くてニューゲームした方がいい。

ただしアルゴリズムとかマトモに学んでないと、そういう時に手段が限られて苦労する。
0717デフォルトの名無しさん2016/01/31(日) 23:37:12.06ID:OOAiq76c
プログラムの設計は難しい。
小さな問題と大きな問題の両方に悩まされる。
一筋縄ではいかない。
0718デフォルトの名無しさん2016/02/02(火) 19:46:44.38ID:n8+/YJjg
フリーズした?
0719デフォルトの名無しさん2016/02/02(火) 21:29:47.13ID:xMBhBprB
株探の決算表から、ウェブクエリでテーブルをエクセルに取り込むことは出来ました。
しかし100銘柄〜200銘柄も取り込むと膨大な時間がかかってしまいます。
取り込む時間を最小限にするために、テーブルの中の一か所だけを取り込むようにしたいです。

例:
・URL http://kabutan.jp/stock/finance?code=1301
・テーブル「今期予想」の「予 2016.03」の「経常益」のみ(3000という数字)を取り込みたい


―――参考までに「ウェブクエリでテーブルをエクセルに取り込むマクロ」―――
Sub sssample2()
Dim fff As String

fff = ThisWorkbook.Path & "http://kabutan.jp/stock/finance?code=1301";
With ActiveSheet.QueryTables.Add(Connection:= _
"URL;" & fff, Destination:=Range("B2"))

.RefreshStyle = xlOverwriteCells
.WebTables = "12"
.WebFormatting = xlWebFormattingNone
.Refresh BackgroundQuery:=False

End With
End Sub
――――――――――――――――――――――――――――――――――

よろしくお願いします。
0720デフォルトの名無しさん2016/02/03(水) 00:11:42.99ID:phHyrAir
>>719
ウェブクエリはテーブルの一部だけを取り込むことは基本的にできないし、
そもそも動作が遅すぎるので大量データの取得には向いてない
「XMLHTTPオブジェクト」おすすめ
0721デフォルトの名無しさん2016/02/03(水) 01:21:36.38ID:xSOyaD7A
ありがとうございます
ハードルは高そうですが調べてみます
0722デフォルトの名無しさん2016/02/03(水) 10:22:57.26ID:/plcvGK1
すいません
すっごい初心者な質問なのですが…
vbaでie操作して最後にieで完了ページが表示された事を確認してからieを閉じたいのですが

if instr(objIE.document.body.innerhtml."完了しました。") 〉0 then
とじる
else
やりなおし
end if

としていますが機能していないようで
こういう目的の場合どういった方法を取るものなのでしょうか
0723デフォルトの名無しさん2016/02/03(水) 12:15:31.59ID:kFs/rV/l
objIE.document.body.innerhtmlの内容は確認したの?
0724デフォルトの名無しさん2016/02/03(水) 13:23:42.06ID:zCM4JqWj
>>722
機能していないとは?
0725デフォルトの名無しさん2016/02/03(水) 21:32:48.21ID:HBzsb+pO
A列に氏名、B列に勉強科目、C列に勉強時間が入力されたデータがあり、
各人の最も勉強した科目は何でその勉強はいくらかを計算するプログラムを作りたいのですが、
何か良い案をお教えいただけないでしょうか?
またこのようにプログラムを全く思いつかない場合、どのように検索・勉強すればよいのでしょうか?
宜しければご教授下さい
07267252016/02/03(水) 21:34:02.56ID:HBzsb+pO
>>725
>勉強はいくらか
「勉強時間はいくらか」の間違いです。
申し訳ありません
0727デフォルトの名無しさん2016/02/03(水) 22:06:22.01ID:owuQJz30
>>725
検索キーは [VBA クロス集計]

クロス集計はこんな感じ
http://www4.synapse.ne.jp/yone/excel_exercise/exercise_vba_cross.html
07287252016/02/03(水) 22:22:33.44ID:HBzsb+pO
>>727
早速の返信ありがとうございます
おかげさまで解決出来ました
心より感謝申し上げます
0729デフォルトの名無しさん2016/02/05(金) 00:08:37.08ID:TXCmVTvB
質問です。
ExcelのVBAでDo While Cellsを使用して
sheet1のA6セルに入力されたデータをsheet2のS列のデータと比較し
重複データがあれば「重複データが存在します」
なければ「重複チェック終了しました」とメッセージ表記されるようにしました。
これで続けて重複データをsheet1のA10以降に表示されるようにしたいです。
この後にどのように入力したらいいでしょうか。
当初はオートフィルでやってたのですが、cells利用してもできると聞いて
調べて見たのですがよくわからなくて困っています。
数日前に始めたばかりで勝手がわかっていなかったらすみません。
0730デフォルトの名無しさん2016/02/05(金) 00:36:52.27ID:blBw672Y
>>729
とりあえず、作ったVBAをどこかに貼って
短ければここでもいいし
0731デフォルトの名無しさん2016/02/05(金) 00:50:11.46ID:U+VxVXPf
A6から急にA10に話が飛んでる理由は何なの
ウォートホッグなの
0732デフォルトの名無しさん2016/02/05(金) 04:20:30.65ID:tis1OD9T
もしA6の値が、S列に含まれていれば、
A10に、A6の値を代入する

A10 = A6の値
0733デフォルトの名無しさん2016/02/05(金) 04:25:48.17ID:LfaH5pAK
今日は書けるかな
0734デフォルトの名無しさん2016/02/05(金) 04:40:03.69ID:LfaH5pAK
Sub test()
ccc = 1
For Each eee In Sheets("Sheet2").Range("S1:S100")
If eee.Value = Sheets("Sheet1").Range("A6").Value Then
Sheets("Sheet1").Range("A10").Cells(ccc, 1) = eee.Value
ccc = ccc + 1
End If
Next
End Sub
0735デフォルトの名無しさん2016/02/05(金) 05:36:50.98ID:eBNdrWRt
たまにxlsmファイルがプロジェクトまたはライブラリが見つかりませんと出て動作を停止してしまうのはなんなんだろう
その度新しくブックを作り直さなきゃならなくなる
07367292016/02/05(金) 11:08:36.96ID:j1/kW8gU
レスありがとうございます。
>>730
Sub sheet1()
'
' sheet1 Macro
'
Dim i, ii As Integer
i = 0
ii = 0
Do While Cells(6 + i, 2) <> ""
Do While Worksheets("sheet2").Cells(2 + ii, 2) <> ""
If Cells(6 + i, 2) = Worksheets("sheet2").Cells(2 + ii, 2) Then Worksheets("Sheet2").Cells(2 + ii, 2).Value = Cells(10 + i, 2).Value
  ii = ii + 1
Loop
i = i + 1
Loop
MsgBox ("重複チェック終了しました。")
Exit Sub
End Sub

>>729の後、データの存在の有無は不要ということで終了後に「重複チェック終了しました。」と表示されるだけにしました。
これで実行してもメッセージが出るだけでデータの抽出ができません。

>>731
sheet1のA6に入力欄を作り、実行するとA10以下に表示される、という仕組みを作りたかったので…
これまでVBAに触ったこともなかったので色々と効率の悪いことをしていると思います。
0737デフォルトの名無しさん2016/02/05(金) 12:44:29.76ID:VJfh6At3
質問です。
シートモジュールに@のコードを書くとうまくいきますが、Aのコードを書くと
上手くいきません。
なぜなんでしょうか?教えてください。

@
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 1 Then
Sheet2.Cells(Target.Row, 5) = Time
Sheet2.Cells(Target.Row, 5).Copy
ActiveSheet.Cells(17, 5).Paste

End If
End Sub

A
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 1 Then
Sheet2.Cells(Target.Row, 5) = Time
Sheet2.Cells(Target.Row, 5).Copy
ActiveSheet.Paste

End If
End Sub
0738デフォルトの名無しさん2016/02/05(金) 14:28:18.31ID:7bhw2NUK
>>736
やりたい事 今一つ分ってないけと なんとなく
If Cells(6 + i, 2) = Worksheets("sheet2").Cells(2 + ii, 2) Then Worksheets("Sheet2").Cells(2 + ii, 2).Value = Cells(10 + i, 2).Value
これ
・・・・・・・・Then Cells(10 + i, 2).Value = Worksheets("Sheet2").Cells(2 + ii, 2).Value
じゃないかなと思うのだけど(代入文の 右辺と左辺が逆)


>>737
EXCELのバージョンはいくつ?

俺ん所(EXCEL2016)では
目的どおり動作するかどうか関係なく 単純に動く/動かないだと
@ Pasteで実行時エラー
A 動く
なんだけどな
0739デフォルトの名無しさん2016/02/05(金) 14:54:32.80ID:VJfh6At3
>>738
Excel2010です。
何が原因なんでしょうか?
0740デフォルトの名無しさん2016/02/05(金) 15:07:44.85ID:RDrjDYLW
単純に↓でいいのでは?

Worksheets(2).Select
Cells(target.Row, 5)=Time
Cells(17, 5) = Cells(target.Row, 5)
0741デフォルトの名無しさん2016/02/05(金) 15:19:29.05ID:VJfh6At3
>>740
返信ありがとうございます。
sheet2でコピーしたものをシート1に持ってきたいのです。

ご教示お願いします。
07427382016/02/05(金) 15:22:59.01ID:7bhw2NUK
>>739
ちょっと確認
>>737 の通り
@ ○
A ×
の動作でいいのよね
俺ん所では 逆だから これ以上は回答できないけど
0743デフォルトの名無しさん2016/02/05(金) 15:29:10.07ID:RDrjDYLW
>>741
activesheetを1にした場合で
copyする範囲がa1〜h1だとした例

With Worksheets(2)
For i = 1 To 8
Cells(1, i) = .Cells(1, i)
Next i
End With
0744デフォルトの名無しさん2016/02/05(金) 15:32:26.54ID:VJfh6At3
>>742
すいません、おっしゃる通り逆でした。

A○

>>743
試してみます。
07457382016/02/05(金) 15:37:37.09ID:7bhw2NUK
>>744
なら
https://www.moug.net/tech/exvba/0050103.html
のように
Destination を指定する
0746デフォルトの名無しさん2016/02/05(金) 15:58:15.69ID:VJfh6At3
>>745
無事にできました。
ご教示ありがとうございます。
0747デフォルトの名無しさん2016/02/05(金) 21:58:27.26ID:qfst1uAU
オートシェイプの図形(たとえば角丸四角形)にマクロを割り振って
そのプロシージャ内でApplication.Caller で呼び出し元を調べると
"角丸四角形 1" とか出てくるけど、その図形のNameプロパティーを調べると
”Rounded Rectangle 1" っていうふうに英語名で出てくる。

シート上の複数の図形から同じプロシージャを呼び出して、
呼び出し元の図形の列位置(Column)に応じて処理を分岐させるってのをやりたくて
こんなコード書いたんだけど、
Application.Caller の結果と Nameプロパティーが違うんで上手くいかなかった。

Sub Test()
Dim v As Variant
Dim shp As Shape
Dim clm As Long
v = Application.Caller
For Each shp in Thisworkbook.Sheets(1).Shapes
 If shp.Name = v Then
  clm = shp.Column
  Exit For
 End If
Next shp
End Sub

できればどっちか(なるべくなら英語のほう)に統一したいんだけど、
どうすりゃいいの?
0748デフォルトの名無しさん2016/02/05(金) 22:08:37.95ID:blBw672Y
>>747
ActiveSheet.Shapes(Application.Caller).Name
あたりで英語の名前が取得できるはず
0749デフォルトの名無しさん2016/02/05(金) 22:27:47.03ID:RDrjDYLW
>>747
複数の画像をシートに配置し1画像をクリックしたら個々の処理をしたい
そのマクロを画像数に関係しないで1ルーチンでしたい、、ってことかな?
0750デフォルトの名無しさん2016/02/05(金) 22:33:57.04ID:qfst1uAU
>>748さま
早速の回答ありがとうございます。

Sub Test()
Dim ws As Worksheet
Dim str As String
Dim shp As Shape
Dim clm As Long
Set ws = ThisWorkbook.Sheets(1)
str = ws.Shapes(Application.Caller).Name
For Each shp In ws.Shapes
 If shp.Name = str Then
  clm = shp.TopLeftCell.Column
  Exit For
 End If
Next shp
Set ws = Nothing
Debug.Print clm
End Sub

おかげさまで無事に期待通りの動作になりました。
0751デフォルトの名無しさん2016/02/05(金) 22:36:08.61ID:qfst1uAU
>>749さん
すみません、リロードしてなかったので気付きませんでした

>そのマクロを画像数に関係しないで1ルーチンでしたい、、ってことかな?

そうです、そんな感じです
■ このスレッドは過去ログ倉庫に格納されています