X



Excel VBA 質問スレ Part49©2ch.net
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん 転載ダメ©2ch.net (ワッチョイ bb2e-8SzA)垢版2017/06/26(月) 02:15:14.60ID:T3ylemnb0
!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512

スレ立ての際は一行目に
!extend:checked:vvvvv:1000:512
と入れてスレ立てして下さい

ExcelのVBAに関する質問スレです
コード書き込みや作成依頼もOK

※前スレ
Excel VBA 質問スレ Part48
http://mevius.2ch.net/test/read.cgi/tech/1494890685/

※関連スレ
VBAなんでも質問スレ Part2
http://mevius.2ch.net/test/read.cgi/tech/1432173164/
Access VBA 質問スレ Part1
http://mevius.2ch.net/test/read.cgi/tech/1328536426/
Excel総合相談所 126
https://mevius.2ch.net/test/read.cgi/bsoft/1496487719/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
0002デフォルトの名無しさん (アウアウエー Sadf-hzVx)垢版2017/06/26(月) 05:44:32.43ID:SxRL95TLa
うんこ
0004デフォルトの名無しさん (アウアウエー Sadf-AGoN)垢版2017/06/26(月) 13:46:58.30ID:2dV2LE9Ka
おちるな!
0007デフォルトの名無しさん (ワッチョイ d76d-ZLad)垢版2017/06/26(月) 22:30:10.16ID:9LdZXFFA0
地獄の社内SE
https://anond.hatelabo.jp/20170626005657

> 社内SEはなんとなく楽そうなイメージがあったので、就職した。
> 言語はエクセルVBAとVB.NET 1.0。
> 中身を見るとどちらもかなりやばい。
>
> VBA編
> ・ウォッチウインドウを知らないのか、変数はすべてセルに入れてる。変数名はすべてRANGE("A1").valueみたいな感じで全く意味が分からない。
> ・処理遷移がおかしい。
> セルに1を入れる。そのセルのchangeイベントで処理が動くとか。SHIFT+F2が無力化されてる。
> ・なるべくワークシート関数で処理してる
> データベースからとってきたデータを丸ごとワークシートにコピーしてif,vlookup,match関数を駆使して帳票にしたり、CSVにしてる。
> データ100件制限があったり、1関数を直すときは100行コピーしないといけない。画面中に埋め尽くされたワークシート関数をみて途方に暮れる。
> ・format関数を知らない。
> 8桁の日付をとりたいときyear、month、day関数がワークシートにあり、
> その下の行で月の二けた判定、日の二けた判定のif関数で頭の0をつけ3行目でconcatenateしている
> ・タイマー起動
> 毎朝100本ぐらいのマクロが動いてる。タイマー起動なので、毎日セットしないといけない。(タスクスケジューラーを知らない)
> がんがんエラーが発生するので、マクロ設定をエラー処理対象外のエラーで中断にしないと動かない。
> ・遅い
> textboxのchangeイベントでDBからのデータ取得処理を入れているので、データが多くなると1文字打つごとに数分待つ状態。exitイベントを知らないらしい
> DBの更新処理でもテーブル全件とってきて、ループしながらキーが一致するのを探して更新。
> ・変数や関数のスコープの管理
> ない。基本グローバル。
> ・クラス
> ない。
> ・ネスト
> ない。
> そんなつっこみどころしかないEXCELマクロが200本以上ある。
> おじいさんが20年にわたって深夜残業や休日出勤を厭わず作ってきた、地獄の社内システムの担当になったらしい。
0010デフォルトの名無しさん (ワッチョイ 970d-q+YL)垢版2017/06/26(月) 23:06:06.76ID:Wf2yMC4X0
VBAが仕事っていいじゃねーか
業務の合間にマクロ作ってるけエクセルが得意な人扱いしかされない
カラオケが上手いとか酒が強いとかと同じ扱いだよ俺もVBAだけやってたいな
0012デフォルトの名無しさん (ワッチョイ 9711-AGoN)垢版2017/06/27(火) 00:31:50.14ID:Ou4JxjyB0
>>7
ヤバすぎでしょ
0016デフォルトの名無しさん (アウアウエー Sadf-AGoN)垢版2017/06/27(火) 13:08:41.86ID:NeDeRylha
どう考えてもイチから作り直すべきだが、それを現場がどう理解してるかだわ
セルに値が入ってないと管理できない!とかありそう
0017デフォルトの名無しさん (ワッチョイ 9711-H8Dq)垢版2017/06/27(火) 20:49:18.00ID:s+Xomzrw0
質問失礼します。
ある一つのセルに、氏名コメント改行文字が5人分入っていて、選択するとformにテキストボックスが5人分用意されている所に、それぞれの氏名に合わせて入る様になっています。

やりたい事は、formのテキストボックスに作業者が入力したのの更新履歴を付けたいのです。
作業者は自分の氏名のテキストボックスに入力することになっています。

コマンドボタンをクリックしたタイミングで、どのテキストボックスが最後に変更されたのか取得できる方法が有りましたら教えてください。
0018デフォルトの名無しさん (ワッチョイ 9f11-NIhq)垢版2017/06/28(水) 01:46:45.72ID:YSCBV96g0
>>17
AfterUpdateイベントやChangeイベントで最後に更新されたテキストボックスを記録して、ボタンを押したときにその内容を読み取る、みたいな感じになる。
↓こんな感じ

Private LastUpdated

Private Sub TextBox1_AfterUpdate()
LastUpdated = "TextBox1"
End Sub

Private Sub TextBox2_AfterUpdate()
LastUpdated = "TextBox2"
End Sub

Private Sub CommandButton1_Click()
Dim str
If Not IsEmpty(LastUpdated) Then str = Me.Controls(LastUpdated).Text
'処理
End Sub
0021デフォルトの名無しさん (ワッチョイ 9711-H8Dq)垢版2017/06/28(水) 06:18:19.57ID:tYXWZB4k0
>>19
ご回答ありがとうございます。
今回の件はAfterUpdateで対応出来ました。
今後の為にお聞きしたいのですが、例えばテキストボックスが100個とかあった場合、VBのコントロール配列の様に一つのプロシージャで100個のテキストボックスのAfterUpdateに対応することは出来ませんか?

よろしくお願いします。
0022デフォルトの名無しさん (ブーイモ MMcf-xRMs)垢版2017/06/28(水) 12:49:44.66ID:zWYciN7lM
>>21
「vba フォーム イベント withevents」とかでググれば、クラスモジュールを使ってイベント付きコントロールを配列またはコレクション化する方法が出てくる。

フォームの履歴管理には、クラス変数にフォームへの参照と、配列のインデックスまたはコレクションのキーなんかを渡して処理すればたぶんOK。
0023デフォルトの名無しさん (ワッチョイ 9711-H8Dq)垢版2017/06/28(水) 22:25:33.70ID:tYXWZB4k0
>>22
ありがとうございます。
witheventsを使用してテキストボックスのチェンジイベントをひとまとめに出来ました。
afterupdateをまとめれるともっと良かったのですが、それは無理そうなのでこれで満足です。
本当にありがとうございます!
0024デフォルトの名無しさん (ワッチョイ f7e4-d3en)垢版2017/06/28(水) 23:11:40.00ID:E86Fbm8W0
100という10進数をDo loop を使って2進数に変換させるにはどのようにすればよいのでしょうか?
イメージとしては、100を2ずつ割っていってそこで出たそれぞれの余りの数をセルA1に表示させたいです。
よろしくお願い致します。
0032デフォルトの名無しさん (ワキゲー MM8a-I/sj)垢版2017/06/29(木) 12:28:02.00ID:JWTkSooHM
曖昧だけど設計まであるのにできてないのなら今どんなコードを書いてるのか提示して質問してほしいなぁ

いっそのこと「この仕様を満たすコードをください!」と言ってくれてもいいけど
0033デフォルトの名無しさん (JP 0H92-9Mth)垢版2017/06/29(木) 16:10:07.03ID:YLVns9yBH
はい、作ったよ
仕様満たしてるかどうかはあんたたちで
みっちり見てね
バグ見つけたら教えてね


で仕様齟齬をあぶり出してもらわないと
仕様を具体的に言わないクライアント(身内だけど)とは付き合えない
0036デフォルトの名無しさん (JP 0H16-CicO)垢版2017/06/29(木) 17:16:17.14ID:ye6KcLeHH
>>35
面倒でも文書化して読んでもらうのがいいよ
読んで始めて、自分が何を欲しているか気づく場合もあるし
後は、プロトタイプかな

全部できて「これ、全然違うし」とか言われるリスクあるなら、そういうことやってみたらいいと思う
0038デフォルトの名無しさん (ワッチョイ c206-nP2k)垢版2017/06/29(木) 20:02:23.80ID:eyQ8k34N0
このスレの人間って質問者置いてけぼりであーだこーだ言うのが多いけど、一番ムカつくのは、
肝心の質問者が自分のやりたい事はこういうことだって言わないこと。

少しは自分の質問に責任くらい持ちやがれ
0039デフォルトの名無しさん (ワッチョイ c66f-WwN4)垢版2017/06/29(木) 20:20:17.81ID:XN0IVm4b0
こういった輩が多いから双方の軋轢が絶えないんだろな
先方はまったくの門外漢だ て前提で仕事を引き受けられない
相手も自分と同レベルだと信じて疑わない もしくは少し下ぐらい

初めて住宅を新築する顧客が、いきなり詳細設計図渡されて理解できるか?
ソッチで仕様書と図面引いてください って言ってるのと同様だぞ?
引き受けるからにはその仕事を請け負う責任も勿論だが
これから実施する作業の概要・概略を相手に理解してもらうテクニックだって
必要だろ  それを持ち合わせないならサンプル品なり試作品なり作ってでも
相手と同じレベルで進捗を図るのが普通じゃ無いのか?

こっちはざっくり動きや結果を見越せるけれど、相手にもそれを要求するのは
傲慢でしかないんだが
いわんや、相手の業種・業態に依ってはコチラ側が思いもしないような入力・
操作が要求されるケースだってままある

仕様も要件も書き出せますよ なんてぇ企業相手ならおまえら不要だろ
社内で事足りるわ
も少し謙虚に成れんのか 会議だ仕様だ要件だなんてぇことに無駄な時間を
費やすぐらいなら、とっとと試作して「こうですか?」で何歩も進むだろ

いやすまん なんでもない
0043デフォルトの名無しさん (ワッチョイ 6d2e-mQuD)垢版2017/06/29(木) 22:02:03.85ID:irMBslcI0
最近、趣味でVBAのプログラムを始めた初心者です
区切り記号を含むテキストデータを Split() を使って二次元配列に入れようと思っています。

テキストデータは、vbLf で改行、行内のデータは、vbTab で区切り です

<例: String 型の TextData の内容>
あああああ アアアアアアアアア
いい イイイイイ
ううううう ウウウ
 (以下、同様の形式で全500行ある)


いろいろ宣言の仕方などを試した結果、次の方法でエラーなく実行できたのですが…

 Dim tmpDim As Variant
 Dim sqrDim(500) As Variant

 tmpDim = Split( TextData, vbLf )
 For i = 0 to UBound( tmpDim ) - 1
   For j = 0 to 1
     sqrDim( i ) = Split( sqrDim( i ), vbTab )
   Next j
 Next i

これでは、途中の38行目を読み込んだところ(i=37,j=1)で、
 実行時エラー '9':
 インデックスが有効範囲にありません
とのエラーが出て止まってしまいます。
(一次方向(行)には500個確保できていると思うので、なぜインデックスエラーなのか不思議です)

2回目のSplitの受けも、別の一次元配列で行い、後で二次元配列に格納すればいいとは思いますが
上手く二次元配列でSplitのデータを受けるやり方はあるのでしょうか? お手数ですが教えてください
0045デフォルトの名無しさん (ワッチョイ 4211-nP2k)垢版2017/06/29(木) 22:33:09.86ID:+TVRrlUj0
>>43
これ通るの?
   For j = 0 to 1
     sqrDim( i ) = Split( sqrDim( i ), vbTab )
   Next j
で sqrDim( i ) を2回splitしてる。
1回めは文字列のsplitだからいいけど、2回めは配列のsplitになってエラーになりそうだけど。
For j のループは不要。

あとついでに
For i = 0 to UBound( tmpDim ) - 1
だとTextDataの最終行のデータが配列に格納されないけど問題ないか?
0046デフォルトの名無しさん (ワッチョイ 42aa-wjSU)垢版2017/06/29(木) 22:47:04.00ID:CQo0iGok0
>>43
こうでしょ

 Dim tmpDim As Variant
 Dim sqrDim As Variant

 tmpDim = Split( TextData, vbLf )
 ReDim sqrDim(LBound(tmpDim), UBound(tmpDim))
 For i = LBound(tmpDim) to UBound( tmpDim )
     sqrDim( i ) = Split( tmpDim( i ), vbTab )
 Next i

sqrDimは2次元配列じゃなくて配列の配列になるけど、むしろこっちの方があとで楽だと思う。
004743 (ワッチョイ 6d2e-mQuD)垢版2017/06/29(木) 23:32:28.05ID:irMBslcI0
>>44-46
早々に回答ください、どうもありがとうございます。

いろいろ回答を頂いておきながら、大変申し訳ないのですが、
38行目のデータをよく見たところ、TAB区切りではなく、ここだけスペースが入っていました
(他は、各行に2個の要素があったのですが、ここだけ要素が1個でした)
そして、これを修正したら、エラーなく実行できました。
お手数をおかけし、申し訳ありませんでした。

おっしゃる通り、j のループは不要ですね。(いろいろ修正していて、j を使わなくなったようです)

> だとTextDataの最終行のデータが配列に格納されないけど問題ないか?
いえ、ちゃんと最終行まで格納出来てました
(UBound()は要素数を表しているように思います)

>  ReDim sqrDim(LBound(tmpDim), UBound(tmpDim))
ReDim は使ったことがないので、また調べてみます

以上、ありがとうございました。
004843 (ワッチョイ 6d2e-mQuD)垢版2017/06/29(木) 23:41:18.00ID:irMBslcI0
>>45
> これ通るの?
>    For j = 0 to 1
>      sqrDim( i ) = Split( sqrDim( i ), vbTab )
>    Next j
これ、写し間違いでした。 2回目に Split するのは tmpDim でした

×:      sqrDim( i ) = Split( sqrDim( i ), vbTab )
○:      sqrDim( i ) = Split( tmpDim( i ), vbTab )

申し訳ありませんでした
0049デフォルトの名無しさん (ワッチョイ 4211-nP2k)垢版2017/06/30(金) 00:06:21.55ID:pQmgso2J0
>>47
> (UBound()は要素数を表しているように思います)

一応言っておくと、これは間違い。
UBound(tmpDim) は配列tmpDimのインデックスの最大値を返す。
TextDataが500行(vbLfが499個)だとしたら、tmpDimのインデックスは(0 to 499)になるから、UBound(tmpDim) は499を返す。
このコードのsqrDim(500)が全部埋まってるのであれば、TextDataは501行あるはず。
まあ結果がOKならいいんだけどね。
005143 (ワッチョイ 6d2e-mQuD)垢版2017/06/30(金) 00:48:26.80ID:K3G7Sb4z0
>>49-50
> 一応言っておくと、これは間違い。
> UBound(tmpDim) は配列tmpDimのインデックスの最大値を返す。
申し訳ないです。
おっしゃる通り、ググってみるとそのように書いてました。
なお、TextDataは実際には400行前後のため、偶然上手く動いているように見えてたのですね
(実際は、400〜499までループが回っており、タチの悪いバグになるところでした、感謝です)

前にC言語を少しやっていたので、同じ扱いだと思っていましたが違ってたんですね
わざわざありがとうございます。
0058デフォルトの名無しさん (ワッチョイ c26f-CicO)垢版2017/06/30(金) 23:09:21.97ID:+ePBm/Xa0
俺、プログラムは作れるけど、試験は落ちそうだな。

DimとかRowとか、短い文字は打てるんだけど、
長いのは、普段コピペしてるから、打てない。

最近、やっとColumnsを間違えずに打てるようになったわ。

それまでは、Corums? ん? Colmns? え? Culomus? 違う?
Colums? わかんね。 もう諦めてコピペしよう、みたいな感じ。
0061デフォルトの名無しさん (ワッチョイ 066d-B6M/)垢版2017/07/01(土) 00:29:13.54ID:QYfDEdV/0
それは数学の知識の問題だと思うので、別にできなくてもいいと思う。多分一生役に立たない
でも最小二乗法とか漸近線、偏差値など、統計学的な知識はあったほうが良いと思う
0062デフォルトの名無しさん (ワッチョイ 4623-hx6n)垢版2017/07/01(土) 04:46:24.33ID:PtoY4rVn0
>>53
昔、某掲示板で質問した人に話の内容から初心者として扱ったらその資格持ってるとのことでびっくりしたことがある。

どんな資格でもそうだけど、そういうもんなんでしょう。
そうしないと受かる奴いなくなっちゃう。
0063デフォルトの名無しさん (ワッチョイ 4623-hx6n)垢版2017/07/01(土) 04:52:54.03ID:PtoY4rVn0
>>60
そんな問題が実際の案件に出てきた時に最適なコードが書ければ良いでしょ。
それにその程度の話ってググレば出てくるでしょ。

そんなのは何かあったよなと思うことが出来てググレればOK。
それよりも上手いやり方に気付かずにクソコード書く奴は多い。
0064デフォルトの名無しさん (オッペケ Sr71-UM0m)垢版2017/07/01(土) 08:01:59.81ID:JGSuKZu6r
>>63
自分のクソは棚上げかクソw
0067デフォルトの名無しさん (ワッチョイ 066d-wjSU)垢版2017/07/01(土) 08:38:38.91ID:QYfDEdV/0
>>66
支店名 状態 月 売上
A支店     3 200
B支店     3 10
C支店     3 500
A支店     4 300
B支店 閉店 4 0
C支店     4 600

4月の売上平均を求めよ(制限時間5分)
って感じ。

D1=(300+0+600)/3
にはたまげた。もちろん関数を使わない人はアウト

B支店を入れるかどうか疑問に思えば合格
0070デフォルトの名無しさん (ワッチョイ b169-nP2k)垢版2017/07/01(土) 10:42:47.44ID:r7UjQGgF0
エクセルのある部分をリストボックスにしたいのですが、rowsourceで設定すると、間に空白が多くなった時に使いにくいです。
そこで下記のように空白だったら、リストに加えないとしたら、リストに何も出てきません。
どこがおかしいでしょうか? RowPN(i)には既にエクセルの1セルの値が167個入ってます。

i = 1
i1 = 1
Do Until i > 168
On Error Resume Next
If RowPN(i) <> "" Then
UF6ComboBox1.AddItem RowPN(i), i1
i1 = i1 + 1
End If
i = i + 1
Loop
0071デフォルトの名無しさん (ワッチョイ c26f-CicO)垢版2017/07/01(土) 11:20:29.10ID:PX/A+v/i0
VBAの試験って、やっぱ何らかの制限付きなんだろうか。
制限しないと、ソートにSQLとか、Worksheetfunctionとか、
Cells(1,1).Value="計算式"とか、正解だけど、試験の趣旨としてどうなの?
という答えが沢山出来てしまう。
0072デフォルトの名無しさん (ワッチョイ 4211-nP2k)垢版2017/07/01(土) 11:27:20.68ID:+dYABl5A0
>>70
・RowPNの中身が全て""またはEmptyになっていないか。
 Dubug.Printまたはローカルウィンドウでの確認を推奨する。
・リストボックスと言っているが変数はUF6ComboBox1で合っているか。
・RowPNの要素が(0 To 166)ないし(1 To 167)だとDoループがi=168までカウントするのでインデックスエラーになる。
 For文の方が無難そうに思えるのと、ここでOn Error Resume Nextはどうかと感じる。
0076デフォルトの名無しさん (ワッチョイ b169-nP2k)垢版2017/07/01(土) 11:48:18.71ID:r7UjQGgF0
>>72 >>73 ありがとうございます。 値は入ってるのは確認しました。FOR文も空白ですね・・・。
シート使っているので、そこに1エリア儲けて、空白除いて再整列させて、ROWSOURCEで設定してみます。
0078デフォルトの名無しさん (ワッチョイ 0623-wjSU)垢版2017/07/01(土) 12:14:29.98ID:5ubPuGy00
>>76
その方法で納得ならいいですが

配列に入っているなら
On Error Resume Nextで
コントロールを参照できないのでエラーしているのを
すっ飛ばしているのではなかろうか。
つまり>>72が言っているようにUF6ComboBox1は存在しないのでは。
On Error〜をコメントアウトしてみてはどうか。

と思う。
0080デフォルトの名無しさん (ササクッテロラ Sp71-THY3)垢版2017/07/01(土) 14:17:52.99ID:zDfIbROqp
>>61
数学の知識というより再帰関数とかのプログラム技術の問題
0082デフォルトの名無しさん (ワッチョイ bd8b-UM0m)垢版2017/07/02(日) 02:18:34.32ID:mbMXyeDF0
こんばんわ、
膣に挿入したら動きません、きたろうです
0084デフォルトの名無しさん (アウアウウー Sa25-k1q/)垢版2017/07/03(月) 17:11:55.95ID:3aAVlqxCa
以下のプログラムで「該当するセルが見つかりません」となってしまいます。
該当するセル範囲のセルはすべて空白です。
期待する動作は、「B4:B6の範囲の空白セルにコメントを入れる」です。
Sub commentAddToBlankCells()
____On Error GoTo ERROR_ALL
____Range("B4:B6").SpecialCells(xlCellTypeBlanks).AddComment "目視確認"
____Exit Sub
ERROR_ALL:
____MsgBox Err.Description
End Sub
※Excel2010です。
0089デフォルトの名無しさん (ワッチョイ 62ec-nP2k)垢版2017/07/03(月) 20:33:45.35ID:S8hpBEzs0
例えば、
そのセルの値が0より大きければセルA1をコピーし、そのセルに書式を貼り付け、
そのセルの値が0より小さければセルA2のコピーし、そのセルに書式を貼り付ける。

この程度の処理を数百のセルに行うのに結構な時間がかかる。
短時間で完了させるにはどうしたらいいんでしょうか?
ある程度のセル範囲ごとにまとめて書式貼り付けすればいいんでしょうか?
0091デフォルトの名無しさん (ワッチョイ 65c1-ZBdv)垢版2017/07/03(月) 20:39:25.48ID:u6VhpuAl0
Sub nisinsu()
Dim Z As Single, S As Long, N As String, A As String
Z = 100
S = 1
Do Until Z <= 0
N = Z Mod 2
Cells(S, 1) = Z
Cells(S, 2) = N
Z = Z \ 2
S = S + 1
A = N + A
Loop
Cells(1, 3) = A
End Sub

上の方で2進数について質問したものです
このコードである程度無事に解決しましたが、一つ分らないことがあります
Loop を抜けた後の Cells(1, 3) = A の所は Loopの一つ上の A = N + A によって 1100100 と正しい数字が表示されます
しかしこの A = の中を A = A + N というように A と N を逆にすると 10011 と全く別の数字になってしまいます
この理由がどうしてなのかを教えてください
0092デフォルトの名無しさん (ワッチョイ bd8b-UM0m)垢版2017/07/03(月) 20:39:42.65ID:c364q6zP0
>>89
性格悪い日本語でよろしく
0096デフォルトの名無しさん (ワッチョイ 62ec-nP2k)垢版2017/07/03(月) 21:15:43.91ID:S8hpBEzs0
>>89です
>>90>>92>>94
わかりにくかったですか、すいません。かなり酔ってます。

一日200行ぐらい増えるブックがあります。列数は50ぐらいです。
一ヶ月で6000行ぐらいでしょうか。あらかじめ条件付き書式を設定していましたが、
なんかブックを開くときに重くて、きっと条件付き書式が原因だろうと思い、
条件付き書式ではなく、VBAで各セルの値に応じて書式を固定しようと思ったわけです
でも、そのVBAが時間がかかって困ってるわけです。
書式のコピペって時間かかるんですね。
もっと書式のコピペを早くできる方法はないのかなって思ったわけですわ。
0099デフォルトの名無しさん (ワッチョイ 066d-5V5Y)垢版2017/07/03(月) 21:49:40.34ID:wrAlhZZL0
>>96
条件付き書式が断片化してない?断片化ってのは勝手に作った言葉だけど・・・
例えば、A:Aに条件付き書式(=a1=1)を設定して、10行目を切り取って11行目に挿入したりすると
条件=A1=1
=$A$1:$A$10,$A$12:$A$1048576

条件=A11=1
=$A$11

のように分割される
一度条件付き書式の書式ルールの管理、「このワークシート」を見てみたほうがいいかも
0102デフォルトの名無しさん (ワッチョイ 62ec-nP2k)垢版2017/07/03(月) 22:23:39.09ID:S8hpBEzs0
今のコードはこんな感じです。

Public Sub シートの書式を設定する()
Dim iRow As Long, iCol As Long, LastRow As Long, ws As Worksheet, r As Range
Application.ScreenUpdating = False
Application.EnableEvents = False
Set ws = ThisWorkbook.Worksheets("対象シート")
startRow = 4
LastRow = ws.Cells(Rows.Count, "B").End(xlUp).Row
For iRow = startRow To LastRow
For iCol = 4 To 100
Set r = ws.Cells(iRow, iCol)
If IsNumeric(r.Value) Then
If r.Value > 0 Then
r.Select
ws.Cells(1, "C").Copy
r.PasteSpecial Paste:=xlPasteFormats
DoEvents
ElseIf r.Value < 0 Then
r.Select
ws.Cells(2, "C").Copy
r.PasteSpecial Paste:=xlPasteFormats
DoEvents
End If
End If
Next iCol
Next iRow
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub
0105デフォルトの名無しさん (ワッチョイ bd8b-UM0m)垢版2017/07/03(月) 22:43:07.60ID:c364q6zP0
あ〜万個増殖ね〜ありがちだわ〜
0109デフォルトの名無しさん (ワキゲー MM8a-I/sj)垢版2017/07/03(月) 23:58:29.09ID:MkRtof65M
>>107
コレを動かしてみたらわかるよ

Sub nisinsu()
Dim Z As Single, S As Long, N As String, A As String
Dim AA As Single
Z = 100
S = 1
Do Until Z <= 0
N = Z Mod 2
Cells(S, 1) = Z
Cells(S, 2) = N
Z = Z \ 2
A = N + A
Cells(S, 4) = A
AA = AA + N
Cells(S, 5) = AA
S = S + 1
Loop
Cells(1, 3) = A
End Sub
0110デフォルトの名無しさん (ワッチョイ 4211-nP2k)垢版2017/07/04(火) 00:10:14.68ID:pX4cRUUJ0
>>102
<0と>0をUnionでまとめてからコピペしたら速くなりそう。
ただUnionのセル数が増えすぎるとUnion自体が遅くなるみたいなので、1〜数十行くらいで区切ったほうがいいかも?

まあ>>97のほうが速い気はするけど。
0113デフォルトの名無しさん (オッペケ Sr71-nSMp)垢版2017/07/04(火) 08:12:48.47ID:n1qpisHfr
田のクラッカー
0115デフォルトの名無しさん (ワッチョイ 62ec-nP2k)垢版2017/07/04(火) 20:20:52.61ID:aFK9C0z90
>>89>>102です。

>>103 図形のオブジェクトはありませんでした。でも変なオブジェクトが多量に残っていたという経験は過去にありました。確認してみます。
>>110 Unionでまとめて処理ですか。試してみます。>>97と比較してみます。
>>111 実際の行は数千行ありますが、実際には最終行から200行しか処理してません。後出しになりますが>>102ではその部分を省きました。ごちゃごちゃするかなと思い・・・
0119デフォルトの名無しさん (アウアウウー Sa25-k1q/)垢版2017/07/05(水) 10:23:55.19ID:jMcI5nQfa
ダブルクリックとシングルクリックを区別する処理を考えましたがあまり
美しくないです。もっとスマートな方法はありますか?
VDim isDoubleClick As Boolean
Dim cancelClick As Boolean
Private Sub CommandButton1_Click()
____Dim i As Long
____For i = 0 To 2048
________DoEvents
________If isDoubleClick = True Then
____________Exit Sub
________End If
____Next i
____If (cancelClick = False) Then
________' シングルクリック時の処理はここ
________Worksheets(1).Range("a1").Value = "シングルクリック"
____End If
____cancelClick = False
End Sub
Private Sub CommandButton1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
____isDoubleClick = True
____' ダブルクリック時の処理はここ
____Worksheets(1).Range("a1").Value = "ダブルクリック"
____isDoubleClick = False
____cancelClick = True
End Sub
Private Sub UserForm_Initialize()
____isDoubleClick = False
____cancelClick = False
End Sub
0122デフォルトの名無しさん (アウアウウー Sa25-k1q/)垢版2017/07/05(水) 16:49:43.67ID:F7dOY4NYa
>>120
ありがとうございます。質問そのものについてはタイマー張ることで実現
できることがわかりました。
また、イベントハンドラをまとめる方法もついでに知ったので助かりました!
>>121
次からそうします。ありがとうございます。
0125デフォルトの名無しさん (ワッチョイ bd8b-UM0m)垢版2017/07/05(水) 22:49:15.43ID:odMt6Ynp0
セルが2つだと二次元配列になっちゃうよ
0126デフォルトの名無しさん (アウアウウー Sa25-k1q/)垢版2017/07/05(水) 23:46:14.85ID:F7dOY4NYa
DAOとADOの使い分けを教えて!
0127デフォルトの名無しさん (ワッチョイ f73d-1B52)垢版2017/07/06(木) 00:36:18.68ID:in8T4yu80
使い分けというかADOはDAOに比べて何かと便利だからADOだけ使えばいいんじゃないかな。
AccessだとデフォがDAOなんで使う事も多いけどエクセルで使うときのメリットは特に思い浮かばない。
0136デフォルトの名無しさん (ワッチョイ 778b-QU0D)垢版2017/07/07(金) 23:07:11.35ID:tdv0VtnU0
ネゴシックスだから…
0137デフォルトの名無しさん (ワッチョイ 97ea-okny)垢版2017/07/07(金) 23:13:49.66ID:q3zfwuJv0
vbaってエクセル用の言語?
他にも使えるの?
0139デフォルトの名無しさん (ワッチョイ d701-LW04)垢版2017/07/07(金) 23:41:29.01ID:cLxiai6C0
初歩的な質問で、すみません。

vbaの公式本で独学で勉強中なのですが、
なぜこうなるのかわかりません。
よければ教えてほしいです。

不明点:

@なぜnumがセルa1〜a3だと認識されるのか。
b1〜b3も記述しているので、b1〜b3と認識されないのはなぜか。

Aこういうもんだと言われればそれまでなのですが、
ほかにもnum以外に自動認識されるような用語はあるのでしょうか。



Sub sampel()

 Range("b1") = percent(Range("a1"))
 Range("b2") = percent(Range("a2"))
 Range("b3") = percent(Range("a3"))

End Sub

Function percent(num) As String

 percent = num / 100 & "%"

End Function
0141デフォルトの名無しさん (ワッチョイ bf6d-LaqR)垢版2017/07/07(金) 23:55:59.29ID:IHJ5BTGs0
>>139
残念ながらかなり根本的な事がわかっていない

function〜はユーザー定義関数っつって、処理をひとまとめにしたもの

numってのは変数名。これは自分で決めるもので、
「num」でも「namu」でも「ナンバー」でもなんでもいい。
「sub」「if」みたいな単語は予約語と言ってそれらは使えないんだけど、まぁ何となく分かるだろう

毎回'こう書くのがめんどくさいから
Range("b1") = Range("a1") / 100 & "%"
'functionを定義して、使い回しできるようにしているだけの話
Range("b1") = percent(Range("a1"))

function作るのめんどくさくね?
と思ったかもしれないけど、それは何もわかっていないだけ
素直にこういうもんだと覚えてくれ
0142デフォルトの名無しさん (ワッチョイ d701-LW04)垢版2017/07/07(金) 23:57:08.34ID:cLxiai6C0
すみません。意味が分かりました。
0146デフォルトの名無しさん (ワッチョイ f791-nB+A)垢版2017/07/08(土) 00:07:48.82ID:ieaMtMqy0
>>143
多分だが、引数を理解できてなくて
numに勝手にマッピングされてる、みたいに思ったんじゃないか
なんか勉強の順番おかしいんじゃない?
もっと前のフェーズでの学習が抜け落ちたまま次進んでる気がする
0150デフォルトの名無しさん (ワッチョイ 97ea-okny)垢版2017/07/08(土) 04:13:51.39ID:4CWa99QQ0
Private Sub Worksheet_Calculate()


If Worksheets("sheet1").Cells(3, 20) > 4000 Then

Worksheets("sheet1").Range("V4:AP4").Insert

End If


end sub

インサートがめっちゃ繰り返される。どうして?
0152デフォルトの名無しさん (ワッチョイ bf6d-KuRC)垢版2017/07/08(土) 09:26:58.00ID:lNWyFXj50
>>150
Application.EnableEvents = False
で、eventを止める
そうしないと
>セル挿入→再計算→Worksheet_Calculate→ifがtrue→セル挿入→再計算→Worksheet_Calculate→ifが(略
が起こる

Private Sub Worksheet_Calculate()
Application.EnableEvents = False
If Worksheets("sheet1").Cells(3, 20) > 4000 Then
Worksheets("sheet1").Range("V4:AP4").Insert
endif
Application.EnableEvents = True
End Sub
0153デフォルトの名無しさん (ワッチョイ 97ea-okny)垢版2017/07/08(土) 13:34:02.80ID:4CWa99QQ0
>>151,>>152
的確な指示ありがとう!!(笑)
すごいなここの人は
0154デフォルトの名無しさん (ワッチョイ b7e3-jTKI)垢版2017/07/08(土) 16:53:25.86ID:Z/1cPHhj0
>>149
別にいいよ、モジュールの一番上にそれを書くのを忘れなければ
0156デフォルトの名無しさん (ワッチョイ ffb9-wcci)垢版2017/07/09(日) 00:06:53.03ID:8a4WwF270
こんばんは。
困ってます。

先日作成したマクロが動かなくなりました。
作成した日は動きました。
(特定のフォルダをコピーしてリネームするだけの動きです。)
プログラムを手動で実行したときは問題なく動くので、
プログラムの問題ではなさそうなのですが。

エクセルのセキュリティは、「警告を表示してすべてのマクロを無効にする」
にしています。
エクセルの再起動・PC再起動は試しましたが、だめでした。

C:\...Local\Temp\Excel8.0のMSForms.exdも消してみたりしましたがダメでした。

原因は何でしょうか・・・?
0157デフォルトの名無しさん (ワッチョイ ffb9-wcci)垢版2017/07/09(日) 00:08:43.90ID:8a4WwF270
スペック全然書いてなかった。

Windows8.1
Excel2013 です。
0158デフォルトの名無しさん (ワッチョイ ffb9-wcci)垢版2017/07/09(日) 00:14:34.37ID:8a4WwF270
すみません。
書き込んですぐに自己解決しました。

コマンドボタンのオブジェクト名が違ってた・・・。
0164デフォルトの名無しさん (アウアウカー Sa2b-nSBM)垢版2017/07/09(日) 19:05:53.04ID:WoCQL3Mea
初心者的な内容ですいません。
よければ教えてください。

1はなぜactivesheetでなくshが回答となるのでしょうか。
shがworksheetsとして定義されていないのになぜ、worksheetsとして考えられるのかわかりません。

---------

次のイベントプロシージャはブックに新しいシートを挿入したときに実行される。
挿入されたシートのシート名を、ユーザーがダイアログボックスから入力した名前に変更させたい。
このとき、【 1 】に入る適切な命令を解答欄に入力しなさい。
ただし、シート名の重複などのエラー処理は省略しているものとする。

Private Sub Workbook_NewSheet(ByVal Sh As Object)

Dim strSheetName As String
strSheetName = InputBox("新しいシートの名前を入力してください")

If strSheetName <> "" Then

【 1 】.Name = strSheetName

End If

End Sub
0167デフォルトの名無しさん (ワッチョイ bf23-KuRC)垢版2017/07/09(日) 19:29:29.32ID:e2g8wwYr0
>>164
新しくできたシートが引数Shで渡されている。
(ByVal Sh As Object)の部分。
Workbook_NewSheetのイベントプロシージャの仕様。
たいてい、どのイベントプロシージャも自分自身の参照を引数で渡されている。
ので、この場合、新しくできたシート自身を操作したければ
引数で渡ってきているShを操作すればよい。
0173デフォルトの名無しさん (ワッチョイ bf23-KuRC)垢版2017/07/09(日) 20:10:27.05ID:e2g8wwYr0
ためしに別の変数にShを突っ込んでみたら
中身が見られるようになった。

どっかで、オブジェクト変数は利用されるまで中身が入らないよ
みたいな話を聞いたような・・・。
0174デフォルトの名無しさん (ワッチョイ bf6d-LaqR)垢版2017/07/09(日) 20:17:33.00ID:XJb9KLmK0
>>172
試してみたら、ウォッチ式でもイミディエイトウィンドウでもsh.nameはうまく取れた。
ウォッチ式のshは取れない。
なんかバグの温床になりそうで、このshあんまり使いたくないなぁ…

環境はwindows7 エクセル2010

vbaコード
Private Sub Workbook_NewSheet(ByVal Sh As Object)
MsgBox 1 'ブレークポイントを設定している
End Sub

ウォッチ式に
sh
sh.name
を追加
shは図のとおり、変な状態になる。プロパティなどが表示されない
sh.nameはシート名が表示される

イミディエイトウィンドウは正常
?sh.name
Sheet5

http://stamp-uploda.com/src/file7296.jpg

>>173
プロパティ(sh.name)を呼び出してみた後の状態
(メッセージボックスにはsheeet6と正常に表示された)
やっぱりダメだった。
http://stamp-uploda.com/src/file7297.jpg

なんらかの理由でウォッチ式が正常に機能してないだけならいいけど、正常な状態でこれだとどういう状況なんだろう
0175デフォルトの名無しさん (ワッチョイ bf23-KuRC)垢版2017/07/09(日) 20:42:05.40ID:e2g8wwYr0
>>174
Dim sheet as Worksheet
Set sheet = Sh

これをmsgboxの前に追加すると全部の変数がウォッチで見られると思う。

ググってみたらNewで作ったオブジェクトは初めて利用するまで空ですよ
らしいので、新シートのオブジェクトは内部的にNewで作成している?
Sh.nameが引けるのは何ででしょう?
0177デフォルトの名無しさん (ワッチョイ 9791-9DAm)垢版2017/07/09(日) 20:43:34.76ID:BT4+59vh0
>>174
objectで受け取ってるからshのままでは何のクラスなのかわからないからどんなプロパティがあるかわからない

Nameプロパティを指定したら
Nameプロパティを持っているクラスとして解釈して
Nameプロパティの位置を文字列として表示しただけ

worksheetクラスのデフォルトプロパティがNameだからかな

countプロパティとかとして解釈させたら想定外の値になると予想
0179デフォルトの名無しさん (ワッチョイ 9791-9DAm)垢版2017/07/09(日) 20:49:10.77ID:BT4+59vh0
>>178
VBAだけじゃなくて他のプログラミング言語C言語とかと共通の考え方

メモリ確保とかキャストとか
0180デフォルトの名無しさん (ワッチョイ 9791-9DAm)垢版2017/07/09(日) 20:54:20.52ID:BT4+59vh0
>>164
1が実行されるまでの間にactivesheetが変わるかもしれないからactivesheetでは不正解だと思う

出来るだけactivesheetを使わない方が想定外の動作にならないと思う
0181デフォルトの名無しさん (ワッチョイ 778b-utq/)垢版2017/07/09(日) 20:55:59.71ID:oI2zN/et0
てかお前らそんなに一か八かでactivesheet使ってんのかよw
0182デフォルトの名無しさん (ワッチョイ bf6d-Rm1X)垢版2017/07/09(日) 21:19:51.98ID:XJb9KLmK0
これが通るけど、ウォッチ式には現れない
多分ウォッチ式の不具合だと思う
そう考えないと気持ち悪くて仕方ないし疲れてきた・・・

Private Sub Workbook_NewSheet(ByVal Sh As Object)
Sh.Calculate
MsgBox Sh.Index
End Sub

http://stamp-uploda.com/src/file7299.jpg

>>175
sheetでもShでも見れるようになりました
Shの参照をコピーしたのでインスタンスが生成されたのかな

>>177
indexプロパティでも通りましたし
Sh.Calculateメソッドでも通りました

>>181
使ってないよ。sheetの指定はsetした変数を使ってる
昔はactive〜やselect〜を使ってたけどね
0183デフォルトの名無しさん (ワッチョイ 9791-9DAm)垢版2017/07/09(日) 21:38:18.71ID:BT4+59vh0
>>182
worksheetクラスではないクラスのプロパティを指定したらどうなると予想する?

例えばRangeクラスのプロパティとか

もしかしたらサイズとかを見ていてサイズが異なる場合はキャスト出来ないかもしれないど

メモリ領域には値が格納されているけどそれをどう解釈するかはクラスが決まらないと特定できない
0186デフォルトの名無しさん (ワッチョイ bf23-KuRC)垢版2017/07/09(日) 22:03:56.91ID:e2g8wwYr0
Private Sub Workbook_NewSheet(ByVal sh As Object)
 Dim obj As Object
 Set obj = sh
 MsgBox obj.Name
End Sub

これだと中身が見られないけど通る。
やっぱり>>183の型キャスト説じゃないかなぁ。
ローカルウィンドウでも見られないし。

obj.Value = "aaa" で実行時エラーになる。
「ん〜何か知らないけどValueに入れるよ?あっねえわw」 ってことでは?

.Nameや.Range().Addressはあったんで通る。
0188デフォルトの名無しさん (ワッチョイ 9791-Razr)垢版2017/07/09(日) 22:31:30.92ID:BT4+59vh0
>>184
Debug.Print Sh.Range("a1").Address
ではなくて
Debug.print sh.address
だったらどうなるかって意図だったけど
ためしたら実行時エラーになる
これはtypename(Sh)を表示したらわかるけど
Shという変数自体にクラス(型)に関する情報を持っているから
無理矢理Rangeクラスのプロパティを表示させようとするとエラーになる

dim rng as Range
set rng = Sh
とかやっても実行時エラーになる
文法的にはエラーじゃないからコンパイルは通る

VBAが型チェックしてバグにならないようにしていると思う
他の言語だとこれができるものもある
0189デフォルトの名無しさん (ワッチョイ 9791-Razr)垢版2017/07/09(日) 22:35:23.27ID:BT4+59vh0
>>187

ShがWorksheetクラスだっていうのが判ってるからRangeを指定するってわかるけど
Objectクラスだったら何のプロパティを持っているかわからなくない?

Objectクラスはすべてのクラスのスーパークラスだから何でも参照できる
Sh as Objectと宣言されているShが実態はRangeクラスである場合もある
その場合は、Sh.Value = "a"でも実行時エラーにはならない
0190デフォルトの名無しさん (ワッチョイ bf6d-J8Ag)垢版2017/07/09(日) 22:50:14.83ID:XJb9KLmK0
>>188-189
なるほど、意図が分かりました。コンパイルエラーになる意味もわかりました、ありがとうございます

以下の状態だと、shの型はobject/Sheet5としてウォッチ式に認識されます
この「Sheet5」というのは何でしょうか?
デフォルトプロパティでしょうか?

Private Sub Workbook_NewSheet(ByVal Sh As Object)
Dim sheet As Worksheet
Set sheet = Sh
Debug.Print 1 'ここでブレークポイント
End Sub
0191デフォルトの名無しさん (ワッチョイ bf6d-J8Ag)垢版2017/07/09(日) 22:58:28.17ID:XJb9KLmK0
しかし>>175がどうしてもわかりません

object型をobject型に渡してもプロパティは分からない、それは分かります
http://stamp-uploda.com/src/file7303.jpg

object型をworksheet型に渡すと、ウォッチ式で見れるようになる、それがわからない
http://stamp-uploda.com/src/file7302.jpg
全部のプロパティ・メソッド見たら全部一致してたからworksheetとしてコピーしますね〜ということ?
0192デフォルトの名無しさん (ワッチョイ 9791-Razr)垢版2017/07/09(日) 23:03:28.23ID:BT4+59vh0
>>190
Set sheet = Sh
を実行した時点で、Sh = sheet = Worksheetクラスのオブジェクトと特定可能
なのでworksheetクラスのデフォルトプロパティを表示しているのではないか

ウォッチ式にsheet変数も追加すると、そのタイミングで
Shの他のプロパティも見えるようになった
0193デフォルトの名無しさん (ワッチョイ bf23-KuRC)垢版2017/07/09(日) 23:06:31.26ID:e2g8wwYr0
>>191
型キャストで
Shがワークシートだと判明したので
Shとsheetは同じ物なので
両方のプロパティが同じで表示されるのではと思うが。
詳しくはマスターにまかせる。

と思ったらもう回答されていた。

すごい勉強になった。
0194デフォルトの名無しさん (ワッチョイ 9791-Razr)垢版2017/07/09(日) 23:09:27.92ID:BT4+59vh0
>>191
ウォッチ式の表示更新タイミングはその内容が特定されたときに
即座に表示更新されるとは限らない
つまり表示更新されるよりもずっと前に表示すべき内容が特定されていた可能性もある
0198デフォルトの名無しさん (ササクッテロロ Spcb-9DAm)垢版2017/07/10(月) 12:47:22.77ID:8dcdQUy6p
>>197
和は加算の結果を表す言葉
0を加算とか足す0じゃないと意味が違ってくる

因みにレコードセットの型はcolumnの最初の7行分のデータから推測されるとかだったと思うから
目的の型になるようにソートすればいいかも
0207デフォルトの名無しさん (ワッチョイ bf6d-KuRC)垢版2017/07/10(月) 18:40:40.88ID:9dSXLq4x0
デフォルト値は定数式で、って言われるな

デフォルト値を文字列にして"thisworkbook"、evalで…とか考えたけど2013持ってないから試せない
そこまでしても読みにくくなるだけなので、素直に>>206みたいに条件分岐させたほうが良いと思う
0208デフォルトの名無しさん (ブーイモ MMdb-MhHl)垢版2017/07/10(月) 19:04:18.69ID:fjsjDBbbM
質問です。
ユーザーフォームをShowModal=Falseで表示しており、フォームを表示したまま、フォーカスをフォームからセルに移動することは可能でしょうか?
cells(1,1).select や application.goto cells(1,1) ではフォーカスがフォームから動きませんでした。
0210208 (ブーイモ MMdb-MhHl)垢版2017/07/10(月) 19:26:18.02ID:fjsjDBbbM
>>209
回答ありがとうございます。
後出しで申し訳ないですがバージョンは2007です。
試せるのが明日になりますが、appactivate試してみます。
0212デフォルトの名無しさん (ワッチョイ 9791-9DAm)垢版2017/07/10(月) 21:00:26.90ID:N/fNiVFC0
>>211
コンパイル時点で決まってないからかな〜
0213208 (ブーイモ MMdb-MhHl)垢版2017/07/11(火) 12:39:40.24ID:fzHCV1ljM
>>209
AppActivateもApplication.Visible=Trueでもいけました!
ちなみに以下のも試しましたが全部ダメでした。
ActiveWindow.Activate
ActiveWorkBook.Activate
ActivateSheet.Activate

2010以降だとWIN32APIとかでシートのマウスクリックを挟まないとダメかもですね。
0218デフォルトの名無しさん (ワッチョイ 778b-utq/)垢版2017/07/12(水) 19:50:58.17ID:vG3FHDEt0
つっこむならせめて値と型の違いぐらい分かっていて欲しかったなあ
0221デフォルトの名無しさん (ワッチョイ bf23-KuRC)垢版2017/07/12(水) 20:10:18.44ID:agdmn3RR0
NewSheetイベントの引数の場合、Shには
「Worksheet オブジェクトまたは Chart オブジェクトが渡されます」
と書いてあるので
どっちが渡されてもいいようにObjectなのでしょう
0231デフォルトの名無しさん (ワッチョイ 778b-utq/)垢版2017/07/12(水) 21:55:54.59ID:vG3FHDEt0
She As Object
Set She = New LoveDoll
She.DressUp(MaidCostume)
She.Attach(SilliconVagina)
I.Fuck(She)
I.FinishAlone()
She.Detach(SilliconVagina)
I.Wash(SilliconVagina)
0234デフォルトの名無しさん (アークセー Sx39-y19a)垢版2017/07/13(木) 06:37:01.82ID:zrnYEEn3x
NewSheetイベントの引数ShがObject型なのは、WorkSheetクラスとChartObjectクラスの両方でNewSheetイベントの呼び出しが定義されていて、実行時にしかShの型が決まらないからだと思うが
Workbook.Sheets(Index)の戻り値がObject型なのと一緒
0236デフォルトの名無しさん (ワッチョイ 6e1b-MRQN)垢版2017/07/13(木) 13:12:36.23ID:9SrccZi40
指定日(A)から現時点(B)までの経過時間をミリ秒で取得したい場合、
どのようにしたら上手く取れるでしょうか?
VB.NETの時はGetTimeMillisecondsがあったので、(B-A).GetTimeMillisecondsで取得出来たんですが。
0238デフォルトの名無しさん (ワッチョイ 6e1b-MRQN)垢版2017/07/13(木) 13:36:43.69ID:9SrccZi40
>>237
ありがとうございます。
GetTickCountも試してはみたんですが、システム稼働してからの時間だからか
自分では上手く取得できませんでした。
「指定日」(今回やりたいのは1970/1/1)からの経過時間をミリ秒取得するには
どのようにしたら良いでしょうか?
0242デフォルトの名無しさん (ワッチョイ f191-+gV6)垢版2017/07/13(木) 20:31:54.44ID:kGwztgTZ0
>>236
timediff()関数だかdifftime()があったはず
0243デフォルトの名無しさん (ワッチョイ f191-+gV6)垢版2017/07/13(木) 20:34:22.33ID:kGwztgTZ0
datediff()だった
ただ秒単位が最小だった
0246デフォルトの名無しさん (ワッチョイ f191-+gV6)垢版2017/07/13(木) 21:37:03.54ID:kGwztgTZ0
指定日から当日までをdatediffの秒単位で取得して
当日からその時刻までをmsで取得して
足し合わせればいいんじゃね
0253デフォルトの名無しさん (ワッチョイ c491-BaGs)垢版2017/07/14(金) 22:29:36.70ID:Ry5eHGcV0
そういやみなさん
その場限りの適当マクロじゃなくて
ずっと使い続けてメンテも必要なVBAでセルにアクセスするなら名前経由でやってます?

自分はまずセルに名前をつけて
Const hoge = "セルにつけた名前"
Range(hoge).value = "うんこ"

みたいなことやってます
ちなみに、シート名でもこれやってるんですが‥

シート名やセル名が変わる可能性を前提にしたら
こういうアプローチになるとは思うんですけど
結局凄く無駄なことをやってる気がして…(結局変えることあんまないし)

特にセルの名前に関しては、どうせその文字列をConstのところにハードコードするなら
名前つけずに
Const hoge ="A1:B5"
でもええやんけとか思ってるんですが
行挿入とかに追従してくれる名前の方を使うべきかなぁとか思ったり…
0255デフォルトの名無しさん (ワッチョイ f191-+gV6)垢版2017/07/14(金) 23:03:04.97ID:QoWI5XEA0
>>253
セルに文字列で意味をつけて
その文字列を検索して特定する
そのセルからのオフセットを固定しておく

例えば列名とか行名とか
0256デフォルトの名無しさん (ワッチョイ 0a23-z+eH)垢版2017/07/14(金) 23:10:22.98ID:P3iXCzVv0
>>253
よくある表の列の増減対応する場合は
列挙体で列名を定義しておいて
Cellsで列名を参照させてる。
途中にぶっこんでも列挙体のほうをちょろっと書き換えればいい。

行にも対応させると、面倒かも。
0257デフォルトの名無しさん (ワッチョイ 626f-S4qQ)垢版2017/07/14(金) 23:41:07.46ID:ont4yiQP0
>列の増減

会社のやつ、一切弄れないようにしたわwwwww
セルを保護するとかじゃなくて、
データの更新時に、全消しして再描画するのwwwwwwwwww
列挿入とかしても無駄ですよってwwwwwww
0258デフォルトの名無しさん (ワッチョイ e66d-qA4N)垢版2017/07/15(土) 00:03:43.14ID:fdp++JjU0
そういうの、このスレだと基本だと思う
・正規化したデータを引っ張ってくる
・ボタン押したらvbaで構築。シートすら削除して再作成
こんなんばっかだろ。誰もさわれなくて非難轟々だけど、どうかんがえてもこっちのほうが安全なんだよな
0262デフォルトの名無しさん (ワッチョイ f191-+gV6)垢版2017/07/15(土) 04:37:45.96ID:7LAckzVN0
>>256
コードをいじらないといけないじゃないか
0263デフォルトの名無しさん (ワッチョイ f191-+gV6)垢版2017/07/15(土) 04:53:42.10ID:7LAckzVN0
>>258
データの更新自分しか出来ないんじゃね

参照しか出来ないならwebシステムにすればいいんじゃね
0265デフォルトの名無しさん (ワッチョイ aa11-OTuW)垢版2017/07/15(土) 09:43:36.21ID:jhhap/jh0
>>253
> ずっと使い続けてメンテも必要なVBAでセルにアクセスするなら名前経由でやってます?
状況次第だけどよくアクセスするとか重要なセルは適当なところでまとめて変数に代入してる
Dim hoge As Range
Set hoge = Range("A1")
...
hoge.value = "うんこ"

> 行挿入とかに追従してくれる名前の方を使うべきかなぁとか思ったり…
行とか列の挿入を想定するなら名前をつけてそれで参照する
ユーザーが作成するようなシートなら特定の文字列を検索して場所を特定するとかもやる
0266デフォルトの名無しさん (ワッチョイ f191-+gV6)垢版2017/07/15(土) 09:44:21.75ID:7LAckzVN0
>>264
自分に権限がないなら権限を持ってる人に許可貰えばいいだけじゃね?

なんの権限か不明だが
0267デフォルトの名無しさん (ワッチョイ f191-+gV6)垢版2017/07/15(土) 10:08:30.41ID:7LAckzVN0
>>258
批難がでるって事は不便な点とかがあるって事で
仮にそれが商品だとしたら売れない可能性があるってこと

競争相手がいたら使われなくなる商品
0269デフォルトの名無しさん (ササクッテロラ Sp72-+gV6)垢版2017/07/15(土) 11:48:46.46ID:CRqbHh/Cp
>>268
売れないなら批難は出ないと言う主張なら
批難轟々なら売れるって事だよな

じゃ売ってみればいいんじゃね?
0270デフォルトの名無しさん (ササクッテロラ Sp72-+gV6)垢版2017/07/15(土) 11:50:44.37ID:CRqbHh/Cp
>>268
それは代替品がある場合だ
その代替品に乗り換えれば済むから

社内とかの代替品がなければ嫌々でもそれを使うしかない
0273デフォルトの名無しさん (ワッチョイ 4b3d-1CH6)垢版2017/07/15(土) 17:34:03.53ID:0urlci1o0
VBAのマクロって

・マクロ制作者本人の操作を補助する為のものであり、他人に使わせる事は想定されていない
・オフィス製品の操作を補助する為のものであり、アプリケーションの本来の振る舞いを超えた動作は想定されていない
・ユーザーフォームはマクロの操作を容易にする為のものであり、別のアプリケーションであるかの様に振る舞う事は想定されていない

なので想定されていないものを作ろうとしたら不便さを感じるのは当然
どんな言語もそうだけど、想定された使い方なら便利だし、そうでないなら不便だよ
0274デフォルトの名無しさん (ワッチョイ c491-BaGs)垢版2017/07/15(土) 17:40:17.34ID:Id32lc0P0
>>255
なるほど
例えば
○年○月 の○のセルを指定する際に
「年」のセルを探してOffset(0,-1)する、みたいな感じですかね
自分はこれも名前つけて管理してましたが
セルが1つの場合はそれで良さそうですね
ただ、全く同じ内容のセルが検索範囲にないことが保証された運用にしないとバグりそうなのでちょっと怖いかも


>>256
表に対してレコードセットみたいなアクセスをしたい場合に
つい最近その方法を知って目からウロコでした
とにかくインテリセンスを効かせたい派なので・・
http://thom.hateblo.jp/entry/2015/12/17/000132
こういうことですよね

行方向に関しては、列のように各行に別々の意味を持たせるような使い方はしたことないので
問題ありませんね

>>261
自分は簡単なSQLを作る(ANDとかORで結合するだけ)に特化したStringBuilderみたいなのだけ使ってますね

>>265
やっぱ可変範囲のこと考えると名前つけるのは意味ありますよね
0275デフォルトの名無しさん (ワッチョイ c491-BaGs)垢版2017/07/15(土) 17:47:17.89ID:Id32lc0P0
>>273
>他人に使わせる事は想定されていない
これは本当に思いますね
Accessなんかはフォームでの入出力が基本だし
各データの型も指定するから
出来ること出来ないことを設計者が細かく指定しやすいですが
Excelは書式や入力データを限定させようとすると
そのノウハウの習得のことも考えたら相当な時間がかかる気が…

以前「値のみの切り取り・コピーしかできない」ようにしようとして
えらい苦労しました
0276デフォルトの名無しさん (ワッチョイ 926f-MRQN)垢版2017/07/15(土) 20:37:21.43ID:VxLYhzBT0
所詮道具 しかし便利な道具 それをよりによってなんで使い辛くするのか 神経を疑うわ
改変、改ざん、変更がダメならそっちに注力すべきだろ
バックアップなりPDF出力なり変更者・変更ヶ所の記録なりなんなり
余計な仕事して会社の利益を浪費すんなよ
0277デフォルトの名無しさん (アウアウウー Sa08-6eVw)垢版2017/07/15(土) 20:57:08.80ID:4AnbxIb9a
Excel VBA一本で家族養って食っていけてる人いる?
0289デフォルトの名無しさん (ドコグロ MM02-KaH7)垢版2017/07/16(日) 19:14:48.07ID:zK8m4MiwM
>>287
うん。
50万ぐらいのレコードを扱う、MySqlをバックエンドとしたC/S型のシステム作ったよ。

vbaは例外ハンドラが弱すぎて、自作スタックトレースみたいな仕組みを作ったりとか、バージョン管理大変だし、vbaでシステム開発は怖すぎてやりたくないっす。

初速はいいけど、規模が大きくなってくると生産性が著しく落ちるねー。
0293デフォルトの名無しさん (オッペケ Srd7-OYLW)垢版2017/07/17(月) 18:01:49.57ID:eqSf35i7r
はぁ?
0301デフォルトの名無しさん (オッペケ Srd7-Ucbr)垢版2017/07/17(月) 20:12:26.22ID:7pjXcMGRr
馬鹿の一つ覚えみたいに、なんでもかんでも変数に入れちゃうし、しかもいまだにハンガリアン記法だったりする。
エラー対策もバッチリですと言わんばかりにエラー処理が延々と続くコードを晒す。
ただでさえ冗長な言語なのに輪をかけて冗長なコードを書く。
誰もお前のコードなんかコピペしねーからコアな部分だけを簡潔にかけ、と言いたくなる。
VBAが書けるぐらいでエンジニアづらするな。
0309デフォルトの名無しさん (ワッチョイ ef11-+gV6)垢版2017/07/17(月) 20:54:22.06ID:ZHV5JA270
エンジニアかどうかってプログラム言語に依存する概念だっけ?
実現手段なんかコロコロ変わるのに
0314デフォルトの名無しさん (ワッチョイ 5ce3-z+eH)垢版2017/07/17(月) 21:38:42.01ID:xDa7p7Qa0
ExcelVBAの挙動が謎すぎて困る
IF xx IS NOT NULL AND xx.value = 100
みたいので例外出たときは目を疑った

nullのときも両辺評価するって決まってるならまだしも
普段は何事もなく動いてるのに
急に気まぐれに両方評価するのやめーや…
0330デフォルトの名無しさん (スッップ Sd70-QKFr)垢版2017/07/18(火) 00:17:38.11ID:kpygt+jXd
nullの話出たから聞きたいんだけどnullとかnothingの判定を完結にやるいい方法ってないの?
やりたいのはnull,vbnull,nothing,emptyなどなど値が入ってない状態を検知したい

全部if elseifでやるのは汚すぎるからあまりやりたくない
0331デフォルトの名無しさん (ワッチョイ f191-+gV6)垢版2017/07/18(火) 00:18:33.82ID:sD2l3tVa0
>>330
全部調べる関数を作ればいいのでは?
0340デフォルトの名無しさん (オッペケ Srd7-Ucbr)垢版2017/07/18(火) 07:42:58.67ID:StSxL3ktr
こんな感じかな。

Function IsNone(hoge) as Boolean
  Select case True
    Case IsNull(hoge)
      IsNone = True
    Case IsEmpty(hoge)
      IsNone = True     
    Case hoge is Nothing
      IsNone = True
    Case hoge = ""
      IsNone = True
    Case hoge = vbnullstring
      IsNone = True
    Case Else
      IsNone = False
  End Select
End Function
0345デフォルトの名無しさん (オッペケ Sr39-nv+z)垢版2017/07/18(火) 12:19:29.42ID:1XJz7Xgqr
どうせ自称VBAに詳しいクズと自称メインは他言語のクズしかいないんだから仲良くしろよ
0349デフォルトの名無しさん (オッペケ Srd7-Ucbr)垢版2017/07/18(火) 20:30:12.85ID:StSxL3ktr
>>348
もちろん自由に使えばいいけど、スマホで書いてるのでPCテストしてない。自己責任でよろしく。

読み返したら、Is Nothing のところは明らかにエラーになると思うので、こんな感じのほうがいいかも。(PCテストしてないので自信はない。あしからず)

Function IsNone(hoge) as Boolean
  If IsObject(hoge) Then
    If hoge Is Nothing Then IsNone = True
  End If
  Select case True
    Case IsNull(hoge)
      IsNone = True
    Case IsEmpty(hoge)
      IsNone = True
    Case hoge = ""
      IsNone = True
    Case hoge = vbnullstring
      IsNone = True
    Case Else
      IsNone = False
  End Select
End Function

なんか美しくないね。
ま、好きなように書き換えて。
0353デフォルトの名無しさん (ワッチョイ 6fea-N0vF)垢版2017/07/18(火) 21:59:56.82ID:jNcdEVA90
ExcelからOutlookを起動し、予定表から会議依頼を作成するマクロを作成しています
あらかた思っていたものは作れたのですが、自分の予定表ではなく共有の予定表に保存する場合のコードがさっぱり分かりません
共有の予定表での作成方法をご教示頂けますでしょうか
0355デフォルトの名無しさん (オッペケ Srd7-Ucbr)垢版2017/07/19(水) 00:59:23.29ID:r34rJ2pSr
>>354
おっしゃるとおり。
あるいは、Select以下をElseでつなげるか。

でも美しくないので書き換えてみた。
結構いいんじゃね?(軽くテスト済み)

結局、>>333 が最適解だったわけね。
なかなかの実力者とみた。

Function IsNone(hoge) As Boolean
  Select Case VarType(hoge)
    Case vbEmpty, vbNull
      IsNone = True
    Case vbObject
      If hoge Is Nothing Then IsNone = True
    Case vbString
      If hoge = vbNullString Or hoge = "" Then IsNone = True
    Case Else
      IsNone = False
  End Select
End Function
0356デフォルトの名無しさん (ワッチョイ f191-+gV6)垢版2017/07/19(水) 02:45:10.33ID:3ENxF81t0
>>355
isNoneが未定になるパスがあるんじゃね
0358デフォルトの名無しさん (ワッチョイ 974b-+vhE)垢版2017/07/19(水) 05:14:51.84ID:uwa7S77b0
>>355
Sub buf()
On Error Resume Next
For i = 1 to n
Set MyObj = SPAM
If Err then
If not IsNone(SPAM) then Brake
Else
Goto Continue
End if
Else
ここで処理。
Continue:
Err.clear
Set MyObj = Nothing
End if
Next
End sub

みたいな使い方を考えたんですが、全然美しくない・・・
どうすれば良いでしょうか。
0364デフォルトの名無しさん (ワッチョイ 4b3d-1CH6)垢版2017/07/19(水) 12:01:18.52ID:pHR1WedN0
どういうものを実装するかにもよるけど経験から言うと配列の判定は別の方がいい。
アプローチの仕方が違うから、変数単体で認識させていたものを配列突っ込める様にした時なんかにバグの温床になる。
0367デフォルトの名無しさん (オッペケ Sr5f-nv+z)垢版2017/07/19(水) 12:28:40.18ID:oLf4rjVBr
variant型は脊髄反射で否定するくせにvariantみたいなヤリマン関数が大好きなお前らってw
0369デフォルトの名無しさん (ワッチョイ 4b3d-1CH6)垢版2017/07/19(水) 14:51:31.77ID:pHR1WedN0
前スレかその前かの最後の方でVariant型絶対使わないマン出てきていた様な気がするけど。

そういう信条自体は別に良いんだけど、Variant型使えば解決出来る事を信条のせいで解決出来ず、
その結果として「VBAは欠陥」って言い出す変な人はこのスレでよく見かける。
0373デフォルトの名無しさん (オッペケ Srd7-Ucbr)垢版2017/07/19(水) 18:31:39.20ID:r34rJ2pSr
>>364-365
配列は要素数の空判定でお茶を濁そう。

これ以上のブラッシュアップは断念。
コードとしてはそこそこ美しいと思う。

Function IsNone(hoge) As Boolean
  Select Case VarType(hoge)
    Case vbEmpty
      IsNone = True
    Case vbNull
      IsNone = True
    Case vbObject
      If hoge Is Nothing Then IsNone = True
    Case vbString
      If hoge = vbNullString Or hoge = "" Then IsNone = True
    Case vbArray + vbVariant
      If Ubound(hoge) = -1 Then IsNone = False
  End Select
End Function
0374デフォルトの名無しさん (オッペケ Srd7-Ucbr)垢版2017/07/19(水) 18:35:56.55ID:r34rJ2pSr
訂正。最後、Trueだった。。(^_^;)

Function IsNone(hoge) As Boolean
  Select Case VarType(hoge)
    Case vbEmpty
      IsNone = True
    Case vbNull
      IsNone = True
    Case vbObject
      If hoge Is Nothing Then IsNone = True
    Case vbString
      If hoge = vbNullString Or hoge = "" Then IsNone = True
    Case vbArray + vbVariant
      If Ubound(hoge) = -1 Then IsNone = True
  End Select
End Function
0375デフォルトの名無しさん (ワッチョイ 4b3d-1CH6)垢版2017/07/19(水) 18:47:58.49ID:pHR1WedN0
>>373
Function IsNone(hoge) As Boolean
  Select Case VarType(hoge)
    Case vbEmpty,vbNull
      IsNone = True
    Case vbObject
      If hoge Is Nothing Then IsNone = True
    Case vbString
      If Len(Trim(hoge)) = 0 Then IsNone = True
    Case Is >= vbArray
      IsNone = True
  End Select
End Function

ArrayはVariant型以外の場合もあるから、この方がいい。
0384デフォルトの名無しさん (ワッチョイ 4b3d-1CH6)垢版2017/07/19(水) 20:28:12.28ID:pHR1WedN0
>>382
うろ覚えだけどVarTypeでvbArrayとして返ってきた場合でもUboundするとエラーになるケースがあったはずなので、
Uboundを使う場合は別関数でOn Error Gotoで飛ばせるようにしておきたい。

Function SafeUBound(hoge, Optional div As Long) As Long
On Error GoTo fin
If div = 0 Then div = 1
SafeUBound = -1
SafeUBound = UBound(hoge, div)
fin:
End Function

Function SafeLBound(hoge, Optional div As Long) As Long
On Error GoTo fin
If div = 0 Then div = 1
SafeLBound = 0
SafeLBound = LBound(hoge, div)
fin:
End Function

と置いてSafeUbound < SafeLBoundで判定したい。
0385デフォルトの名無しさん (オッペケ Srd7-Ucbr)垢版2017/07/19(水) 20:38:22.51ID:r34rJ2pSr
一応簡単なテストコード的な…

hoge = Range("A1").Value: Debug.Print IsNone(hoge) & ":" & VarType(hoge)
hoge = InputBox("値を入力してください。"): Debug.Print IsNone(hoge) & ":" & VarType(hoge)
Set hoge = Sheets(1): Debug.Print IsNone(hoge) & ":" & VarType(hoge)
Set hoge = Nothing: Debug.Print IsNone(hoge) & ":" & VarType(hoge)
Set hoge = CreateObject("InternetExplorer.Application"): Debug.Print IsNone(hoge) & ":" & VarType(hoge)
hoge.Quit
Set hoge = Nothing: Debug.Print IsNone(hoge) & ":" & VarType(hoge)
hoge = Array(): Debug.Print IsNone(hoge) & ":" & VarType(hoge)
0391デフォルトの名無しさん (ワッチョイ f191-+gV6)垢版2017/07/19(水) 23:08:15.46ID:3ENxF81t0
>>386
無い
作れば?
0393デフォルトの名無しさん (ワッチョイ 4b3d-1CH6)垢版2017/07/19(水) 23:39:04.83ID:pHR1WedN0
>>392
ああ、やっぱりそういう方法しかないのね。

元々がIf文を可能な限り使わないというところから出発しているし、
それだとIf Else使った方が処理も速いしSelect文で読みやすくするっていう利点も潰してるんだよな。
0395デフォルトの名無しさん (オッペケ Sr1b-QbI6)垢版2017/07/20(木) 01:36:37.21ID:IzREkzShr
やはり、配列の空判定は別関数にしたほうが良さそうだね。

Function IsNone(hoge) As Boolean
  Select Case VarType(hoge)
    Case vbEmpty, vbNull
      IsNone = True
    Case vbObject
      If hoge Is Nothing Then IsNone = True
    Case vbString
      If Len(Trim(hoge)) = 0 Then IsNone = True
    Case Is >= vbArray
      If ArrayEmpty(hoge) Then IsNone = True
  End Select
End Function

Function ArrayEmpty(hoge) As Boolean
  美しいコード
End Function
0396デフォルトの名無しさん (オッペケ Sr1b-QbI6)垢版2017/07/20(木) 01:50:57.43ID:IzREkzShr
>>384を使って、

Function ArrayEmpty(hoge) As Boolean
  If SafeUbound < SafeLBound Then ArrayEmpty = True
End Function

Function SafeUBound(hoge, Optional div As Long) As Long
On Error GoTo fin
If div = 0 Then div = 1
SafeUBound = -1
SafeUBound = UBound(hoge, div)
fin:
End Function

Function SafeLBound(hoge, Optional div As Long) As Long
On Error GoTo fin
If div = 0 Then div = 1
SafeLBound = 0
SafeLBound = LBound(hoge, div)
fin:
End Function

う〜〜ん、、、いまいち美しくない…orz
0397デフォルトの名無しさん (オッペケ Sr1b-QbI6)垢版2017/07/20(木) 02:11:18.92ID:IzREkzShr
>>394
> 単に空チェックだけなら

Len(Trim(hoge)) = 0

で事足りてるような気はする。

イミディエイトウィンドウでテストしてみて。

? Len(Trim(InputBox("値を入力してね"))) = 0

[OK][キャンセル]どちらでも True が返る。
0398デフォルトの名無しさん (ワッチョイ 473d-pqVL)垢版2017/07/20(木) 02:46:26.38ID:2lo8GEfG0
>>396
Function RBound(hoge, Optional div As Long) As Long
On Error Resume Next
If div = 0 Then div = 1
RBound = UBound(hoge, div) - LBound(hoge, div) + 1
End Function

あくまで配列要素数があるかどうかだけ判断したいなら、こういう関数でもいいと思うけど。
0399デフォルトの名無しさん (オッペケ Sr1b-QbI6)垢版2017/07/20(木) 07:38:01.83ID:IzREkzShr
>>398
おおー、だいぶスッキリしたね。

ひとつ残念なのは、引数の次元指定が美しくないんだよなー。

つか、1次元の要素が空の配列なんて使う?
1次元が空かどうかだけ判定すればいいんじゃね?
0409デフォルトの名無しさん (オッペケ Sr1b-QbI6)垢版2017/07/20(木) 18:17:53.32ID:IzREkzShr
ま、配列の空判定関数は各自で書くということでこの話題は完結かな。

ちなみに俺は、

Function ArrayEmpty(hoge) As Boolean
  On Error Resume Next
If UBound(hoge) - LBound(hoge) < 0 Then ArrayEmpty = True
End Function

って感じ。

空判定関数を書くというだけの話題だったけど、いろいろ勉強になったね。

おつかれさまー。ノシ
0416デフォルトの名無しさん (オッペケ Sr1b-QbI6)垢版2017/07/20(木) 20:27:30.52ID:IzREkzShr
>>413
どこに残せばいいの?

完成品はこれでいいかな。

Function IsNone(hoge) As Boolean
  Select Case VarType(hoge)
    Case vbEmpty, vbNull
      IsNone = True
    Case vbObject
      IsNone = hoge Is Nothing
    Case vbString
      IsNone = Len(Trim(hoge)) = 0
    Case Is >= vbArray
      On Error Resume Next
      IsNone = UBound(hoge) < LBound(hoge)
  End Select
End Function

簡潔で美しいね。みんなの力の結晶だ。
0418デフォルトの名無しさん (ワッチョイ 473d-pqVL)垢版2017/07/20(木) 23:07:38.62ID:2lo8GEfG0
スレッドのテンプレに残しておいてほしいって事なんじゃないの。
でも残し始めたら際限無くなるし、コピペで済ませずに理論と意図を理解して同じものを一から書けるようになってほしいなぁ。
0420デフォルトの名無しさん (オッペケ Sr1b-8ndb)垢版2017/07/21(金) 12:22:10.00ID:vdvVccQ6r
こんなコードテンプレに残したらますます初心者が初心者を惑わすスレに拍車がかかるなw
本当に仕事でエクセルマクロを必要としてる人には迷惑かけんなよw
0426デフォルトの名無しさん (ワッチョイ 473d-pqVL)垢版2017/07/21(金) 15:28:32.09ID:4zV211iR0
どの言語の質問スレも初心者が初心者を惑わすスレ化してるのが悲しい。
「よくある質問と回答」レベルなら問題ないんだけど、ちょっと突っ込んだ質問になるととたんに雲行きが怪しくなる。

ある程度の実力を身につけたら2chじゃなくてちゃんとしたコミュニティか何かに参加するべきなんだろうけど、
だいたい見つからないし、見つけても2chほど気軽に質問投げられるような場所じゃなかったりするんだよな。
0428デフォルトの名無しさん (ドコグロ MM9f-efHF)垢版2017/07/21(金) 19:35:15.46ID:tSBq1lkVM
>>426
ネットの情報なんだから裏を取ればいいだけ
今時書いてあるキーワードでググれば調べるのもそんなに苦労しないしな
惑わされるより過疎化してまともな回答が少なくなってる方が問題だわ
0435デフォルトの名無しさん (オッペケ Sr1b-QbI6)垢版2017/07/21(金) 20:10:04.71ID:xN3mSVPqr
>>433
使ったことある人が多い言語って底辺扱いされやすいよね。

おそらく、C や Java の比じゃないと思うよ。>VBA

でも、Java は使う人が多くなりつつあるから、底辺扱いされるのは時間の問題かもね。
0436デフォルトの名無しさん (ワッチョイ 473d-pqVL)垢版2017/07/21(金) 20:58:10.67ID:4zV211iR0
新興の言語って利用者全員が似たような習熟度だから意思疎通が図りやすいし、
どんなにクソみたいなコード書いても判断材料が無くて効率的なコードって言ってもらえるからな。
0443デフォルトの名無しさん (ワッチョイ bf23-E/h9)垢版2017/07/21(金) 22:16:02.62ID:gUUF92OH0
JavascriptにおけるjQuery的な
VBAのクラスってどっかにないのかな

Set class = New class
class.lastRowAdd(Range("a1"),array)
ってやったら最終行に配列の内容をぶっ込んでくれる
とか
よくある操作をパラメーター渡せばやってくれるような
0451デフォルトの名無しさん (ワッチョイ c78b-8ndb)垢版2017/07/22(土) 00:10:10.03ID:uAFmR2/H0
そんな事言わずにもう少しひっぱろうぜ
0453デフォルトの名無しさん (ワッチョイ df11-pqVL)垢版2017/07/22(土) 10:25:51.44ID:8D42j0aL0
>>452
そういう話ではない。

まあでもVBA用の色んな処理の検索はしてきたけど、アドイン化されてるものは全然見かけないなあ。
汎用的な機能を詰め込んだアドインってこれくらい?
http://software.opensquare.net/relaxtools/
>>443の求めるものとは違うんだろうけど。

結局は自作クラスってことになりそう。
0457デフォルトの名無しさん (スップ Sdff-dGk5)垢版2017/07/22(土) 12:11:05.98ID:I23HDuqEd
完成した関数テンプレにのこしておいてよ
vbaの良質なコードはすごく希少だしアドインってメンテナンス大変じゃないか?
用途としてはいろんな人に使わせる用だと思うんだけど誰かが使ってる最中に変更できないじゃん
やたらにバージョン上げると某ライブラリみたいな顛末になるし
0463デフォルトの名無しさん (オッペケ Sr1b-QbI6)垢版2017/07/22(土) 17:08:46.19ID:AfU+LLGPr
>>460
> vbaは一切進歩せんからなあ

エンジニアのための言語じゃないからね。

Dim だの Set だの If Then だの、
うんざりするのはしょうがないとしても、

objFSO

なんていう変数を見た日にゃ、
ぶっ殺したくなるね。
0468デフォルトの名無しさん (ワッチョイ df6f-QK4i)垢版2017/07/22(土) 21:16:12.56ID:yBUCBb6t0
初めてADOっての使ったけど、なんだこりゃ。

MSQueryと違って、列名が出ないじゃん。
いや、ヘッダのON・OFFで無理矢理出せるけど、
そうするとUnionした時に、レコードの途中に列名が出やがる。(列名扱いされないから?)
列名は、出力位置の上に、予め書いとかなきゃいけないの?
0472デフォルトの名無しさん (ワッチョイ a791-8s/R)垢版2017/07/22(土) 23:56:17.15ID:IXNocUxm0
>>468
列名も取れる
0475デフォルトの名無しさん (ワッチョイ e711-MZAo)垢版2017/07/23(日) 11:44:10.83ID:MDDS7K/i0
>>469
コレクションて値の出し入れできなかったりするじゃん?
値の追加、挿入、削除、入れ替え、ソートあたりメソッドにしたクラスだね
型は安全に出来ないけどなかなか便利
objectにも対応させたいけどやや面倒だから手を付けてない
0480デフォルトの名無しさん (アウアウエー Sa9f-MZAo)垢版2017/07/24(月) 08:13:01.75ID:2edahxxPa
>>479
継承できればコレクションからゴニョゴニョした方がいいんだろうけど
どうでも良いけど値の入れ替えのメソッド名をRepracementにしてるんだけどなんかしっくりこないんだよね
なんかいいのないかな
0495デフォルトの名無しさん (ワッチョイ 4791-2faK)垢版2017/07/25(火) 22:08:51.03ID:8cBHpzox0
>>493
.netのクラス使えないのかな?って以前ググったときに
http://officetanaka.net/excel/vba/tips/tips98.htm
が引っかかって
えらい簡単に使えるんだなぁと思ったんだけど
思っただけで使ったことないし
細かいことも知らない…
ていうか、本当にいろいろ便利に使えるなら
ググるだけでバンバン情報引っかかっていいと思うんだけど
ArrayListのことくらいしか出てこんかった
0496デフォルトの名無しさん (アウアウエー Sa9f-MZAo)垢版2017/07/25(火) 22:30:18.63ID:k4b2Lxa9a
>>490
ブックをそのままラップしたクラスとか作りたいときにパス指定するためのメソッドわざわざ実装するのとかクソめんどくさいじゃん
結構引数指定したい場面あるよ
逆になんで引数渡せないのかという
0499デフォルトの名無しさん (ワッチョイ dfaa-E/h9)垢版2017/07/25(火) 23:01:14.52ID:Vr2PvTdG0
それもそうだけどクラスを含むプロジェクトを参照しているモジュールからそのクラスのインスタンスを
直接Newで作れないのにも困ってる。
Create〜系の関数を書いて置き場所に迷う場合が特に。
0500デフォルトの名無しさん (ワッチョイ df6f-QK4i)垢版2017/07/25(火) 23:03:35.24ID:6CdgJbJQ0
仮にC#使いだったとしても、VBA覚えるわ。
VBAにある機能をどれくらいカバーしているのか。
99%以下ならイラネ。

ていうか、そもそもどういう仕様だろう。
C#で書いたのを、内部的にVBAに翻訳して標準モジュールに書き込むとかだったら笑う。
0508デフォルトの名無しさん (ワッチョイ df11-pqVL)垢版2017/07/26(水) 00:11:51.48ID:U77Cst6m0
質問です。
Excel2007ですけど、複数のオートシェイプをグループ化せずに同時にカットできますか?
オートシェイプを選択してSelection.Cutメソッドを実行すると、なぜかセルがテカテカするのです。
ShapaRangeオブジェクトにはCutメソッドが無いみたいですし。
とりあえずSendKeys "^x"で対処してるけどなんだかなあ、という状況です。
0516デフォルトの名無しさん (ドコグロ MMfb-efHF)垢版2017/07/26(水) 07:04:52.98ID:2BL9ZNyZM
>>495
> http://officetanaka.net/excel/vba/tips/tips98.htm
> が引っかかって
> えらい簡単に使えるんだなぁと思ったんだけど
これは知らなかったわ、教えてくれてありがとう

> ていうか、本当にいろいろ便利に使えるなら
> ググるだけでバンバン情報引っかかっていいと思うんだけど
> ArrayListのことくらいしか出てこんかった
ちょっとググったらCOM経由で動くみたいね(CreateObject で作成するんだから当たり前か)
http://qiita.com/mima_ita/items/efcd1a6ea86f09047984
0520デフォルトの名無しさん (オッペケ Sr1b-QbI6)垢版2017/07/26(水) 07:52:21.56ID:o5MQIZHRr
>>518
既存のVBAコードに、C#で書いたプロシージャを呼び出すコードを追加することはできないよね。

VBAで書いたWinのExcelマクロはMacのExcelでも使えるけど、C#で書いたらMacでは使えないよね。
0522デフォルトの名無しさん (ワッチョイ 4791-2faK)垢版2017/07/26(水) 07:58:49.22ID:PoLK+oD40
VBAはもう言語仕様をアップデートするつもりはないんだろうけど
せめてIDEくらいはもうちょっと便利にして欲しい

>>516
つまり相互運用の登録がされているライブラリは使えるってことか
でもいちいち自分でdll作ってまでは使わないかなぁ…
0525デフォルトの名無しさん (ワッチョイ 473d-pqVL)垢版2017/07/26(水) 09:40:24.60ID:19gyZHTT0
>>522
dllを作るってどういう状況で必要になるのかよく分からんよな。

別途用意する必要があるって事は他人に使わせるのに難があるし、
VSTO使えるならVSで他の言語使った方が早い場面が多いだろうし、
自作のdllが必要になるような処理をVBAに求める場面というのが想像出来ない。
0529デフォルトの名無しさん (ワッチョイ 473d-pqVL)垢版2017/07/26(水) 11:43:09.73ID:19gyZHTT0
VBAをクソクソ言っている人たちはどういう立場なんだろうな。
クソだと思うなら近づかなければいいのに。

なんか他の言語でもメインで使い始めた途端にクソクソ言いそう。
0537デフォルトの名無しさん (アウアウエー Sa9f-MZAo)垢版2017/07/26(水) 13:40:18.49ID:nObVd20Fa
クソだけどofficeのマクロ言語はこれしかないから仕方なく使うしか無いだろ
プログラム言語としては時代遅れの化石なのはさすがに共通認識だと思ってたわ
現状くそなのもそうだし、これから先進化することも決してないこともクソ
あと、手軽さと高度な機能は別に共存できるでしょ
0540デフォルトの名無しさん (JP 0H4f-QK4i)垢版2017/07/26(水) 14:27:35.77ID:+1cN/gIlH
>>527
> オブジェクト指向にドップリしてたら使いにくいことこの上ないと思うし
俺は逆だと思うよ

オブジェクト指向をよく知ってたほうが、VBAを使いこなせる
・クラスモジュールを使いこなす
・いわゆる「インタフェース継承」を使いこなす
・WithEventsを使いこなす
大抵の奴は「クラスモジュールっていつ使うんですか」レベルだから
0541デフォルトの名無しさん (アウアウエー Sa9f-MZAo)垢版2017/07/26(水) 15:11:24.07ID:ZPUGQ/usa
>>540
俺の言いたいことを一ミリも汲んでくれてないなw
そりゃオブジェクト指向的なプログラミングを知ってれば非オブジェクト指向言語でも構造的に自然と書くようになる
それとこれとは別の話
機能がないからわざわざ自分で作らにゃいかんから不便だって話をしてる
0542デフォルトの名無しさん (ワッチョイ df06-pqVL)垢版2017/07/26(水) 16:52:15.43ID:6VvQXdi20
この手の下らんやり取りはこれまでもあったし、これからもウンザリするほど続くんだろうなぁ┐(´д`)┌ヤレヤレ
0543デフォルトの名無しさん (オッペケ Sr1b-QbI6)垢版2017/07/26(水) 18:04:37.55ID:o5MQIZHRr
>>539みたいに、自演自演て騒ぐ奴をしばしば見かけるけど、彼は何がしたいの?

つか、そもそもここは自演ができないスレなんだよね?

こういうのはスルーしたほうがよいのでしょうか。
0544デフォルトの名無しさん (ササクッテロル Sp1b-8s/R)垢版2017/07/26(水) 18:16:40.16ID:VQAVDfi4p
>>541
オブジェクト指向と機能は別の概念だけどな
機能は言語がなんであっても追加出来るだろうし
オブジェクト指向は言語に関する概念だから
0547デフォルトの名無しさん (ササクッテロル Sp1b-8s/R)垢版2017/07/26(水) 18:41:04.50ID:VQAVDfi4p
>>545
設計と言語両方じゃね?
0551デフォルトの名無しさん (ワッチョイ a791-8s/R)垢版2017/07/26(水) 19:42:18.93ID:W1HWCg900
>>549
状態を持つ⇒オブジェクトを使う
対偶は
オブジェクトを使わない⇒状態を持たない

対偶は必ず真とはいえなくない?
0552デフォルトの名無しさん (ドコグロ MM9f-efHF)垢版2017/07/26(水) 19:45:32.31ID:pjdGyN9QM
>>548
ログクラスとか作ってたな
書き込むシートと書き込む行を別々に管理するのは嫌だったから
でも継承もできないしコンストラクタの引数も持てない状況ではあまり使いやすくならないし結局クラスはほとんど使わない
そもそも俺がずっと保守するわけにもいかんから
0553デフォルトの名無しさん (ワッチョイ 473d-pqVL)垢版2017/07/26(水) 19:45:44.80ID:19gyZHTT0
>>547
オブジェクト指向言語は「オブジェクト指向的な設計が可能な言語」の事だから、
言語によってオブジェクト指向が決まるわけではないし、言語に対する概念というと違うと思うなぁ。

>>550
募集要項に何の言語が出来るかとか普通書いてないか?
Javaで募集かけたけどC#での開発がメインですみたいなカオスな職場もあんまりないだろ。
0554デフォルトの名無しさん (ワッチョイ e711-MZAo)垢版2017/07/26(水) 19:46:32.77ID:+NZ2Dbuu0
>>544
オブジェクト指向をサポートしてるかって話だよ
なんとなく分かるべ
>>546
ことさ、じゃなくてさ
俺はそういうところがクソだと言ってるの
クソはクソでも使わなきゃいから使うだけで
ライター、チャッカマン、バーナーが他所であるのにマッチでも火をおこせるしこれはこれで良いもんだぞって言ってるようなもん
0558デフォルトの名無しさん (ワッチョイ a791-8s/R)垢版2017/07/26(水) 19:56:29.43ID:W1HWCg900
>>553
オブジェクト指向言語は
オブジェクト指向設計したものを
そのまま実装し易い言語じゃないかな

言語の概念でもあると思うけどな

オブジェクト指向言語じゃなくても実装できるのは確かだけど
それならVBAでもオブジェクト指向設計を実装できるんじゃないかな
0561デフォルトの名無しさん (ワッチョイ a791-8s/R)垢版2017/07/26(水) 20:09:21.78ID:W1HWCg900
>>556
グローバル変数を使わなくても状態を表現できるんじゃね?

例えば再帰関数みたいに状態を引数にするとか
0562デフォルトの名無しさん (ドコグロ MM9f-efHF)垢版2017/07/26(水) 20:11:22.90ID:pjdGyN9QM
>>553
> オブジェクト指向言語は「オブジェクト指向的な設計が可能な言語」の事だから
そんなことを言い出したらアセンブリ言語でもオブジェクト指向は可能だよ
そういう極端な話をしたい訳じゃないんだと思うよ

> >>550
> 募集要項に何の言語が出来るかとか普通書いてないか?
ああ、そういう働き方してるひとなのね
もっとでっかい案件レベルのつもりだったから話が噛み合わないのも無理ないな
0565デフォルトの名無しさん (ワッチョイ a791-8s/R)垢版2017/07/26(水) 20:15:48.34ID:W1HWCg900
状態を持つ必要がある入出力関係が
独立に多数ある場合は
クラスを使うと比較的実装が簡単になるのかな?
0566デフォルトの名無しさん (ワッチョイ bf6d-1kH5)垢版2017/07/26(水) 20:17:56.75ID:rbCQuCda0
>>563
ログはlogシート一つ、3列

時間 / タイプ / 内容
7/26 20:00 log 作業開始
7/26 20:05 success 作業成功
7/26 20:07 error err.discriptionの内容
7/26 20:10 log 作業終了

で、書き込む時に毎回A列の最終行を取得し、そこに記録してる
覚える必要はないと思う
0567デフォルトの名無しさん (ワッチョイ e711-MZAo)垢版2017/07/26(水) 20:24:18.05ID:+NZ2Dbuu0
表の検索とかsqlでやる人もいるんだろうけど自分としてはクラスにしちゃうのがしっくりくるわ
配列の操作もクラスにしてると楽
あと、似たような処理で操作する対象が違うメソッドなんかは同じ名前にしても問題ないところとかも地味に便利だよ
関数だと命名に困ることがよくある
0568デフォルトの名無しさん (スップ Sdff-AsiQ)垢版2017/07/26(水) 20:30:27.76ID:ecs8OXuXd
>>560
さあ?いろいろあるでしょ
数値を放り込むとその度に回数をカウントアップし、最大値・最小値、合計、時刻を記録する、とか。
これくらいだったらワークシートでもできるけど、そういう対象が数多くなるとオブジェクト配列でやりたくなる。
どのワークシートのどこに?とか考える必要なくなるしエクセル以外のOfficeでも使えるし。
0569デフォルトの名無しさん (ワッチョイ a791-8s/R)垢版2017/07/26(水) 20:51:20.79ID:W1HWCg900
>>564
一般的な形では難しいかもしれないけど
サブクラスに相当する関数から
スーパークラスに相当する関数を呼べばいいんじゃね?

逆にスーパークラスに相当する関数に
スイッチみたいな引数を付けて
サブクラスに相当する関数に分岐するとか
0571デフォルトの名無しさん (ワッチョイ 473d-pqVL)垢版2017/07/26(水) 21:20:54.79ID:19gyZHTT0
>>558
VBAで出来ないと思っているならオブジェクト指向を何か勘違いしているからオブジェクト指向設計の本を読むといいよ。
他の言語みたいな書き方が出来ないだけで、VBAでもオブジェクト指向プログラミングは普通に出来るから。
0572デフォルトの名無しさん (ワッチョイ e711-MZAo)垢版2017/07/26(水) 21:34:48.38ID:+NZ2Dbuu0
>>570
まあ、あんまり大きなデータは扱わんからな
別に検索する形式が決まってるなら内部的にsqlで値抜き出してもいいわけだし
データの塊をオブジェクトとして扱っちゃったほうが何かまとまり感あってしっくり来るって感じかな
0582デフォルトの名無しさん (ワッチョイ db91-ntdb)垢版2017/07/27(木) 00:50:19.96ID:Gu8HEug70
>>576
なぜ?
で、どうするの?
0583デフォルトの名無しさん (ワッチョイ db91-ntdb)垢版2017/07/27(木) 01:05:44.74ID:Gu8HEug70
>>571
VBAと言う言語にクラスとかオブジェクト指向の概念が入っている
つまりオブジェクト指向の概念は言語にもつながる
と言う主張

一方でオブジェクト指向は設計にのみ関わる概念と言う主張もある

オブジェクト指向の概念を取り入れた言語でオブジェクト指向設計したものを実現するのと
オブジェクト指向の概念がない言語で実現するのでは
生産性とかに差が生じるだろう
0585デフォルトの名無しさん (ワッチョイ db91-ntdb)垢版2017/07/27(木) 01:54:44.40ID:Gu8HEug70
>>584
各シートの統計情報を取りたい時はどうする?
例えば、セルを更新した回数、最大値、最小値、平均値
を各シート毎に知りたい時

後から分散とか標準偏差とかも知りたくなったらどうする?
0586(ワッチョイ 0fcf-GNib)垢版2017/07/27(木) 02:24:19.55ID:lqCZB24a0
Youtuberヒカルが月収を明らかに!!おはよう朝日です出演
https://www.youtube.com/watch?v=RLZGrqQnnZc
第1回案件王ランキング!YouTuberで1番稼いでるのは誰だ!
https://www.youtube.com/watch?v=asF2wQ2xhjY&;t=61s
ユーチューバーの儲けのカラクリを徹底検証!
https://www.youtube.com/watch?v=FUSb4erJSXE&;t=504s
【給料公開】チャンネル登録者4万人突破記念!YouTuberの月収公開!
https://www.youtube.com/watch?v=Y7DAQ0RKilM&;t=326s
誰も言わないなら俺がYouTuberのギャラ相場を教えます
https://www.youtube.com/watch?v=E4q-vaQh2EQ&;t=118s
YouTuberになりたいのは馬鹿じゃない!YouTuberになる方法
https://www.youtube.com/watch?v=Fr0WXXZRMSQ

最高月収5000万円だとさ。年収じゃなくて「月収」な
おまえらもyoutubeに動画投稿したほうがいい
顔出したくないならラファエルみたいに仮面かぶればいい
手っ取り早く視聴数稼ぐには有名ユーチューバーへの物申す系動画がオススメ
0589デフォルトの名無しさん (ワッチョイ db91-ntdb)垢版2017/07/27(木) 06:25:09.17ID:Gu8HEug70
>>587
クラスってオブジェクト指向じゃないの?

上級者的に手続き型でやらないの?
0590デフォルトの名無しさん (ドコグロ MM8a-gqKx)垢版2017/07/27(木) 06:47:24.74ID:P1js1uXhM
>>582
> なぜ?

> 逆にスーパークラスに相当する関数に
> スイッチみたいな引数を付けて
> サブクラスに相当する関数に分岐するとか
サブクラスを増やす度にスーパークラスに手を入れるつもりなの?
真顔で言ってるなら単なるアホだろ w

> で、どうするの?
無理じゃね?
って書いてあるんだが...
0591デフォルトの名無しさん (ドコグロ MM8a-gqKx)垢版2017/07/27(木) 07:00:09.74ID:P1js1uXhM
>>585
> 各シートの統計情報を取りたい時はどうする?
要件次第

> 例えば、セルを更新した回数、最大値、最小値、平均値
> を各シート毎に知りたい時
更新回数以外は全セルなめて計算することもあるしイベント毎に合計、最大、最小を更新していくのもあるだろうな

> 後から分散とか標準偏差とかも知りたくなったらどうする?
そういう機能を実装するだけ
イベント以外はオブジェクト指向関係ないと思うぞ
0592デフォルトの名無しさん (ワッチョイ db91-ntdb)垢版2017/07/27(木) 07:12:45.05ID:Gu8HEug70
>>590
でいちいち同じ処理をコピペするの?
0593デフォルトの名無しさん (ワッチョイ db91-ntdb)垢版2017/07/27(木) 07:13:37.01ID:Gu8HEug70
>>591
生産性が違うんじゃね?
0594デフォルトの名無しさん (ワッチョイ db91-ntdb)垢版2017/07/27(木) 07:15:00.43ID:Gu8HEug70
>>591
全セルなめるとか性能要件を満たせなくなる可能性が高いだろ
0596デフォルトの名無しさん (ワッチョイ db91-ntdb)垢版2017/07/27(木) 07:17:56.55ID:Gu8HEug70
>>590
サブクラスからスーパークラスを呼ぶ方は?
0597デフォルトの名無しさん (ドコグロ MM8a-gqKx)垢版2017/07/27(木) 07:37:59.47ID:P1js1uXhM
>>592
どこからコピペが出てきたのか意味不明

>>593-594
だから「要件次第」って書いてあるんだが
最初に一度はなめないといけないから一回しか呼ばれないと言う要件ならその方が効率的だし

>>596
それになんの意味があるんだ?
マジでオブジェクト指向の基礎からやり直した方がいいレベルだぞ
0599デフォルトの名無しさん (アウアウエー Sae2-kGGk)垢版2017/07/27(木) 08:16:42.60ID:LMuXn2N9a
>>575
結局それだと要らんもんまで呼び出したり不便なんだよ
やれんことはないけど不便
オーバーロードもやれんことはないけど実装がめんどくさい
使いたい場面は結構出てくると思うけどね
インターフェースもなんかスマートじゃないし
0605デフォルトの名無しさん (JP 0H76-ZO1u)垢版2017/07/27(木) 10:55:11.44ID:ZNB0F0Q0H
>>604
> これはあなたが作者さんなの?
いや、俺じゃないよ
コードサンプルとして読んでみたらってこと

あとこれとか
https://github.com/jpimbert/VBAToolKit/tree/master/Source/VbaUnit

OOの知識があって、いわゆる「インターフェース継承」を視野に入れれば、かなりのことができる
さらに、WithEventsを使えば双方向データバインディングなんかも実装できる
0610デフォルトの名無しさん (アウアウエー Sae2-kGGk)垢版2017/07/27(木) 13:24:05.39ID:LMuXn2N9a
>>603
いやだからさ
俺の言いたいこと伝わらないし理解する気無いよね
こっちはマッチしか無いから仕方なくマッチ使ってんの
不満だからって努力を放棄してるわけじゃないからな?
ただどう考えても手間だろ
そんだけの話
0612デフォルトの名無しさん (ササクッテロル Spb3-ntdb)垢版2017/07/27(木) 14:43:39.94ID:DPiXNUUHp
>>597
意味がわからない?
学びなおした方が良いぞ
0614デフォルトの名無しさん (ワッチョイ ea06-HJpE)垢版2017/07/27(木) 16:44:21.21ID:7xCZa4oD0
だからさぁお前らは雑談したいだけだろ?スレ立ててそこでやれっつーの
クソうぜぇ
0617デフォルトの名無しさん (スップ Sd8a-y7IM)垢版2017/07/27(木) 17:11:23.71ID:yI2DKD3yd
使いたいときに便利な機能を自由につまみ食いできるのがいいライブラリだと思っているんだが、
オブジェクト指向のライブラリって少しおせっかいというか世界観を押し付けてくるところがある。
会員にならないと利用できないサービスみたいな感じ。
自分で作ったものを自分で利用する分には当然問題ないんだけどね。
VBAの言語機能の弱さを考えると、クラス間の関連のある体系的な使い方を実現するのは厳しいだろう。
0620デフォルトの名無しさん (アウーイモ MM9f-k5Qo)垢版2017/07/27(木) 19:42:01.40ID:xCwJ4jCdM
某サイトを参考にメールを一括作成するVBAを書いています。
createitemfromtemplateの行で「実行時エラー13 型が一致しません」というエラーが出ます。
どうやらcreateitemfromtemplateがうまく機能していないようなのですが、解決方法を教えていただけませんでしょうか。
よろしくお願いいたします。
※「Microsoft Outlook 14.0 Object Library」の参照設定はONになっています。
-----------------------------------
Sub main()

Dim OL As New Outlook.Application
Dim M As MailItem

Dim MaxRow: MaxRow = Range("A1").End(xlDown).Row

For i = 2 To MaxRow
Set M = OL.createitemfromtemplate("D:\本文.msg")

M.To = Cells(i, 列.件名).Value
M.Subject = Cells(i, 列.件名).Value
M.Attachments.Add "D:\" & Cells(i, 列.添付ファイル).Value
M.HTMLBody = Replace(M.HTMLBody, "●●", Cells(i, 列.氏名).Value)
M.SaveAs "D:\" & Cells(i, 列.企業名).Value & "_" & Cells(i, 列.氏名).Value & ".msg"
Next

End Sub
-----------------------------------
0621デフォルトの名無しさん (ワッチョイ 6623-V1Wy)垢版2017/07/27(木) 20:32:44.20ID:60P4ZjAM0
>>620
msdnのリファレンスをみると
Outlookテンプレート(.oft)を指定しろって書いてあるので
怒られているとおり、型がちがうのでしょう。

CreateItemメソッドを使えばいいんじゃないでしょうか。
0623620 (アウーイモ MM9f-k5Qo)垢版2017/07/27(木) 22:07:28.99ID:xCwJ4jCdM
>>621
返信ありがとうございます!!
すみません、CreateItemでも変わらずエラーでした・・。
ちなみに下記のように.oftを指定しても同じでした。
これは本当に不思議です・・・。

---------------------------------------
Sub test03()

Dim OL As New Outlook.Application
Dim M As MailItem
Set M = OL.CreateItemFromTemplate("D:\本文.oft")

M.To = "aaaa@bbb.co.jp"
M.SaveAs "D:\test03.msg"

End Sub
---------------------------------------
0627デフォルトの名無しさん (ワッチョイ 6623-V1Wy)垢版2017/07/27(木) 23:04:48.75ID:60P4ZjAM0
>>623
Sub test()

Dim ol As New Outlook.Application
Dim mi As MailItem
Set mi = ol.CreateItem(olMailItem)
mi.Display

End Sub

この最小構成でメール編集画面がでるかお試しを。
出なかったら参照設定が変なのかも。
Excelのバージョンが変わると勝手に参照設定のバージョンも
変わるという罠に引っかかったことがあるので。
実行時バインディングでやってみると言う手もあり。
0628620 (アウーイモ MM9f-6wLz)垢版2017/07/27(木) 23:18:55.37ID:xCwJ4jCdM
>>627
最小構成でやってみると、やはり同じエラーでした!
これは、参照ができていないのですか??
0629デフォルトの名無しさん (オッペケ Srb3-ZCwv)垢版2017/07/27(木) 23:25:30.12ID:8/6stQ5Xr
'// 1行目の項目名が、A列から順に
'//[アドレス][件名][添付ファイルパス][本文]
'// のとき、

Dim dataSet
Dim lastRow As Long
Dim i As Long

lastRow = Cells(Rows.Count, 1).End(xlUp).Row
dataSet = Range(Cells(2, 1), Cells(lastRow, 4)).Value

With CreateObject("Outlook.Application")
  .GetNamespace("MAPI").GetDefaultFolder(16).Display
  For i = 1 To lastRow - 1
    With .CreateItem(olMailItem)
      .To = dataSet(i, 1)
      .Subject = dataSet(i, 2)
      .Attachments.Add dataSet(i, 3)
      .Body = dataSet(i, 4)
      .Save
    End With
  Next i
End With
0630デフォルトの名無しさん (ワッチョイ 6623-V1Wy)垢版2017/07/27(木) 23:27:06.45ID:60P4ZjAM0
>>628
よく考えたら、参照ならその前にエラーを吐きそう。
ためしに

Sub test()

Dim ol As Object
Set ol = CreateObject("Outlook.Application")
Dim mi As Object
Set mi = ol.CreateItem(olMailItem)
mi.Display

End Sub
これをOption Explicitを無効にして実行したら
どうなるでしょうか?

だめならOS再起動してみる。
どうにも理解不能なエラーがこれで直ったことがあるw。
0632620 (アウーイモ MM9f-6wLz)垢版2017/07/28(金) 00:24:24.58ID:EJW5hZGgM
>>630
試しましたが同じエラーでした。

>>631
問題なくできています。


みなさん、ご協力ありがとうございます。ご迷惑おかけしてすみません。
今気づいたのですが参照先が14.0でした。最新は15.0なんですよね?これが原因でしょうか?
0633620 (アウアウアー Sab6-6wLz)垢版2017/07/28(金) 04:23:09.57ID:Kx1QSHwna
皆様ありがとうございました! 
理由はわかりませんが突然できるようになりました!
本当にご迷惑おかけしました!
0634デフォルトの名無しさん (オッペケ Srb3-ZCwv)垢版2017/07/28(金) 04:32:44.73ID:ccATQH/dr
>>632
ごめん。コード間違ってた。orz

参照設定をoffにし、↓のコードで試してみて。

'// olMailItemを直値(0)に変えた
Dim dataSet
Dim lastRow As Long
Dim i As Long

lastRow = Cells(Rows.Count, 1).End(xlUp).Row
dataSet = Range(Cells(2, 1), Cells(lastRow, 4)).Value

With CreateObject("Outlook.Application")
  .GetNamespace("MAPI").GetDefaultFolder(16).Display
  For i = 1 To lastRow - 1
    With .CreateItem(0)
      .To = dataSet(i, 1)
      .Subject = dataSet(i, 2)
      .Attachments.Add dataSet(i, 3)
      .Body = dataSet(i, 4)
      .Save
    End With
  Next i
End With
0637デフォルトの名無しさん (ワッチョイ db11-AITk)垢版2017/07/28(金) 23:02:57.85ID:+oxMyCi10
win10
excel2016で
MSXML2.XMLHTTPを使って
responseTextでgoogle検索結果のページを取得しようとすると、
responseTextで返ってきたものが、今までwin7 excel2007などで返ってきたものと全然違うんですが、win7の時のように受け取る方法ってありませんか?

win7の時はhtmlそのものが返ってきてましたがwin10では最初の方が判読困難です。

やろうとしていることは、vbaでgoogle画像検索の結果の画像をセルに表示しようと思ってます。
0639デフォルトの名無しさん (ワッチョイ db11-AITk)垢版2017/07/30(日) 12:41:33.40ID:ND/Yhbfk0
すみません、いろいろ試してたんですが、google以外ではちゃんと同じようなものを受け取れてました。
googleでは環境によって返すものが違うのかもしれません。
その先はスレ違いになるので自分でいろいろやってみます。ありがとうございました。
0641デフォルトの名無しさん (アウーイモ MM9f-GszO)垢版2017/08/02(水) 00:57:39.97ID:O3oN8G+MM
Function Name2Adr(str As String)
Dim Cts As Folder, Ct As ContactItem
Set Cts = CreateObject("Outlook.Application").GetNamespace("MAPI").GetDefaultFolder(olFolderContacts)
Set Ct = Cts.Items.Find("[Email1DisplayName] = '" & str & "'")

If Ct Is Nothing Then Name2Adr = "不明" Else Name2Adr = Ct.Email1Address

Set Cts = Nothing: Set Ct = Nothing
End Function
↑ローカルのアドレス帳から表示名を検索しメアドを返す関数です。これはうまくいくのですが、
↓下のグローバルアドレス帳を検索するものがうまくいきません。エラーメッセージは「オブジェクトはこのプロパティまたはメソッドをサポートしていません」です。
どなたか解決法をご教示ください。よろしくお願いします。
Function gName2Adr(str As String)
Dim olApplication As Outlook.Application
Dim olNameSpace As Outlook.Namespace
Dim olAddressLists As Outlook.AddressLists
Dim olAddressList As Outlook.AddressList
Dim olAddressEntries As Outlook.AddressEntries

Set olApplication = New Outlook.Application
Set olNameSpace = olApplication.Session
Set olAddressLists = olNameSpace.AddressLists
Set olAddressList = olAddressLists.Item(2)
Set olAddressEntries = olAddressList.AddressEntries

Dim olAddressEntry As Outlook.AddressEntry
Set olAddressEntry = olAddressEntries.Items.Find("[Email1DisplayName] = '" & str & "'") '←この行でエラー
If olAddressEntry Is Nothing Then gName2Adr = "不明" Else gName2Adr = olAddressEntry.Email1Address
End Function
0657641 (オイコラミネオ MMb6-Cs75)垢版2017/08/02(水) 13:14:55.44ID:1uis+HfsM
みなさん、ご迷惑おかけしてすみません。
outlook vbaのスレに書くべき質問だったでしょうか、、

>>649
すみません、outlookのライブラリです。
よろしくお願いします。
0660641 (オイコラミネオ MMb6-Cs75)垢版2017/08/02(水) 16:56:06.29ID:uQ5PKG3iM
みなさん、ご迷惑おかけしてすみません。
outlook vbaのスレに書くべき質問だったでしょうか、、

>>649
すみません、outlookのライブラリです。
よろしくお願いします。
0662デフォルトの名無しさん (ドコグロ MM22-gqKx)垢版2017/08/02(水) 18:28:23.95ID:i5+f8wczM
>>660
Outlook VBA スレないからまあここでもいいと思うが仕事中に軽くググった範疇だといい方法が見つからん
> Set olAddressEntry = olAddressEntries.Items.Find("[Email1DisplayName] = '" & str & "'") '←この行でエラー
Items.Find( ) は Folder オブジェクトしか持ってないからここでエラーになるのは当然
グローバルアドレス帳(Global Address List)は GetGlobalAddressList( ) で取得できるし内容も入っているんだが取得したリストの GetContactsFolder( ) を呼び出しても Nothing しか返ってこない
何か設定が要るのか根本的に頓珍漢なのかさっぱりわからん
0664620 (アウアウアー Sa83-zhMW)垢版2017/08/03(木) 06:23:52.11ID:y8hiM9O7a
>>662
ありがとうございます!勉強になります。

> グローバルアドレス帳(Global Address List)は GetGlobalAddressList( ) で取得できるし内容も入っているんだが

↑その内容というのは、debug.printで見ることはできますでしょうか??
0667デフォルトの名無しさん (オイコラミネオ MM4b-1llH)垢版2017/08/04(金) 13:47:28.51ID:2SBD/wKoM
バージョンが上がって日付時刻型の除算ができなくなりました。バリアント型にしても空になります。
対応方法はありませんでしょうか?
また、こういう仕様変更はどこで確認できますか?
0670デフォルトの名無しさん (ワッチョイ cf11-1llH)垢版2017/08/04(金) 20:11:22.22ID:CfFJ59fY0
時刻ですね
0674デフォルトの名無しさん (ワッチョイ cf11-4x8g)垢版2017/08/05(土) 11:28:42.39ID:J2w+rLAY0
エラーコードは51
データ型が日付時刻の除算はエラーでる
0676デフォルトの名無しさん (ワッチョイ cf11-4x8g)垢版2017/08/05(土) 13:00:51.75ID:J2w+rLAY0
>>675
時刻同士で割って見て
0683デフォルトの名無しさん (ワッチョイ ad91-j7Kr)垢版2017/08/05(土) 18:58:41.09ID:NpEI7ikB0
>>681
8時間の就業時間の間に25分掛かる作業を何回できるか見積るとか
0686デフォルトの名無しさん (アウーイモ MMb3-7CC5)垢版2017/08/05(土) 20:31:20.41ID:2UigV3EYM
質問するのにバージョンも書かない
ID変わってるのに名無しのまま
環境書けと言ってるのに無視
こんな処理する理由は?と聞かれても無視


こんな人間の生産物を現場で使う恐怖
0691デフォルトの名無しさん (オッペケ Srd9-31he)垢版2017/08/06(日) 12:22:25.32ID:hXGNAkd3r
また教えたがりの無能が暴れとるのかw
0693デフォルトの名無しさん (オイコラミネオ MM4b-4x8g)垢版2017/08/07(月) 16:41:33.18ID:/LwpuoG3M
>>678
dim a as date
dim b as date
dim test as date

a = time
b = time
test = a / b

でエラー出た
0694デフォルトの名無しさん (ワッチョイ 49ad-mf2b)垢版2017/08/07(月) 16:59:56.15ID:PHW4jpUx0
>>693
地域オプションで先頭が数字以外になるような書式だったとか?
0695デフォルトの名無しさん (ワッチョイ 9be4-jyli)垢版2017/08/07(月) 19:35:32.88ID:9LTblBy60
>>693
環境書けよ
なんでエラー出たとか言うやつは環境書かないの

VBAの日付型は原則数値として扱えるはずので
日付型である事が原因でエラーが出るとは考えにくいけどなぁ

ちなみにエラー51のヘルプ(2007)には
>このエラーが Error ステートメントまたは Raise メソッドで生成されたものでなければ、Microsoft 製品テクニカル サポートに連絡して、メッセージが表示されたときの状況を知らせてください
ってあるから、ホントにエラー51出たならEXCELのバグの可能性もないではないな
0696デフォルトの名無しさん (ワッチョイ 3b6d-VAa7)垢版2017/08/07(月) 20:09:27.70ID:PGc1T+jA0
excel2010 win7
エラーが起こるのは除算の分母側がdateだった時
longにキャストするか、variantで宣言していれば問題ない(もちろん宣言してない場合も問題ない)
バグくさい挙動だなぁ

Sub foo2()
Dim a As Time
Dim b As Time
Dim test As Date

a = Time
b = Time
test_long = (a * 1) / (b * 1) 'ok
test = a / (b * 1) 'ok
test = 1 / b 'error
test = (a * 1) / b 'error
test = a / b 'error
End Sub

Sub foo()
Dim a As Variant
Dim b As Variant
Dim test As Date

a = Time
b = Time
test = a / b 'ok
End Sub
0697デフォルトの名無しさん (ワッチョイ ad91-3aaz)垢版2017/08/07(月) 20:36:42.78ID:5JtEoMJq0
Cdbl()で分母をDoubleにキャストすればいいだけじゃね?
0699デフォルトの名無しさん (ワッチョイ ad91-3aaz)垢版2017/08/07(月) 20:54:07.86ID:5JtEoMJq0
Time って
DateTime.Time プロパティのことだよな
Property Time As Variant
だからもともとVariant型

dim a As Time がエラーになるんだが
0700デフォルトの名無しさん (ワッチョイ ad91-3aaz)垢版2017/08/07(月) 21:05:47.61ID:5JtEoMJq0
Date型はVBAのデータ型で"21:02:32"みたいな文字列なんじゃね?
だから計算するとエラーになる
分子にDate型を持ってきたときはDoubleに自動的にキャストされてると予想
0702デフォルトの名無しさん (ワッチョイ cf11-4x8g)垢版2017/08/07(月) 23:25:10.55ID:kmFs6vPH0
>>695
2007じゃエラーでないよ
0704デフォルトの名無しさん (ワッチョイ ad91-Mpnj)垢版2017/08/07(月) 23:39:54.26ID:5JtEoMJq0
>>702
2010とかだとエラーになる

分母にDate型を持ってくるときは
明示的にCdblでキャストすればエラーにならなくできる

MS側にバグレポートしたところで修正するかどうかはMS側次第
仕様変更したと言うかもしれない
0710デフォルトの名無しさん (ワッチョイ ad91-Mpnj)垢版2017/08/08(火) 07:52:46.37ID:4vV+Ffiu0
>>709
そこはエラーとは関係ない
debug.print a/b
でもエラーになる

意味的に間違いでも形式的文法的には正しい
0714デフォルトの名無しさん (ササクッテロロ Spa9-Mpnj)垢版2017/08/08(火) 08:18:45.83ID:T3VkQlydp
>>711
TimeはDaterime.timeでvariantだからエラーにならないのはわかる

fooもvariant?それともDate型?
0715デフォルトの名無しさん (ササクッテロロ Spa9-Mpnj)垢版2017/08/08(火) 08:21:04.55ID:T3VkQlydp
>>713
時刻を基準日時刻からの時間以外で定義できるんだっけ?
0717デフォルトの名無しさん (ワッチョイ 57aa-/L7g)垢版2017/08/08(火) 08:24:58.32ID:Czpew14v0
今のとこ試した範囲では、2010で割る方の方がDate型だとエラー51だすな
バリアントだとVarType 7(vbDate)でも平気
どうにもバグくさい。だれかインシデント余ってるやつMSに聞いてくれ

>>711
だからエラーになるやつは環境かけよ
Win7 2010ではそれだけではエラーにならんぞ
どっかでfooをDateで宣言してんじゃねえのか
0718デフォルトの名無しさん (ワッチョイ 57aa-/L7g)垢版2017/08/08(火) 08:31:46.30ID:Czpew14v0
>>713
VBAでは時間と時刻の型は区別されてないから、その議論に意味があるかは微妙だな
Date型を時刻ととらえるか基準時点からの時間ととらえるかの問題だろ

>>716
時間と時刻の違いわかってる?
一般的な会話での時間って言葉はほとんどが本来だと時刻の間違いだぞ
時刻の除算にどんな意味があるんだ?
0720デフォルトの名無しさん (ワッチョイ 0b06-gAma)垢版2017/08/08(火) 17:34:44.63ID:o2sPvDRf0
>時間の就業時間の間に25分掛かる作業を何回できるか見積るとか

(終了時間ー開始時間)を分単位に直して25で割るってことじゃないですか。
これは10000円を100円単位に分けたらいくつになる?ってのと同じ数量の問題だよね?

時刻の除算ってのは例えば
A = "2017/04/11 16:54:00"
B = "2017/08/15 10:45:48"

で A / B (Aは日付型でなくてもいいんだろうけど)ということでしょ?
これにどんな意味があるのよ
0721デフォルトの名無しさん (スプッッ Sddb-6kmL)垢版2017/08/08(火) 18:14:01.43ID:Plhneb/rd
単純な操作のはずなのによくわからん

0. .xlmxファイルを(パス:\A)に作成しておく

1. フォルダ(パス:\B)内のすべてのCSVファイル(データは1列のみ)を、先ほど作成したファイルのSheet1の2列目から順次マージする

データを繋げるところで詰まるので助けてください
0723デフォルトの名無しさん (ワッチョイ ad91-Mpnj)垢版2017/08/08(火) 19:18:53.44ID:4vV+Ffiu0
>>722
Date型で割るとエラーになると言う点と
あとどうでもいいんだが時刻で割ると言う点の
2つの論点が並行している

Dateで割る時はdoubleにキャストすればいいだけ
0724デフォルトの名無しさん (ワッチョイ ad91-Mpnj)垢版2017/08/08(火) 19:20:53.27ID:4vV+Ffiu0
>>720
Bを1とした時にAを数値で表した値
どんな価値があるかはその時によるが
全く価値がないとも言い切れない
0726デフォルトの名無しさん (ワッチョイ 5323-/FH4)垢版2017/08/08(火) 19:36:48.60ID:bHuYQqMY0
Excel総合に間違って投下してしまったので、こちらに再投稿します。

以下のマクロをボタンに登録し、印刷範囲をhtmで保存しようとしています。
しかし、このブックを一度上書き保存等しないと正常に動作しません。
見よう見まねでこうなったコードなのですが、どうすれば良いでしょうか?
アドバイスお願いします。

Sub SAVE()
'
' SAVE Macro
'
'
With ActiveWorkbook.PublishObjects.Add(xlSourcePrintArea, _
Range("AT1").Value & ".htm", "Sheet1", "", xlHtmlStatic _
, "", "")
.Publish (True)
.AutoRepublish = False
End With
ChDir "C:\Users\admin\Desktop"
End Sub
0728デフォルトの名無しさん (ワッチョイ ad91-Mpnj)垢版2017/08/08(火) 21:50:18.55ID:4vV+Ffiu0
>>727
エラーとカーソルタイプやロックタイプは関係あるの?
0730デフォルトの名無しさん (ワッチョイ ad91-Mpnj)垢版2017/08/08(火) 22:06:10.50ID:4vV+Ffiu0
sqlのエラーならそこらへんは関係ないんじゃないの?
なんのエラーか知らんけど
0731デフォルトの名無しさん (ワッチョイ 693d-gAma)垢版2017/08/08(火) 22:12:27.27ID:wQlpajLt0
DB操作はClose通らない処理を挟んでしまって二重にOpenするとかで苦労した事があるなぁ。
それが原因ならクラス作ってデストラクタにClose書いておけば忘れなくて便利。
0732デフォルトの名無しさん (ワッチョイ 1311-/F0N)垢版2017/08/08(火) 23:58:40.83ID:cql1o/lA0
>>723
> Date型で割るとエラーになると言う点と
俺はそんなことは問題にしてない
意味のない演算ができてしまう言語なんて珍しくないし

> あとどうでもいいんだが時刻で割ると言う点の
どうでもいいなら放置しておけば?
0739デフォルトの名無しさん (ワッチョイ 0e6f-aEKd)垢版2017/08/10(木) 22:43:19.50ID:JdKfuZ5y0
>>734
一般的でなく、同じ目にあった経験者しか答えを知らなそうな内容なので・・。

ググって出てきた例が全滅なので、
多分、AccessではなくExcelでやってるのが原因だとは思うのですが。
0741デフォルトの名無しさん (ワッチョイ 1a06-KsLg)垢版2017/08/10(木) 23:22:56.42ID:VgLhJXRi0
>EOFがtrueじゃありません

俺もmysqlにアクセスするのを作ってる段階でそういうのを出すことはあるよ。けど、そういうのここで
チンタラチンタラ言っててもソースがない以上こちら側ではどうしようもないわけで。
0743デフォルトの名無しさん (ワッチョイ 97e4-kh1+)垢版2017/08/11(金) 04:12:54.28ID:+mgolt3u0
そもそも何のDB(ドライバ)かすら書いてないし
どうやってレコードセット開いてupdateしたのか書いてないし
レスするだけ無駄な気がするぜ

>EOFがtrueじゃありません
そんなエラー見たことないな。EOFがFalseなら普通にデータ取れてるってことじゃねえの?
EOFがTrue前提の操作が浮かばんが、何しようとしたらそんなエラーになるんだよ

>IZAMが有効じゃありません
IZAMって何さ?ビジュアル系バンドメンバーかよ
0744デフォルトの名無しさん (オッペケ Srbb-CFLX)垢版2017/08/11(金) 07:44:16.53ID:xHfWhpghr
>>743
> レスするだけ無駄な気がするぜ

いいんだよ、それで。雑談が目的なんだから。
答えを出す必要はない。


>> EOFがtrueじゃありません
> そんなエラー見たことないな。

ADOでレコードセットを操作していると、ときたま現れるエラー。
クエリ結果にレコードが1件もない場合とかに出たりする。
0745デフォルトの名無しさん (ワッチョイ 0e4b-K+Tw)垢版2017/08/11(金) 11:24:22.86ID:dnJD889I0
初心者ですがご教授下さい
クラス内にTRが9ありそのうちの1〜4を取得したいと思っています。
現在は1しか取得できません。どう書き換えればいいでしょうか?
Sub shisaku()
Dim objIE As InternetExplorer
Set objIE = CreateObject("Internetexplorer.Application") '
objIE.Visible = True '
objIE.navigate "http://www.aaa/aaa";
Do While objIE.Busy = True Or objIE.readyState < READYSTATE_COMPLETE
DoEvents
Loop
Dim htmlDoc As HTMLDocument
Set htmlDoc = objIE.document
Dim colTR, colTH, colTD, colImg As IHTMLElementCollection
Set colTR = htmlDoc.getElementsByClassName("first")
Dim el As IHTMLElement
For Each el In colTR
Set colTH = el.getElementsByTagName("th")
Set colTD = el.getElementsByTagName("td")
Debug.Print colTR(0).innerText
Next el
End Sub
0749デフォルトの名無しさん (ワッチョイ 0e4b-J8zh)垢版2017/08/11(金) 13:38:42.84ID:dnJD889I0
>>747
vbaでieを操作を読んでもググってもあり理解出来なくてとりあえず作りながら覚えようと
コピペしたものを一部変えました
tr、tdは特定出来ずclassが特定出来るのですがどのように書き換えればよろしいのでしょうか?
0750デフォルトの名無しさん (ワッチョイ 0391-8lAF)垢版2017/08/11(金) 13:56:55.44ID:kj6/PAcR0
>>749
処理対象によってどうすればいいか変わるから
対象が判らないとなんとも言えないのではないと思う

クラスで全部のTRを取れてるのかも判らないし
0756デフォルトの名無しさん (ワッチョイ 0391-8lAF)垢版2017/08/11(金) 15:12:27.50ID:kj6/PAcR0
>>755
まず数字か文字列か判別すればいいんじゃね?
if a like "[0-9]*" then
って感じでできる様なきがする
0757デフォルトの名無しさん (ワッチョイ 0e6d-1q0p)垢版2017/08/11(金) 15:23:36.72ID:hvV/hgBn0
>>756
今考えてるのは以下の感じです
VBAもプログラミングも初心者のため全然コードがわかってなくてすみません


loop (i)
if instr(cell(i,1),"○")<>0
sw=1

if sw=1

sw =1の時それより下のセルの情報を切り取り

 loop(n)
 n=i+1
 if instr(cell(n,1),"○")<>0
 sw=0

 else n=n+1
 loop end

else i=i+1
loop end
0758デフォルトの名無しさん (ワッチョイ b66d-YQfT)垢版2017/08/11(金) 15:32:45.42ID:fD8DkUIg0
>>755
こう
Sub foo()
行 = 1
'一行目は数字
Cells(行, 2) = Cells(1, 1)
tmp = Cells(1, 1)
For i = 2 To 100
If IsNumeric(Cells(i, 1)) Then
'数字
Cells(行, 2) = tmp
Cells(行, 3) = 文字
行 = 行 + 1
tmp = Cells(i, 1)
文字 = ""
Else
'文字
文字 = 文字 & vbCrLf & Cells(i, 1)
End If
Next
End Sub
0760デフォルトの名無しさん (ワッチョイ 0391-8lAF)垢版2017/08/11(金) 15:48:56.25ID:kj6/PAcR0
>>759
数字を含む文字列をどっちに判別するかによるんじゃね
0763デフォルトの名無しさん (ワッチョイ 0e6f-aEKd)垢版2017/08/11(金) 20:25:45.30ID:Nl+bIgs10
>>742
普通にCopyFromRecordsetするだけなら出来るんです。

Do Until rs.EOF
 rs!項目=何とか ←ここで何かしようとすると、Debug.Print以外は全て失敗します。
 rs.MoveNext
Loop

諦めて、GetRowsして編集してから出力しようとしたら、
縦横入れ替わってるし(Excelで使うのに何故こんな仕様にした?)、
Transposeで直そうと思っても型が違いますとか言われるし・・。

>>743
I-zamはサポートしてませんだったかも?
0765デフォルトの名無しさん (ワッチョイ 97e4-GDrG)垢版2017/08/11(金) 20:48:59.91ID:+mgolt3u0
>>744
>クエリ結果にレコードが1件もない場合とかに出たりする。
それ普通はEOFがTrueになるはずだけど
MySQLのドライバでそうならなかったりするのか?ドライバのバグじゃねえの?
それどうやってゼロ件かどうか判定するんだ?
0766デフォルトの名無しさん (ワッチョイ 97e4-GDrG)垢版2017/08/11(金) 21:03:31.05ID:+mgolt3u0
>>763
だからDBとドライバ何で、どうやってそのレコードセット作ってるんだよ

そもそもレコードセットを更新する必要があるのかどうかも疑問だけどな
レコードセットは常に更新できるとは限らんのだぞ
0767デフォルトの名無しさん (ワッチョイ 0e6f-aEKd)垢版2017/08/11(金) 21:18:12.65ID:Nl+bIgs10
>>764
そうです。
SQL上だと難しい内容があるので、後から入れようかなと。

>>766
CsvとMicrosoft.Ace.OLEDB.12.0です。
元のCsvの方は、多分更新出来ないだろうとは思ってたのですが、
出力結果の方に、編集した内容が反映されればいいかなと。
0769デフォルトの名無しさん (ワッチョイ 0391-8lAF)垢版2017/08/11(金) 22:03:13.38ID:kj6/PAcR0
>>764
rsに代入できるんだっけ?
debug.print出来るならrsから読み込むのは出来るんじゃね?
別変数にコピーしてから変更したら?
0771デフォルトの名無しさん (ワッチョイ 0391-8lAF)垢版2017/08/11(金) 22:11:37.85ID:kj6/PAcR0
>>770
そんなの統計とかアンケートとかとってる人いないんじゃないかな
実現したいことができればいいんじゃね
0773デフォルトの名無しさん (ワッチョイ 9aaa-W16a)垢版2017/08/11(金) 22:36:29.71ID:mfxycmdp0
>>772
VBAとODBCドライバしか使わないのでExcel, Outlook, Word, Access その他 Officeなら何でもOKにはしてる。
ExcelとOutlookくらいしか使わないけどね。
Outlookはメールで「このテーブルをこう読んだときに〜」とか連絡を受けたときにそのままVBEを開いて使ったりとか。
0774デフォルトの名無しさん (ワッチョイ 0e6f-aEKd)垢版2017/08/11(金) 23:12:57.71ID:Nl+bIgs10
>>768
それは最初に、読み取り専用じゃないやつに変えたけどダメだったと書きましたけど。

>>770
ググって引っかかる率が高いのはADO。
外部データ取り込みの方なら、参照設定もいらないのに、どういうわけかADOばっか。
ADOばっか出るから、ADOに乗り換えてみたら、このザマですよ。
0776デフォルトの名無しさん (ワッチョイ 0e6f-aEKd)垢版2017/08/12(土) 00:49:01.81ID:RTe2mUwF0
>>775
外部データ取り込み(Microsoft Query)からです。

シートの指定が、なぜか[シート名$]じゃなくて`シート名$`とか、
データの出力開始列にコマンドボタンを配置すると、ボタンを押した瞬間、
ボタンが横に逃げるとか(離すと元の位置に戻ってくる)、
意味不明な軽い嫌がらせがありますけど。
0777デフォルトの名無しさん (ワッチョイ 9aaa-W16a)垢版2017/08/12(土) 10:58:36.59ID:AoA5DjYT0
ヘルプ見ると日付型の説明として以下のように書いてあるじゃん。

 日付型 (Date) の変数は、IEEE 64 ビット (8 バイト) の浮動小数点数の変数です。
 西暦 100 年 1 月 1 日〜西暦 9999 年 12 月 31 日の範囲の日付と、0:00:00 〜 23:59:59 の
 範囲の時刻を表すことができます。

でも1900年以前のDate型変数をワークシートに貼ろうと思ってもできなくて、

 実行時エラー'1004':
 アプリケーション定義またはオブジェクト定義のエラーです。

ってエラーが出てくるじゃん。これ控えめにいtt
0778デフォルトの名無しさん (ワッチョイ 1a06-KsLg)垢版2017/08/12(土) 11:02:43.67ID:q63a26xE0
mysqlとodbc経由で接続している。以前はSQLServerとでもやってた。他にもポスグレやoracleとやってる人間も沢山居るだろ。
んでそんな文句言ってるのはお前だけ。

お前のソースがバグだらけなんだよ。けどソースは示さないんだろ?一人勝手にやってろ
0780デフォルトの名無しさん (オッペケ Srbb-paLu)垢版2017/08/12(土) 12:46:19.08ID:IpuKNNKZr
>>755

  Dim lastRow As Long
  Dim i As Long
  Dim arry
  Dim str
  
  lastRow = Cells(Rows.Count, 1).End(xlUp).Row
  arry = Range("A1:A" & lastRow).Value

  i = 1
  Do Until i = UBound(arry)
    If IsNumeric(arry(i, 1)) And arry(i, 1) <> "" Then
      str = str & arry(i, 1)
      Do Until IsNumeric(arry(i + 1, 1))
        str = str & arry(i + 1, 1)
        i = i + 1
        If i = UBound(arry) Then Exit Do
      Loop
      str = str & vbCrLf
    Else
      i = i + 1
    End If
  Loop
  Range("B1").Value = str
0783デフォルトの名無しさん (ワッチョイ ab09-KsLg)垢版2017/08/13(日) 10:20:51.63ID:YIp/txnN0
VABでIEを開いて、
情報を取ってるんですが、
ie.Visible = False
で、
画面でないようにしてるけど、
これは、どこか裏で開いてる?
それとも、消えてくれるのかな、
Falseで画面出さない時は、
IE閉じる処理はしなくてもいいでしょうか?
0785デフォルトの名無しさん (ワッチョイ ab09-KsLg)垢版2017/08/13(日) 10:35:11.41ID:YIp/txnN0
>>784
クエリでも獲れるけど、
VBAも使いたいので、
なにか閉じる処理とかいるのかなぁ
0789デフォルトの名無しさん (ワッチョイ ab09-KsLg)垢版2017/08/13(日) 12:33:27.11ID:YIp/txnN0
>>787
そうですか、
閉じるようにします、
ありがとうございます!
>>788
俺も、
htmlのタグとか、でieから情報とってる。
0790デフォルトの名無しさん (ワッチョイ f34b-qwy0)垢版2017/08/16(水) 19:34:35.81ID:jf8MYepF0
>>745です
childrenで情報は取得できそうです(イミディエイト上確認できています)

エクセルのA列に入力のURL100をA2から順に自動で情報取得、B列、C列、D列に取得した情報を出力したいのですがどのようにすればいいでしょうか?
おそらくは下記部分の書き換えかと思われますがご教授下さい

objIE.navigate "http://www.aaa.jp/1234/123456789";

Debug.Print colTD(2).innerText & "|" & colTD(3).innerText & "|" & colTD(4).innerText
0798デフォルトの名無しさん (ワッチョイ e14b-XaGt)垢版2017/08/17(木) 18:27:33.83ID:IrM4WgJo0
>>797
ありがとうございます。でもごっそりは重そうなので出来れば自作できればと。
ググるとこれが良さそうですが
Range("A1").Hyperlinks(1).Follow NewWindow:=True

例えばexcelシートにB2〜B101までurlの記載があり選択してctrl+sみたいな感じで自動実行
これを書き換えるにはどうすればいいでしょうか?

Set DataSheer = ActiveSheet
Dim i As Long, cnt As Long
For i = 1 To 100
cnt = cnt + 1
Cells(cnt, 1) = i

適当に拾ってきた物を書いてみましたアドバイスをお願いします

>>793
MSXML2.XMLHTTP の利用について教えて下さい。
1日500URLを寝る前に取得したいので出来れば動作は早い方がいいです。
ieを開かずにデータを取得できるんですよね
>>745
Set objIE = CreateObject("Internetexplorer.Application")
objIE.Visible = True
を変更でいけますか?
Set objIE = CreateObject("MSXML2.XMLHTTP")
objIE.Visible = False
0800デフォルトの名無しさん (アウアウカー Sa1d-R5c0)垢版2017/08/17(木) 23:13:12.34ID:yWP51BMra
>>798
そうじゃなくて、そのツールでとってこれるのは指定のURLのページがどういう構造になっているかという情報。
それが分かれば自分で組めるでしょという話。
500個のURLのページがみんな同じ構造なら取りあえず1つだけ構造を調べれば他は同じように組めるでしょ。

例えば君は9個のTRの内、1〜4を取りたいけど1だけしか成功して無いんだろ。
なぜ2〜4が取れないかを調べるのに使う。
取りたいデータに名前やクラス名がついてたらそれで取ってきた配列を使うし、無ければタグ名で取って来る。
タグ名ならその右にある番号から何個飛ばしで取れば良いとかを類推する。

MSXML2.XMLHTTPやMSHTML.HTMLDocumentは単純にInternetExplorer.Applicationを置き換えて使えるわけじゃない。
ソースを取ってきてそれをDOMDocumentに当て嵌めれば似たように使えるけど。

ところで、1日に500個のURLから情報取ってきて問題無いんだろうね。
岡崎図書館の例にもある通り、不正アクセスとして捕まるのを避けるために先方には確認してる?
0801デフォルトの名無しさん (ワッチョイ 9352-jLVh)垢版2017/08/17(木) 23:29:45.34ID:Fn2cTqwk0
ふだんプログラミングはExcelのVBAがほとんどでこれならかなり本格的なこともできるスキルがあります。
ところでJavascriptに興味を持ちメモ帳でJavascriptをはじめました。
これでExcelVBAのようにコード書くときにインテリセンスで入力補助ができるツールってないんですか?
メモ帳だから当然そんなのできません。
Javascriptの入門書はいつくか読んでますがExcelVBAのようなインテリセンスが使える開発環境のことには全くふれていません。
0804デフォルトの名無しさん (ワッチョイ dbaa-jLVh)垢版2017/08/18(金) 02:47:26.07ID:2Rkfa1Rx0
うむ
0807801 (ワッチョイ 9352-jLVh)垢版2017/08/18(金) 06:47:56.97ID:r9Ad8ntQ0
>>802
いや、ここに居座る。

>>803
VSってVisual Studioですかね?かなり本格的なツールと思いますが
Javascriptでインテリセンスだけできたらいいのですがシンプルなツールはないものでしょうか?
というよりJavascriptやってる人の使用ツールの使用率みたいな円グラフはないでしょうか?

あとExcelVBAでよくやるブレークポイントを使ってF8のコマ送りや実行途中で変数の値を見るのって
Javascriptで使うツールでもできるんですかね?
0810デフォルトの名無しさん (ワッチョイ 9352-jLVh)垢版2017/08/18(金) 07:14:13.91ID:r9Ad8ntQ0
なんだよ、ここじゃ教えてくれないのです?
0811デフォルトの名無しさん (ワッチョイ 9352-jLVh)垢版2017/08/18(金) 07:15:23.14ID:r9Ad8ntQ0
             / ̄ ̄ ̄ ̄ ̄\
         /           \
         /              ヽ 
   / ̄\ l      \,, ,,/      | そりゃないよ
  ,┤    ト |    (●)     (●)   | かあちゃん!
 |  \_/  ヽ     \___/     |  
 |   __( ̄ |    \/     ノ 
 ヽ___) ノ
0812デフォルトの名無しさん (ワッチョイ 9352-jLVh)垢版2017/08/18(金) 07:17:18.70ID:r9Ad8ntQ0
>>809
VSは会社で気軽にインストールできないじゃん
0815デフォルトの名無しさん (オッペケ Sr4d-uth0)垢版2017/08/18(金) 07:36:13.08ID:fGYkVGPpr
>>812
そこなんだよ、問題は。

じゃ、テキストエディタは気軽にインスコできるのかっつーと、インテリセンス実現するためには、やれプラグインだなんだって追加する必要が出てくる。

ソフトのインストール申請は1回で済ませたいよね。
となると、なんだかんだでVSが最良の選択肢になる。
配布元がMSなのも安心だし。

HTMLやCSSも入力補完できるからね。
入れておくとめちゃ便利でっせ、旦那。
0820デフォルトの名無しさん (ワッチョイ 9352-jLVh)垢版2017/08/18(金) 09:27:19.77ID:r9Ad8ntQ0
>>819
こんな掲示板のルールは守る必要がない。

そもそも20年くらい前のインターネット創始期にリアル世界からバーチャル世界への人々の続々の初参加で
みんなが気軽に参加さえできればどこでもいい掲示板がたまたまここだっただけで
まるで自分のアイデアで発明して作り上げた掲示板と勘違いした管理人が有名になったことも利用して年収数億円にもなった
そんなずるいアホの作ったルールを守る必要あるか?
0822デフォルトの名無しさん (ワッチョイ 9352-jLVh)垢版2017/08/18(金) 09:37:07.95ID:r9Ad8ntQ0
>>821
それはあちらのスレでもだれかが言ってたvisual studio codeですか。
評判よさそうなので使ってみます。
0823デフォルトの名無しさん (ワッチョイ 9352-jLVh)垢版2017/08/18(金) 09:39:00.89ID:r9Ad8ntQ0
あと最重要なことを忘れていた。
Excel VBAのF2で呼び出せるオブジェクトブラウザは上級者ならこの便利さは涙ものだと思うけど
これに相当するものはJavascriptでも使えるんですよね?
たいていのツールならJavascriptでのオブジェクトブラウザは見れる仕様になってるの?
0824デフォルトの名無しさん (ササクッテロロ Sp4d-wXqg)垢版2017/08/18(金) 09:39:54.13ID:AHP5pPkPp
visual studio codeはフリーで商用利用も可能だったはず
0830デフォルトの名無しさん (ワッチョイ 9352-jLVh)垢版2017/08/18(金) 12:44:31.00ID:r9Ad8ntQ0
しかもそいつはYoutube動画のすべてのサムネイルで
自分のカバみたいなデカい顔を恥ずかしげもなくデカデカとのせてる。
https://www.youtube.com/channel/UCWlenAgH6lBO36CKiAQR6gQ/videos
これが許させるのはイケメンだけではないか?
勘違いもはなはだしい。
0831デフォルトの名無しさん (ワッチョイ 9352-jLVh)垢版2017/08/18(金) 12:57:32.20ID:r9Ad8ntQ0
動画の内容も幼稚。
こんな低レベルのことしか考えれないのにしゃべるな!というレベル。

例えばプログラミングついての動画見てよ。
https://www.youtube.com/watch?v=N9Xl2m-GZwc
コピペが最良とか言ってて、こんなんやってたら共同作業でプログラングやってたらめちゃめちゃになる。
このレベルじゃデザインパターンとかリファクタリングのことを全く知らないしろうとだとわかる。
この人さっぱりプログラミングできないのは明らか。
言語の見解としてCOBOLはやる人がいないからチャンスかも、というのもそれは違うだろ。
0833デフォルトの名無しさん (アウアウカー Sa1d-R5c0)垢版2017/08/18(金) 13:55:05.43ID:HoFsfG3Ua
>>831
まあ、どうでも良いんだがjavascriptは詳しくないからなあ。
有用な回答が得られるかっていうと知らんということでjavascriptのスレよりは難しいんじゃないか?

ところでググることぐらいはしてるんだろうね。
OmniSharpが使えるエディタならなんでもいけるかも。

あと、マイナーかもしれんがScite4がいけるかも。
AutoItで使ってるからjavascriptはどの程度使えるかは分からんが。
0834デフォルトの名無しさん (アウアウカー Sa1d-R5c0)垢版2017/08/18(金) 14:04:26.04ID:HoFsfG3Ua
>>814
うん、DOMの構造を調べて求めるデータがgetElementsByTagname("TR")の何番目なのかや、実際にはその子どもや孫の可能性もあるからその何番目かっていうのを簡易ツールで調べて欲しいんだがね。
テーブルの場合、連続した番号にならないことも多いから何個飛ばしかが分かれば取ってこれると思うんだけど。
0836デフォルトの名無しさん (ワッチョイ e14b-XaGt)垢版2017/08/18(金) 17:40:24.80ID:AdXlT0dS0
TR取れない君です
>>790に書いてますが取得は出来てます
3サイト程試したので理解は出来ているかと思います
昨日はcellに出力まで出来ました。
Set colTable = htmlDoc.getElementsByName("oppai")

Dim el As IHTMLElement
For Each el In colTable

Set colTH = el.getElementsByTagName("th")
Set colTD = el.getElementsByTagName("td")

i = 2
Cells(i, "B") = colTD(2).innerText
Cells(i, "C") = colTD(3).innerText
Cells(i, "D") = colTD(4).innerText

Next el

後はA列に記載のURLから順に情報を取得して上のcellに格納していくのと
MSXML2.XMLHTTPやMSHTML.HTMLDocument化です

A列に記載のURL(B2からB101)から順に情報を取得して上のcellに格納の
具体的なコードを教えて頂けないでしょうか
0837デフォルトの名無しさん (ワッチョイ e14b-XaGt)垢版2017/08/18(金) 17:41:43.48ID:AdXlT0dS0
A2からA101の間違いです
0838デフォルトの名無しさん (ワッチョイ 2baa-PF2c)垢版2017/08/18(金) 17:55:29.64ID:MkY1nhvU0
>>798
1つのドメインにつき、1日1回までにしておかないと、業務妨害で逮捕されるぞ。
同じサイトへ、しつこくアクセスするなよ

普通のサイトは、ツールでのアクセスは認めていないから

robots.txt に、検索エンジンのクローラー(ロボット)に対する、命令が書いてあって、
それに従わないアクセスは、業務妨害で逮捕される
0839デフォルトの名無しさん (ワッチョイ e14b-bEti)垢版2017/08/18(金) 20:31:07.04ID:AdXlT0dS0
>>838
えっ1日に2回サイトにアクセスすると逮捕って日本の法律?
じゃあスクリプト組んで商品買ってるやつみんな逮捕されてんの
コードの書き方書いてるやつやソフト屋も幇助で逮捕されてるんだ

ちなみに取りに行くの海外サイトなんだけど同じなの?
国際指名手配とかになると困るんだけど
0842デフォルトの名無しさん (ワッチョイ 932e-oL0b)垢版2017/08/18(金) 23:15:13.61ID:b4AgNHol0
>>840
> 岡崎図書館アクセス事件か
wikiを見てみると、1秒に1アクセスは「常識的で礼儀正しい」って世間の認識のようだね

男性の作成したクローラの動作
このクローラは、同時には一回しかリクエストを送らず、受信後に間隔をおいてから次のリクエストを送信していた
(1秒に1アクセス程度に調整)。これはクローラの動作としては「常識的」「礼儀正しい」程度のものであり、
応答を待たずに過大なアクセスを行うことで高負荷にさせる攻撃用のプログラムと異なる動作であった。

男性の業務妨害の強い意図が認められないとして起訴猶予処分となった
0844デフォルトの名無しさん (ワッチョイ ab4b-bEti)垢版2017/08/19(土) 00:40:39.77ID:vs90uVQG0
>>841 >>843
OKです

例えばですが同一サイトの目的の個別ページに100アクセスするのと
1アクセスになるのかわからないけど根こそぎリンクたどっていくのとどっちがいいのでしょうか

前者のやり方はググっても同じやり方の参考になるサイトがなくてコードを希望しました
後者なら似た感じのがあったので自分でも作れそうです
欲しい情報のほとんどが各ページ10字程度のTD1ケ所だけです
素人考えで該当のページから必要な部分だけ抜いたほうがいいのかなって思ったんですがどっちがいいのでしょうか
0847デフォルトの名無しさん (ワッチョイ 9306-JJVS)垢版2017/08/19(土) 09:53:56.58ID:OPyAj3On0
必要な情報は提供せず、こちらが知りたいことだけ教えろ!
これがこのスレの質問者のデフォ
0849デフォルトの名無しさん (ワッチョイ 2baa-PF2c)垢版2017/08/19(土) 12:32:35.39ID:9KU7ntuJ0
岡崎図書館事件では、逮捕されている。
第三者機関である裁判所から、逮捕状も取れている

裁判所だから、警察などの行政執行機関じゃなくて、司法の判断で、ほぼ有罪になる。
単に、起訴猶予処分にしたというだけ

1秒に1回なら、アクセスしても無罪というのは、
無罪になるために、こういうのが常識ですよって広めただけで、
実際には、逮捕状も取れている

robots.txt に従っていないと、相手のサイトが訴えるのは自由だから、
各社の検索エンジンは、1日1回しかアクセスしない
0852デフォルトの名無しさん (アウアウカー Sa1d-R5c0)垢版2017/08/19(土) 13:55:32.82ID:stRE+6ELa
>>836
そこまで分かってて何で組めんの?
基本的な問題で躓いてるみたい。

君はどういう方針で組んでるの?
普通はそういうサンプル組めたらURLを変数に置き換えて、指定のURLを引数にして4つのデータを取得するプロシージャ作ると思うんだが。

Function Get4Data(strURL As String) As String()
Dim strData() String
.
.
.
Get4Data=strData
End Function

Sub MainProc()
Dim strData() As String
Dim i As Long
Dim j As Long
For i=2 To 102
strData=Get4Data(Cells(i,1).Value)
For j=0 To 2
Cells(i,j+2).Value=strData(j)
Next j
Next i
End Sub

4つのデータに意味を意識するならユーザー定義型を返すプロシージャにしてメインでは配列の利点を使わない。(jを使わない)
この辺は趣味の問題だと思うけど。

なお、スマホから打ってるからコードには間違いが有るかも。
0853デフォルトの名無しさん (ワッチョイ 2baa-PF2c)垢版2017/08/19(土) 13:57:02.56ID:9KU7ntuJ0
別に反対とは言わないけど、
相手のサイトが、業務妨害で訴えるのは自由だから、逮捕されるよってだけ

コンビニのアイスクリームのケースに入って、写真を撮っただけで逮捕されてる

被害額は、0円なのにw
気持ち悪くて、客に出せないから、アイスクリームを全部捨てましたって

相手は、何とでもできる。
無傷でも、被害額を請求できる
0855デフォルトの名無しさん (アウアウカー Sa1d-R5c0)垢版2017/08/19(土) 14:16:21.11ID:stRE+6ELa
岡崎図書館の場合は図書館側に問題があって、プログラムでアクセスした時にそれが顕在化したということだったと思うが。

ただし、プログラムでのアクセスはサーバーをダウンさせることもあり得るわけでそれはアクセスの程度問題であるということ、過度なアクセスはサーバー側にとっては迷惑であるということ、不正アクセス防止法は意図しなくても問えるということは、留意する必要があるだろう。

要は無断でのアクセスは迷惑になるから気をつけてってこと。
そういう意識があって、でもそれほどアクセスが有るわけじゃ無いから連絡はしなくても良いだろうという判断ならそれもありじゃないかとも思う。
これが全く気にもせず、人のことはどうでも良いと考える人ならもう教えないし、プログラム組むのも辞めた方が良いと思う。
そういう人のプログラムって動けばOKの独りよがりプログラムになって周りが迷惑になりがちだから。
0858デフォルトの名無しさん (アウアウカー Sa1d-R5c0)垢版2017/08/19(土) 14:33:28.32ID:stRE+6ELa
仕事でWebから情報取って来るプログラムを作ったときは客にその旨を説明し、先方には実際のプログラムのソースコードと一緒にどういう手順でアクセスするかの説明を提示して貰った。
先方と言っても会社は違うけど客の会社の関連会社で情報取って来るプログラムもその会社関連の仕事の中の一部だったわけだけど。
先方が承諾することは分かってたけど一応報告すべきってことで。

>>839
そういうわけで手順を踏んで許可を取れば問題ないから幇助には当たらない。
0864デフォルトの名無しさん (ワッチョイ 932e-oL0b)垢版2017/08/19(土) 18:37:05.55ID:lbryh9n10
>>849
> 1秒に1回なら、アクセスしても無罪というのは、
> 無罪になるために、こういうのが常識ですよって広めただけで、
> 実際には、逮捕状も取れている
不起訴になってるじゃん
前例ができたから、今後は逮捕されることもないでしょ
0871デフォルトの名無しさん (ワッチョイ 710d-Jcyw)垢版2017/08/20(日) 09:23:54.53ID:B8YXLqYv0
>>861
コードが間違ってるから
0873デフォルトの名無しさん (ワッチョイ 1101-bEti)垢版2017/08/20(日) 11:34:29.55ID:xnxdM6Sy0
初心者ですいません。教えてほしいです。

シートが2枚あり、1枚目のシートの特定セルに「デリ」と入力後、
2枚目シートの特定セルにデリと入力されるのを作ってるのですが1枚目のC13のは反映されるのですが、C14以降が反映されません
ご教授お願いします
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Integer
Dim name As Variant
Dim linenm As Integer
For i = 13 To 52
If Intersect(Target, Cells(i, 3)) Is Nothing Then
Exit Sub
Else
'デリがもし記載されていれば
If Cells(i, 3).Value = "デリ" Then
'デリが記載の名前をnameに代入
name = Cells(i, 3).Offset(0, 1).Value
'ワークシート(シフト)で、nameに代入されている名前の行数を取得
linenm = Application.Match(name, Worksheets("シフト").Range("A1:A60"), 0)
Worksheets("シフト").Cells(linenm, 2).Value = "デリ"
End If
End If
Next i
End Sub
0874デフォルトの名無しさん (ワッチョイ 5b6d-5Iur)垢版2017/08/20(日) 13:16:25.67ID:hXI6dDhp0
>>873
ここがおかしい
targetがcells(14,3)だとループから即抜けて終わる
For i = 13 To 52
If Intersect(Target, Cells(i, 3)) Is Nothing Then
Exit Sub
Else

以下のように書き換える


Dim linenm As Integer
'範囲外だったら終了
If Intersect(Target, range(Cells(13, 3),cells(52,3))) Is Nothing Then
Exit Sub
endif

'メイン処理
For i = 13 To 52


こうすれば何をしているかわかりやすいと思う
0875デフォルトの名無しさん (ワッチョイ 5b6d-5Iur)垢版2017/08/20(日) 13:17:04.87ID:hXI6dDhp0
で、更に言うと、スコープの関係でWorksheet_Changeから別シートは触れ無くないか?
以下はエラーになる気がする
Worksheets("シフト").Cells(linenm, 2).Value = "デリ"

以下のようにすると動くと思う
'worksheet1
Private Sub Worksheet_Change(ByVal target As Range)
'無限ループを抑制する
Application.EnableEvents = False
'この時点で選別する
If Intersect(target, Cells(i, 3)) Is Nothing Then
Exit Function
Else
'標準モジュールに投げる
foo (target)
End If
Application.EnableEvents = True
End Sub

'標準モジュールの内容
Function foo(ByVal target As Range)

Dim i As Integer
Dim name As Variant
Dim linenm As Integer

'範囲外だったら終了
If Intersect(Target, range(Cells(13, 3),cells(52,3))) Is Nothing Then
Exit Sub
endif

'メイン処理
For i = 13 To 52
0876デフォルトの名無しさん (アウアウカー Sa1d-Enn5)垢版2017/08/20(日) 14:44:51.18ID:Qs6CySsIa
>>875

874理解しました。
なるほどです。

外出中なので検証できませんが、
changeイベントはシート1の値を対象で
イベントが発生すればifを実行

ifでシート1にデリが記載されていれば
シート2にデリを入力

というのは不可能なんでしょうか、、
帰ったらやってみます。
0879デフォルトの名無しさん (ワッチョイ 1101-8l/3)垢版2017/08/20(日) 22:03:48.69ID:xnxdM6Sy0
>>878
今戻って書き直したら正常に動作しました。

ありがとうございます。

別件の質問なんですが、
worksheet_changeは
セルの値を削除した際には対応していないのでしょうか。
うまくいかない・・。
0882デフォルトの名無しさん (ワッチョイ ab4b-ClLO)垢版2017/08/20(日) 22:32:57.93ID:ikiDo2Le0
>>846
余った金で買ってるですら時間かけれなくて基本放置メインの優待株なのにちまちま転売なんて時間ないですよ
休みは家族サービスしなきゃなんないし
暑いなかヨドバシ並んだり労力に合わないこと無理

>>845
いや初心者なんでほんと申し訳ないが相手のサーバーの性能とか構成とかどうやって調べるの?
知りたいしやり方具体的に教えてほしい

自分で貼ったコードは今は理解出来てるけど
初心者からすると3日前ならポカーン
正直debug→sellsなんて簡単な事すらわからないレベルが初心者ですw

>>852
ありがとうございます
変数の置き換え等がまさに知りたかった事です
改変出来るサイトが見つけられず完全にお手上げでした
お酒入ってるんで明日試してみます

質問ですが456行目の...はなにか入るかのでしょうか?それともこのままでしょうか?
tb3のみの取得の場合でもこれでいけるのでしょうか?
0886デフォルトの名無しさん (オッペケ Sr4d-lC4d)垢版2017/08/21(月) 12:19:06.20ID:EyA7fO9yr
すまぬ。助けてほしい。

シート上にActiveコントロールのボタン配置します。
なぜか、勝手に大きくなったりちいさくなったりして堪らん。

解決策ありますか?


別件でもうひとつ。
シート右クリックメニューにコマンド追加してます。(マクロで追加)

端末によって、改ページシート表示時なら、コマンド表示されるけど、標準表示時は標準されない。

何が原因ですかな。標準表示でだしたいの。
0887デフォルトの名無しさん (アウーイモ MM85-vD8I)垢版2017/08/21(月) 12:42:03.35ID:a8XpI6K5M
>>886
後者に関しては
Cellって名前のCommandBarを取得して変更してると思うけど
改ページと標準で名前はどちらもCellだけど実体は別々のCommandBarだから
改ページの方だけしかメニュー追加できてないんだろう
ついこないだ自分も全く同じ現象にハマった

そのことも加味して作ってるサンプルググれば出てくるよ
出先だから細かいことは書けん
0893デフォルトの名無しさん (ワッチョイ 5b6d-DBYK)垢版2017/08/21(月) 20:36:29.86ID:F/qAyFl80
変数のウォッチ式を見ていると、変数の中身が勝手に変わるという現象に遭遇しました
以下のコードのどこかに問題があると思います。問題を絞り込み切れませんでした
直前にIEで「メモリを使い切りました」というエラーが出た場合に起こる頻度が高い気がしています
(このマクロは、IEから落とした巨大なデータに対して処理をかけるものです)
PCをしばらく動かしてからマクロを走らせると、何度やっても
特売コード名 = ""
のところで勝手に変数が書き換わります
再起動直後には変わる事はありません
IEのエラーに原因があるのでしょうか?
また、他に見るべきところなどはあるのでしょうか

マクロの内容は
・マクロファイル自体はマクロだけです
・データファイルをopenし、フィルターを掛けて新ブックにコピー、保存
これを繰り返しています

コードは以下です

Set 特売コードリスト = ThisWorkbook.Worksheets("list")
リスト最終行 = 特売コードリスト.Cells(Rows.Count, 1).End(xlUp).Row 'この時点で変数「リスト最終行」にはdoubleの140が格納されている

'特売コードのタイトル設定
For i = ヘッダ列数 + 1 To 最終列 Step 7
特売コード = RIファイル.Sheets(1).Cells(ヘッダ行数 - 1, i).Value * 1 '特売コードはlongの13桁です(JANコードです)
特売コード名 = "" '何故かここで変数変数「リスト最終行」が「特売コード」の値になります。13桁なのでものすごい量の処理になってしまいます
'以降、他の処理
Next
0895デフォルトの名無しさん (ワッチョイ 5b6d-DBYK)垢版2017/08/21(月) 20:48:40.29ID:F/qAyFl80
>>894
宣言は型も指定して、最初にまとめてしてます。
しかし宣言を削除しても変わりませんでした

代入は、していません。
ステップインで以下の行を実行すると、「リスト最終行」という全く関係ない変数の値が変わっています
可変変数かと思いましたが、一体何なんでしょうか
特売コード名 = "" '何故かここで変数「リスト最終行」が「特売コード」の値になります。13桁なのでものすごい量の処理になってしまいます

また、コードの最初に以下の高速化を入れていますが、関係あるでしょうか(もちろん最期に解除しています)
Application.EnableEvents = False
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
0896デフォルトの名無しさん (ワッチョイ c191-wXqg)垢版2017/08/21(月) 21:01:33.61ID:UpqFzRYS0
>>895
コードを切り出す時に本当は関係ある所を
関係ないと思い込んでいる可能性があるから
コード全体を何処かにアップした方が早く解決すると思う
0898デフォルトの名無しさん (ワッチョイ b111-Ovym)垢版2017/08/21(月) 21:21:28.12ID:WASZaGRQ0
>>895
long型の変数なら何らかの形で代入処理してないとあたいは変わらんはずだがな
自作関数にbyrefで渡したりしてねーかな
まあ、何にせよ上の人が言ってるようにもう一度全体を見直そう
0900デフォルトの名無しさん (ワッチョイ 5b6d-SlN8)垢版2017/08/21(月) 21:41:38.22ID:F/qAyFl80
>>898
参照みたいというのは、私も感じました
しかし本当にこの行だったのです
特売コード名 = "" '何故かここで変数「リスト最終行」が「特売コード」の値になります
何度やっても結果が参照だか可変変数だかコード内の改行「 _」にしか見えなかったのですが、絶対に違うのです
メモリが書き換えられているのか、ポインタがぶっ飛んでいるのが、そこまで調査する能力はありません

同僚に「顔青白いけど大丈夫か!?」と言われました。

明日もう一度試してみます
0903デフォルトの名無しさん (ワッチョイ 5b6d-bEg4)垢版2017/08/21(月) 22:55:53.80ID:F/qAyFl80
>>902
プロンプトでデータファイルを指定し、開いた直後に最終行列を取得しています
もちろんこの際にキャンセルなどの処理は行っておらず、普通に選択しています

若干うろ覚えですが、以下のはずです

'dataファイルを指定
Set data = Workbooks.Open(Application.GetOpenFilename("Microsoft Excelブック,*.xls?"))

'最終行列
最終行 = data.sheets(1).Cells(Rows.Count, 1).End(xlUp).Row
最終列 = data.sheets(1).Cells(ヘッダ行数, Columns.Count).End(xlToLeft).Column
0908デフォルトの名無しさん (ワッチョイ c191-wXqg)垢版2017/08/22(火) 07:30:25.87ID:IrcFtIiG0
>>907
解決方法としてはVBEからコードをエクスポートして
記号を表示できるテキストエディタで開くとか
0911デフォルトの名無しさん (ワントンキン MMd3-yDuE)垢版2017/08/22(火) 13:57:55.46ID:bO04JkUdM
ie制御系の本てあんまりないよね。ネットでちまちま調べながらやってるけどエラーがおこってその原因を調べるのも一苦労。数百回のループの中で99%成功一度だけエラーとか読み込み関係だと思うんだけど、こうすれば絶対防げるとかあるんかね。
0912デフォルトの名無しさん (JP 0Heb-oL0b)垢版2017/08/22(火) 14:17:54.96ID:BcNwm5wtH
>>911
なんのためにIEを制御したいのかわからないけど、データ取得が目的ならIEを制御するという
方法をやめて、直接HTMLを取得して解析する方法にするとか。
0913デフォルトの名無しさん (アウアウエー Sa23-Ovym)垢版2017/08/22(火) 14:32:57.14ID:3oFcm+Eea
変数が日本語で不具合でたことはないな
怪しいのは、変数の方をちゃんと指定してないんじゃないかなってとこ
最初の方でdoubleが入ってるって言ってたよね
〜.Columnの参照持ってきちゃってるとかね
longで型指定してみたら
0914デフォルトの名無しさん (ワントンキン MMd3-yDuE)垢版2017/08/22(火) 14:52:26.20ID:bO04JkUdM
>>912
エクセルから値をコピー→会社のシステム(ie)のテキストボックスにペースト→サーチボタン押す→チェックボックス押す→リストボックスから選ぶ→決定ボタン押す
てのを毎日数百件。
こんなのはスクリプトでも手作業でもなく、エクセルアップロードして終わりとかにして欲しいんだけど。
0919デフォルトの名無しさん (アウアウウー Sa85-c2A1)垢版2017/08/22(火) 19:53:03.47ID:j7l9pWc0a
>>836
とりあえず、>>745と合わせてプログラムを類推して、ツッコミどころを順々に修正しながら8つのパターンで組んでみた。
たぶん、5つ目のサンプルでB2からB101まで取得データを書き込めると思う。
ただし、実際にはTHタグが何個あるかわからないのでIE上でF12キーを押して問題のテーブルを表示させてTHが何個あるかを確認して修正すること。
現在のプログラムはTHが3個、TDの2番目からデータを取得する前提で組んでいる。
(0始まりでTHは0、1、2なのでTDの2番目は全体で4番目)

https://pastebin.com/3sBqwsN9
0921デフォルトの名無しさん (アウアウウー Sa85-c2A1)垢版2017/08/22(火) 20:14:43.78ID:j7l9pWc0a
>>893
コード示してあるけど、変数宣言部分が無く、また変数名から変数の型も類推できない。
これでは変数がどうなっているのかわからない。
変数に日本語使うのは自分ならしないけど、それよりも変数名から型が分からないのはほかの人も困らないか?

特売コード名=""のところと書いてあるが、デバッグ時に黄色になっているのはその次の行?
この行が黄色になっているならその前の行の実行でリスト最終行が変化したことになる。

下に変更してDebug.Print Typename(特売コード名)のところにプレークポイント置いて実行してみるとか。
For i = ヘッダ列数 + 1 To 最終列 Step 7
特売コード = RIファイル.Sheets(1).Cells(ヘッダ行数 - 1, i).Value * 1 '特売コードはlongの13桁です(JANコードです)
特売コード=123
Debug.Print リスト最終行
特売コード名="ABC"
Debug.Print リスト最終行
Debug.Print Typename(リスト最終行)
Debug.Print Typename(特売コード)
Debug.Print Typename(特売コード名)
特売コード名 = "" '何故かここで変数変数「リスト最終行」が「特売コード」の値になります。13桁なのでものすごい量の処理になってしまいます
'以降、他の処理
Next
0922デフォルトの名無しさん (ワッチョイ 130f-yDuE)垢版2017/08/22(火) 20:24:31.59ID:fju/pSre0
>>915
>>916
VBA以外やった事ないんだよね。ie操作はエラーになった時の原因や対処がブログとか個人の質問回答とかで情報少なくて決定版みたいなの見つけにくいんだけど、別言語は充実してる?

>>918
ありがとう。でも会社のパソコン外部ネットワークにつながらなくてUSBとかの持ち込みもだめなんだよ。
一応ieの部品に対して行って欲しい処理自体はできてるから、ループ中に止まりにくい方法調べてみます。
0924デフォルトの名無しさん (ワッチョイ 1311-slju)垢版2017/08/22(火) 20:57:35.78ID:1JK3C2LQ0
ExcelからIEを操作せずにバッチスクリプトでcURLやWgetみたいなHTTPクライアントを使ったらいいと思うけど
外部ネットワークにアクセスできなくて追加インストールもできないとなるといろいろ詰んでるね

Powershellが使えるならそれほど苦労せずスクリプト化できるよ
https://docs.microsoft.com/en-us/powershell/module/Microsoft.PowerShell.Utility/Invoke-WebRequest
0925デフォルトの名無しさん (ワッチョイ 9352-jLVh)垢版2017/08/22(火) 20:59:25.09ID:yhGjK5+g0
>>923
なるほど。
うちの職場も無駄な作業が多いけどみんな疑問をいだかないことに対してなんてアホの集団なんだろうと思ってたけど
「プログラミング的な知識が無いとやり方に疑問を持てない」のが原因だったか。
これで疑問が氷解した。

あと1つこの職場で学んだことだが
せっかく自分が自動化するVBAのツールをつくって何人かにそのツールをあげても「使ってくれない」。
これは便利なのが嫌い」なのではなくて「自分が作ったツールじゃないからなにをしているかがさっぱりわからないから怖くて使えない」からだということだ。
0926デフォルトの名無しさん (ワッチョイ 9352-jLVh)垢版2017/08/22(火) 21:01:25.05ID:yhGjK5+g0
だから完全なるアホの集団ではないのかもしれないが、やっぱりアホの集団にはかわらない。
そんな周りの人たちの心理がわかる自分は天才だということだ。
0927デフォルトの名無しさん (アウアウカー Sa1d-R5c0)垢版2017/08/22(火) 21:39:28.52ID:RSpbi9dUa
>>922
クリップボードとかSendkeysとか使って無いだろうな?
特にSendkeysは危険。
絶対使うべきじゃない。
分かって使うなら良いけど。

あと、Domを使ってるならクリック時にsubmitでなくClick使ってる場合は注意。
submitは送受信前提だから直後はIEがBusyになるけど、Clickは送受信前提じゃないから(と俺は思ってるけど別の理由かも)いっぱく置いてBusyになることがある。
つまり、Busyチェック時にはかからず、チェック抜けてからBusyになることがある。
俺の場合はClickの時だけチェック前に300msくらいSleepしておく。
0929デフォルトの名無しさん (アウアウカー Sa1d-R5c0)垢版2017/08/22(火) 22:56:13.57ID:3iMCLjz4a
>>928
そのページの作りによる部分は有るからね。
submitでさえSleep入れる必要があるかもしれない。
遷移した後で少し待ってからさらに遷移する場合とかもあるし、どうしてもそのページに合わせる部分は有るでしょう。
0930デフォルトの名無しさん (ワッチョイ ab4b-bEti)垢版2017/08/22(火) 22:57:24.09ID:vl5o4wqs0
>>919
凄く作り方の参考になるし完璧な説明です
ありがとうございます。
<TABLE>
<TR>
<TH>Title1</TH>
<TD>DATA1</TD>
</TR>
<TR>
<TH>Title2</TH>
<TD>DATA2</TD> 取得すべき最初のデータ
</TR>
<TR>
<TH>Title3</TH>
<TD>DATA3</TD> 取得すべき2番目のデータ
</TR>
.
.
.
<TR>
<TH>Title9</TH>
<TD>DATA9</TD>
</TR>
</TABLE>
-------------------------------------------
この構造の場合、下記はどのようになるのでしょうか?
TABLE群 -> colTable(0)
TR群 -> colTable(0).childNodes
TH群 -> colTable(0).childNodes.Item(0).childNodes(0番目〜2番目)
TD群 -> colTable(0).childNodes.Item(0).childNodes(3番目〜11番目)
0931デフォルトの名無しさん (アウアウカー Sa1d-R5c0)垢版2017/08/23(水) 00:05:41.99ID:FdVTMyW1a
>>930
その場合は複数のTRがTABLEから見て子どもでしょ。
だからTRは最初のchildNodes.Item()の括弧の中が2番目からカウントアップ。
で、TDはそれぞれのTR内で常に2番目なのでchildNodes.Item(カウントアップ).childNodes.Item()の括弧の中は2番目。
各番目は0始まりだから2番目ってことは1ってことね。
この場合はcolTRも使わない。(Set colTR =で始まる文がいらない。)

Cells(i, 2).Value = colTable(0).childNodes.Item(1).childNodes.Item(1).innerText
Cells(i, 3).Value = colTable(0).childNodes.Item(2).childNodes.Item(1).InnerText
Cells(i, 4).Value = colTable(0).childNodes.Item(3).childNodes.Item(1).innerText

多分、こんな感じ。
0932デフォルトの名無しさん (アウアウウー Sa85-mYeN)垢版2017/08/23(水) 08:10:00.16ID:EgpJbwY2a
全くの素人です
質問させてください

A1=1の場合タブの色を赤
A1=2の場合タブの色を青
としたくて
A1にはsum関数で数式を組んでるんだが1や2になっても反映されない
手入力で数値を入れるかセルをダブルクリックしてエンターを押すと反映される

何故でしょうか。
0935デフォルトの名無しさん (アウアウウー Sa85-mYeN)垢版2017/08/23(水) 08:18:48.53ID:EgpJbwY2a
コードは
private sub worksheet_change(ByVal
target as range)
If target.address〈〉"A1" then exit sub
If Target = "1" then Activesheet.Tab.ColorIndex = 9
If Target = "2" then Activesheet.Tab.ColorIndex = 3
End Sub

初心者ですのでここはこうした方がいいなどアドバイスいただけると幸いです
0937デフォルトの名無しさん (アウアウウー Sa85-mYeN)垢版2017/08/23(水) 08:33:36.33ID:EgpJbwY2a
>>934
シートのタブ色変更なんですが条件付き書式でできますか?
0943デフォルトの名無しさん (アウアウウー Sa85-mYeN)垢版2017/08/23(水) 10:15:50.03ID:EgpJbwY2a
>>940
ご教示下さい
0944デフォルトの名無しさん (アウアウウー Sa85-mYeN)垢版2017/08/23(水) 10:23:11.79ID:EgpJbwY2a
>>941
動きませんでした
0945デフォルトの名無しさん (アウアウウー Sa85-mYeN)垢版2017/08/23(水) 10:24:44.20ID:EgpJbwY2a
>>942
A1の数字は一定期間ごとに変化するんですがそれには対応できないということになりますか?
0947デフォルトの名無しさん (ワッチョイ 5991-7WL/)垢版2017/08/23(水) 11:13:45.38ID:yxvWLKA00
>>935
そもそも
Target.addressって絶対参照が返ってくるんじゃなかったっけ?
でもそれなら手入力でも反映されない気がするなぁ

あと、たとえばB1のセルを変更してA1の計算結果が変わったとしても
A1の数式を変更したわけじゃないから
targetにはB1が渡されるだけじゃない?

全部予想ですまん
0949デフォルトの名無しさん (アウアウウー Sa85-mYeN)垢版2017/08/23(水) 13:56:51.41ID:EgpJbwY2a
>>948
ありがとうございますどう組んでいいかわからないので
Worksheet_change
calculateを調べてみます
0950デフォルトの名無しさん (ドコグロ MMb3-x4Vn)垢版2017/08/23(水) 18:51:26.23ID:Rd2CDMDCM
A1セルの数式を変えていいならユーザー定義関数でできる
例えばA1に=Sum(B1:B2)と定義してるなら標準モジュールに
Function XXX(R As Range) As Double
Dim Result As Double
Result = Application.WorksheetFunction.Sum(R)
Select Case R
Case 1: ActiveSheet.Tab.ColorIndex = 9
Case 2: ActiveSheet.Tab.ColorIndex = 3
End Select
XXX = R
End Function
を定義してA1セルを=XXX(B1:B2)に書き換えればいい
0951950 (ドコグロ MMb3-x4Vn)垢版2017/08/23(水) 18:54:14.54ID:Rd2CDMDCM
すまんちょっと間違えてたわ
Function XXX(R As Range) As Double
Dim Result As Double
Result = Application.WorksheetFunction.Sum(R)
Select Case Result
Case 1: ActiveSheet.Tab.ColorIndex = 9
Case 2: ActiveSheet.Tab.ColorIndex = 3
End Select
XXX = Result
End Function
0953952 (ワッチョイ ed6f-2x4P)垢版2017/08/24(木) 02:23:07.38ID:gFPKAoW/0
>>935
もしA1に=SUM(B1:B2) ってなっているなら

If Cells(1, 1) = "1" Then ActiveSheet.Tab.ColorIndex = 9
If Cells(1, 1) = "2" Then ActiveSheet.Tab.ColorIndex = 3

これだけでいけた Target は変更(入力)した場所が入っているから
0957デフォルトの名無しさん (ワッチョイ 29aa-vgeI)垢版2017/08/24(木) 23:00:01.92ID:q91vBAgZ0
ADOでエクセル上にあるテーブルに接続していますが、
テキストデータを追加したり、更新したりすると先頭にシングルクォテーションが付いてしまいます。
これは仕様だと思いますが、付かないようにする方法ないでしょうか?
後から消すって方法は無しでお願いします。
0958デフォルトの名無しさん (オッペケ Sr6d-d2qD)垢版2017/08/25(金) 01:43:07.95ID:KTLmtMM0r
>>914
> エクセルアップロードして終わりとかにして欲しいんだけど。

システムへの大量レコードのアップロードって、ミスした時が大変なのよ。
アップロードするファイルを間違えたりするやつが必ずいるから。

場合によっては、システムを停めて修正しなければならなくなる。

なので、コピペによる数百件の手入力は言わば安全策。
派遣スタッフが多い職場でありがちだよね。

というわけで、手入力作業をIE制御で自動で行うツールはどうしても必要になるんだけど、エラートラップ(例外処理)をきちんと作り込まないと逆に使いづらくなるので要注意。
0966デフォルトの名無しさん (アウアウカー Sa85-HXRX)垢版2017/08/25(金) 12:55:04.81ID:4kzNGnM2a
>>958
それはそういうシステム作った奴が悪い。
いくらでも規定のフォーマットじゃなければ受け付けないシステムは作れるだろ。

CSVなんかでもカンマ区切りじゃなくて普通ならどうやってもキーボード入力出来ない文字で区切るなんてやるし。
それで区切ってなければ1行のデータ数不正で受け取らないなんて簡単。
それ以外にもチェック項目入れてEXCEL上で出力編集できるプログラム組めば良いし。
0970デフォルトの名無しさん (ササクッテロ Sp6d-Hgyh)垢版2017/08/25(金) 16:19:40.23ID:YOvDFOChp
バックアップを取ってリカバリしないの?
0972デフォルトの名無しさん (オッペケ Sr6d-d2qD)垢版2017/08/25(金) 18:24:10.85ID:KTLmtMM0r
>>966
フォーマットの問題じゃないんだよね。

アップ済みのファイルを再度アップしてしまったり、修正前のファイルをアップしたりとか、フォーマットに問題はないのでシステムは受け付けてしまう。

その辺をリカバリできるシステムにしようとするとまた莫大な金がかかるので、上はなかなか動かない。

それによってどのくらいのコスト削減あるいは利益が見込めるのか、まずは数字出さないと話も聞いてもらえないよ。
0976デフォルトの名無しさん (オッペケ Sr6d-d2qD)垢版2017/08/26(土) 07:22:16.86ID:vvYv5Hier
>>974
一応、ファイルのフォーマットにはユニークなカラムはあるんだけどね。
システム側では、そのカラムはキーになってない。。。と思われ。

さすがにシステムの仕様まではわからない。
0977デフォルトの名無しさん (ワッチョイ 1d4b-rG16)垢版2017/08/26(土) 09:32:33.78ID:5dccF0/k0
>>931
ありがとうございます。
あれから色々試しましたがいくつか問題点があります。

問題1
Dim el As IHTMLElement を削除するとTDが取得出来ず、table丸ごとの取得となります。
問題2
Dim htmlDoc As HTMLDocument を削除するとエラーが出ます。
問題3
7番目のサンプルを実行するとこの部分がエラーをおこします。
objDOM.body.innerHTML = objXML.responseText

問題1についてtableデータ丸ごとでも取得後必要箇所を抜き出せばいいので用は足せます。
変わらなければそのままいこうと思っていますが相手サーバーへの負担は増えるのでしょうか?

問題2について削除しなければ問題ありませんがxml化時に下記3箇所をどのように記載を変更すればいいでしょうか?
Dim htmlDoc As HTMLDocument
Set htmlDoc = objIE.document
Set colTable = htmlDoc.getElementsByName("oppai")

問題3について下記の("htmlfile")が原因かと思ったのですがこのままでいいでしょうか?
それとも何かのシート名を入れるのでしょうか?
Set objDOM = CreateObject("htmlfile")

毎度すいませんがよろしくお願い致します。
0978デフォルトの名無しさん (ワッチョイ 86aa-oTLP)垢版2017/08/26(土) 13:59:12.95ID:1Xp/S2sl0
>>958
>システムへの大量レコードのアップロードって、ミスした時が大変なのよ。
>アップロードするファイルを間違えたりするやつが必ずいるから

人間は、必ず間違うから、絶対に回復機能が必要。
普通は、バックアップ・スナップショット機能で、前の状態へ戻れる

銀行では、アルバイト3人が、同じデータを入力する。
3人とも同じ金額の時だけ、合格

バリデ、validation
0982デフォルトの名無しさん (ワッチョイ 0a11-xpGE)垢版2017/08/26(土) 16:55:31.30ID:azDqTcfP0
>>972
>アップ済みのファイルを再度アップしてしまったり、修正前のファイルをアップしたりとか、

間違ったと気づいた時点でオペレータ自身が元に戻せるような仕組みを作るのはそれほど難しくないよ
手動でExcelを修正するステップやその前のステップを含めてシステム化するのが理想ではあるだろうけどね

ただ100~300万くらいのお金を莫大な金と言ってるんであれば自力で頑張るしかない
担当が変われば元の木阿弥だし、本来機械にやらせるべき仕事を人間がやってることによる逸失利益を加味したら安い買い物
0985デフォルトの名無しさん (ワッチョイ 0a11-xpGE)垢版2017/08/26(土) 17:49:54.05ID:azDqTcfP0
>>983
ははは、言いたいことはわかるけどそれは客が要件をすべて決めると思ってるやつの発想
費用に応じて提供出来る内容を変えてあげればいいだけ
そういう調整が出来ない人ばっかりだと苦労するよね

まあそこは論点じゃなく莫大な費用がかかると思ってるのは解決方法の選択肢が見えてないだけで
思ってるほどの費用がかからない方法も有るよってことよ
VBAのかわりにスクリプト書くだけなら100万もいらんし
0986デフォルトの名無しさん (ワッチョイ 0a11-xpGE)垢版2017/08/26(土) 17:55:27.18ID:azDqTcfP0
>>984
それは今でも発生しうる業務フローの問題でしょ?
誰かが確認するっていうステップが必要なだけで1件1件コピペ入力しなきゃいけないのとは別問題
確認が必要ならそのフローをシステムに取り込んであげればいい

機械で自動確認できるほうが楽だけどそれは必須じゃないじゃん
0988デフォルトの名無しさん (ワッチョイ ca11-+ULf)垢版2017/08/26(土) 18:39:24.64ID:O53zOlu10
>>985
> まあそこは論点じゃなく莫大な費用がかかると思ってるのは解決方法の選択肢が見えてないだけで
だから要件も見えてないのに選択肢が見えるわけないだろ w
>>984の件も数件なら後追いで修正できるけど1万件とかになると破綻するとかあるだろうし
0993デフォルトの名無しさん (ワッチョイ 3e1e-CSD/)垢版2017/08/27(日) 02:42:06.83ID:L7AzHdYH0
>>914
> こんなのはスクリプトでも手作業でもなく、エクセルアップロードして終わりとかにして欲しいんだけど。
と書いた時から、サーバ側も巻き込んだシステム全体の話になってしまって
このスレの範疇を越えるものになったんだろうな
それは多分「単純作業をVBAでなんとかしたい」と思ってただけの>>914にとって
「そんなことを議論されても俺にはどうしようもない・・・」と思ってると思う
10011001垢版Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
life time: 62日 11時間 19分 6秒
10021002垢版Over 1000Thread
2ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 2ちゃんねる専用ブラウザからの広告除去
★ 2ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.2ch.net/

▼ 浪人ログインはこちら ▼
https://login.2ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。

ニューススポーツなんでも実況