Excel VBA 質問スレ Part49©2ch.net
レス数が1000を超えています。これ以上書き込みはできません。
!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 地獄の社内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年にわたって深夜残業や休日出勤を厭わず作ってきた、地獄の社内システムの担当になったらしい。 >>7
ちょっとそうぞうしただけですっげーーーーーーーーーーーーーーーゲンナリした
うぇっっ 地獄とか書いてるけど、
全然地獄じゃないんだろうな。
強敵と戦う悟空みたいな感じで。 VBAが仕事っていいじゃねーか
業務の合間にマクロ作ってるけエクセルが得意な人扱いしかされない
カラオケが上手いとか酒が強いとかと同じ扱いだよ俺もVBAだけやってたいな 何か公開するとか解説記事を続けて書くとかしないと残るものがないよな >>9
おれ、ああいうののメンテナンスする仕事したこと有るけど地獄だよ。 inputとoutputがわかってんなら作り直したほうが… どう考えてもイチから作り直すべきだが、それを現場がどう理解してるかだわ
セルに値が入ってないと管理できない!とかありそう 質問失礼します。
ある一つのセルに、氏名コメント改行文字が5人分入っていて、選択するとformにテキストボックスが5人分用意されている所に、それぞれの氏名に合わせて入る様になっています。
やりたい事は、formのテキストボックスに作業者が入力したのの更新履歴を付けたいのです。
作業者は自分の氏名のテキストボックスに入力することになっています。
コマンドボタンをクリックしたタイミングで、どのテキストボックスが最後に変更されたのか取得できる方法が有りましたら教えてください。 >>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 >>17
追伸
「vba フォーム イベント」でググると色々とできることの幅が広がると思う。 しばらく前に騒ぎになったランサムウェアってVBAマクロなのか
マクロウイルスって今でもあるんだな >>19
ご回答ありがとうございます。
今回の件はAfterUpdateで対応出来ました。
今後の為にお聞きしたいのですが、例えばテキストボックスが100個とかあった場合、VBのコントロール配列の様に一つのプロシージャで100個のテキストボックスのAfterUpdateに対応することは出来ませんか?
よろしくお願いします。 >>21
「vba フォーム イベント withevents」とかでググれば、クラスモジュールを使ってイベント付きコントロールを配列またはコレクション化する方法が出てくる。
フォームの履歴管理には、クラス変数にフォームへの参照と、配列のインデックスまたはコレクションのキーなんかを渡して処理すればたぶんOK。 >>22
ありがとうございます。
witheventsを使用してテキストボックスのチェンジイベントをひとまとめに出来ました。
afterupdateをまとめれるともっと良かったのですが、それは無理そうなのでこれで満足です。
本当にありがとうございます! 100という10進数をDo loop を使って2進数に変換させるにはどのようにすればよいのでしょうか?
イメージとしては、100を2ずつ割っていってそこで出たそれぞれの余りの数をセルA1に表示させたいです。
よろしくお願い致します。 >>24
Do〜Loop縛りなの?
worksheetfunction,dex2binを使えば楽ちんだけど。 セルA1を毎回上書きしてるとか
まぁこの手の奴はぐぐれば腐るほどでてくるけどな セルA1を瞬時に上書きしていって、それで何をしたいんだか?
最終的な目標は何なのかワカンネ w 曖昧だけど設計まであるのにできてないのなら今どんなコードを書いてるのか提示して質問してほしいなぁ
いっそのこと「この仕様を満たすコードをください!」と言ってくれてもいいけど はい、作ったよ
仕様満たしてるかどうかはあんたたちで
みっちり見てね
バグ見つけたら教えてね
で仕様齟齬をあぶり出してもらわないと
仕様を具体的に言わないクライアント(身内だけど)とは付き合えない >>34
作ったモノ触らないと気がすまない連中なんだよ
もちろん作る前に要求仕様は聞くけど
後からチマチマと何か言ってくる >>35
面倒でも文書化して読んでもらうのがいいよ
読んで始めて、自分が何を欲しているか気づく場合もあるし
後は、プロトタイプかな
全部できて「これ、全然違うし」とか言われるリスクあるなら、そういうことやってみたらいいと思う このスレの人間って質問者置いてけぼりであーだこーだ言うのが多いけど、一番ムカつくのは、
肝心の質問者が自分のやりたい事はこういうことだって言わないこと。
少しは自分の質問に責任くらい持ちやがれ こういった輩が多いから双方の軋轢が絶えないんだろな
先方はまったくの門外漢だ て前提で仕事を引き受けられない
相手も自分と同レベルだと信じて疑わない もしくは少し下ぐらい
初めて住宅を新築する顧客が、いきなり詳細設計図渡されて理解できるか?
ソッチで仕様書と図面引いてください って言ってるのと同様だぞ?
引き受けるからにはその仕事を請け負う責任も勿論だが
これから実施する作業の概要・概略を相手に理解してもらうテクニックだって
必要だろ それを持ち合わせないならサンプル品なり試作品なり作ってでも
相手と同じレベルで進捗を図るのが普通じゃ無いのか?
こっちはざっくり動きや結果を見越せるけれど、相手にもそれを要求するのは
傲慢でしかないんだが
いわんや、相手の業種・業態に依ってはコチラ側が思いもしないような入力・
操作が要求されるケースだってままある
仕様も要件も書き出せますよ なんてぇ企業相手ならおまえら不要だろ
社内で事足りるわ
も少し謙虚に成れんのか 会議だ仕様だ要件だなんてぇことに無駄な時間を
費やすぐらいなら、とっとと試作して「こうですか?」で何歩も進むだろ
いやすまん なんでもない ここの人間は質問者から金貰ってるわけでもなんでもねーわ >>39
言いたいことはわかる
だが発言のベースが「やったけどダメだった!答えを教えろ!ダメだったモノは見せない!」じゃあんまりだと思う 最近、趣味で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のデータを受けるやり方はあるのでしょうか? お手数ですが教えてください >>43
splitしたのがうまく行ってないと思う
ステップイン で実行しながら
ウォッチ式 を見ると変数の中身が分かり安いよ
そのテキストを上げてもらえればこっちでも確認する >>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の最終行のデータが配列に格納されないけど問題ないか? >>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次元配列じゃなくて配列の配列になるけど、むしろこっちの方があとで楽だと思う。 >>44-46
早々に回答ください、どうもありがとうございます。
いろいろ回答を頂いておきながら、大変申し訳ないのですが、
38行目のデータをよく見たところ、TAB区切りではなく、ここだけスペースが入っていました
(他は、各行に2個の要素があったのですが、ここだけ要素が1個でした)
そして、これを修正したら、エラーなく実行できました。
お手数をおかけし、申し訳ありませんでした。
おっしゃる通り、j のループは不要ですね。(いろいろ修正していて、j を使わなくなったようです)
> だとTextDataの最終行のデータが配列に格納されないけど問題ないか?
いえ、ちゃんと最終行まで格納出来てました
(UBound()は要素数を表しているように思います)
> ReDim sqrDim(LBound(tmpDim), UBound(tmpDim))
ReDim は使ったことがないので、また調べてみます
以上、ありがとうございました。 >>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 )
申し訳ありませんでした >>47
> (UBound()は要素数を表しているように思います)
一応言っておくと、これは間違い。
UBound(tmpDim) は配列tmpDimのインデックスの最大値を返す。
TextDataが500行(vbLfが499個)だとしたら、tmpDimのインデックスは(0 to 499)になるから、UBound(tmpDim) は499を返す。
このコードのsqrDim(500)が全部埋まってるのであれば、TextDataは501行あるはず。
まあ結果がOKならいいんだけどね。 失礼、>>49に間違い。
sqrDim(500) だとsqrDimの要素数は501だから、全部埋まってるの場合のTextDataの行数は502行になるはず。 >>49-50
> 一応言っておくと、これは間違い。
> UBound(tmpDim) は配列tmpDimのインデックスの最大値を返す。
申し訳ないです。
おっしゃる通り、ググってみるとそのように書いてました。
なお、TextDataは実際には400行前後のため、偶然上手く動いているように見えてたのですね
(実際は、400〜499までループが回っており、タチの悪いバグになるところでした、感謝です)
前にC言語を少しやっていたので、同じ扱いだと思っていましたが違ってたんですね
わざわざありがとうございます。 >>51
そう
[LBound, UBound) じゃなくて [LBound, UBound] で回さなきゃダメ ここの強者はExcelVBAエキスパートの資格持ってるの?
簡単そうだから取ろうかなと思ってる コンピュータ関連も色んな資格あるけど、ああいう資格を基準にして採用している所ってどれだけあるんだろ。 基準にはしないかな
あーできるんですねって程度。どちらにしても実地試験は受けてもらう 俺、プログラムは作れるけど、試験は落ちそうだな。
DimとかRowとか、短い文字は打てるんだけど、
長いのは、普段コピペしてるから、打てない。
最近、やっとColumnsを間違えずに打てるようになったわ。
それまでは、Corums? ん? Colmns? え? Culomus? 違う?
Colums? わかんね。 もう諦めてコピペしよう、みたいな感じ。 プログラムの実技試験で暗記力が必要なのはそろそろどうかとは思う 10年選手だけど
フィボナッチとかハノイの塔とかソラで出できないぞ俺 それは数学の知識の問題だと思うので、別にできなくてもいいと思う。多分一生役に立たない
でも最小二乗法とか漸近線、偏差値など、統計学的な知識はあったほうが良いと思う >>53
昔、某掲示板で質問した人に話の内容から初心者として扱ったらその資格持ってるとのことでびっくりしたことがある。
どんな資格でもそうだけど、そういうもんなんでしょう。
そうしないと受かる奴いなくなっちゃう。 >>60
そんな問題が実際の案件に出てきた時に最適なコードが書ければ良いでしょ。
それにその程度の話ってググレば出てくるでしょ。
そんなのは何かあったよなと思うことが出来てググレればOK。
それよりも上手いやり方に気付かずにクソコード書く奴は多い。 >>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支店を入れるかどうか疑問に思えば合格 >>68
あぁすまん、ここvbaスレか。Excelスレと思ってた。忘れてくれ エクセルのある部分をリストボックスにしたいのですが、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 VBAの試験って、やっぱ何らかの制限付きなんだろうか。
制限しないと、ソートにSQLとか、Worksheetfunctionとか、
Cells(1,1).Value="計算式"とか、正解だけど、試験の趣旨としてどうなの?
という答えが沢山出来てしまう。 >>70
・RowPNの中身が全て""またはEmptyになっていないか。
Dubug.Printまたはローカルウィンドウでの確認を推奨する。
・リストボックスと言っているが変数はUF6ComboBox1で合っているか。
・RowPNの要素が(0 To 166)ないし(1 To 167)だとDoループがi=168までカウントするのでインデックスエラーになる。
For文の方が無難そうに思えるのと、ここでOn Error Resume Nextはどうかと感じる。 >>70
セルから値をとってるならこれでいいと思われ
Dim i As Long
For i = 1 To 168
If Cells(i, 1) <> "" Then
ComboBox1.AddItem Cells(i, 1)
End If
Next >>72 3行目間違い。。
? Dubug.Print ○ Debug.Print >>71
ググればすぐわかる。
なんか1日対策勉強したら余裕そう。 >>72 >>73 ありがとうございます。 値は入ってるのは確認しました。FOR文も空白ですね・・・。
シート使っているので、そこに1エリア儲けて、空白除いて再整列させて、ROWSOURCEで設定してみます。 >>75
いきなりサンプル問題で躓いたwwwwwwww
セルの範囲指定で「"A1:B1"」以外に「"A1","B1"」も使えるとか知らんわwwwww >>76
その方法で納得ならいいですが
配列に入っているなら
On Error Resume Nextで
コントロールを参照できないのでエラーしているのを
すっ飛ばしているのではなかろうか。
つまり>>72が言っているようにUF6ComboBox1は存在しないのでは。
On Error〜をコメントアウトしてみてはどうか。
と思う。 >>78 オブジェクト名は間違うと動かなくなるので、いつもコピペしてるんですよ。
とりあえずシート使って逃げて、rowsourceでうまいこと動きました。 >>61
数学の知識というより再帰関数とかのプログラム技術の問題 こんばんわ、
シティーボーイズやってました、再帰しげるです こんばんわ、
膣に挿入したら動きません、きたろうです 以下のプログラムで「該当するセルが見つかりません」となってしまいます。
該当するセル範囲のセルはすべて空白です。
期待する動作は、「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です。 >>84
2007だけど、ActiveSheet.UsedRangeの範囲外のセルだとエラーになるっぽい。 ここの板で質問するレベルでExcelになすりつけるのは100000年ほど早い
まぁそう言いたくなるときもあるんだがw 例えば、
そのセルの値が0より大きければセルA1をコピーし、そのセルに書式を貼り付け、
そのセルの値が0より小さければセルA2のコピーし、そのセルに書式を貼り付ける。
この程度の処理を数百のセルに行うのに結構な時間がかかる。
短時間で完了させるにはどうしたらいいんでしょうか?
ある程度のセル範囲ごとにまとめて書式貼り付けすればいいんでしょうか? 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 と全く別の数字になってしまいます
この理由がどうしてなのかを教えてください >>91
まずはおめでとう!
質問についての回答は単純に逆転してるだけだよ
1100100となるところが0010011となってしまいそのまま表示させたら頭の0が消えたって感じ >>89
あー読み取れた
VBA使うまでもなく条件付書式使えば終わり >>89
多分これでOK
Application.ScreenUpdating = False
処理
Application.ScreenUpdating = True >>89です
>>90>>92>>94
わかりにくかったですか、すいません。かなり酔ってます。
一日200行ぐらい増えるブックがあります。列数は50ぐらいです。
一ヶ月で6000行ぐらいでしょうか。あらかじめ条件付き書式を設定していましたが、
なんかブックを開くときに重くて、きっと条件付き書式が原因だろうと思い、
条件付き書式ではなく、VBAで各セルの値に応じて書式を固定しようと思ったわけです
でも、そのVBAが時間がかかって困ってるわけです。
書式のコピペって時間かかるんですね。
もっと書式のコピペを早くできる方法はないのかなって思ったわけですわ。 >>96
書式コピペするんじゃなくて、直接指定したらまだ速くなると思うよ
クリップボードを介する処理はとても時間がかかる >>96
こんな単純な条件ひとつだけで重くなるわけがない
問題は別にあるよ >>96
条件付き書式が断片化してない?断片化ってのは勝手に作った言葉だけど・・・
例えば、A:Aに条件付き書式(=a1=1)を設定して、10行目を切り取って11行目に挿入したりすると
条件=A1=1
=$A$1:$A$10,$A$12:$A$1048576
条件=A11=1
=$A$11
のように分割される
一度条件付き書式の書式ルールの管理、「このワークシート」を見てみたほうがいいかも >>97
明日試してみます。
>>98
そうですか。試行錯誤してみます・・・
>>99
レスの内容が難しいです。えっと、ちょっと考えさせてください。
>>100
つけてるはずです。 今のコードはこんな感じです。
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 >>96
>なんかブックを開くときに重くて
例えば、知らない間に、図形が1万個くらいに増殖しているとか。
いや、マジで。 >>104
あー、DoEventsuはマクロ実行終わるまで時間かかるんでEscでマクロ止めてた時の名残です。
今は必要ありません。消し忘れてました。 >>91
すみません…
まだ勉強し始めたばかりで何故入れ替えただけで逆に表示されるのかが分かりません
理由を教えて下さりますと幸いです ん〜
まずはループが最終的に何回転してるのか見てみた方が良さそう
自分ならまず新しいファイルにコードをコピペしてゴミ掃除するが >>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 >>102
<0と>0をUnionでまとめてからコピペしたら速くなりそう。
ただUnionのセル数が増えすぎるとUnion自体が遅くなるみたいなので、1〜数十行くらいで区切ったほうがいいかも?
まあ>>97のほうが速い気はするけど。 これって今何行あるの?
何万行もあって列数50あれば大分重くなると思うけど 6000回もselectとcopyしてりゃ遅くなるの当たり前 セレクトなくしたら2/3ぐらいにはなりそうだな
まあどう考えてもコピペはロスがでかい
指定する書式はマクロの記録か大抵ググりゃ出てくるから調べんさい >>89>>102です。
>>103 図形のオブジェクトはありませんでした。でも変なオブジェクトが多量に残っていたという経験は過去にありました。確認してみます。
>>110 Unionでまとめて処理ですか。試してみます。>>97と比較してみます。
>>111 実際の行は数千行ありますが、実際には最終行から200行しか処理してません。後出しになりますが>>102ではその部分を省きました。ごちゃごちゃするかなと思い・・・ >>89>>102です。
>>112 直接書式を設定したほうがよさそうですね
>>114 >>97を試してみます
みなさまありがとうございました。土日に試してみます。諸事情で今は試せないので。 ダブルクリックとシングルクリックを区別する処理を考えましたがあまり
美しくないです。もっとスマートな方法はありますか?
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 >>119
vba クラス コントロール イベント
とかでググれば >>119
内容と全然関係ないけど、全角スペースでインデントすれば削除されないよ >>120
ありがとうございます。質問そのものについてはタイマー張ることで実現
できることがわかりました。
また、イベントハンドラをまとめる方法もついでに知ったので助かりました!
>>121
次からそうします。ありがとうございます。 セルの値を配列に入れる時、
セルが1つだけだと、一次元配列になっちゃうってひどくね。 次元数が変化するとめんどくさい時は、常に同じ次元数になるようにfunctionを噛ませる 使い分けというかADOはDAOに比べて何かと便利だからADOだけ使えばいいんじゃないかな。
AccessだとデフォがDAOなんで使う事も多いけどエクセルで使うときのメリットは特に思い浮かばない。 >>127
回答ありがとう。今はMySQLに接続しようとしているのでADOを選びます。
まだVBA始めて4日目なのでわからないことばかりですが >>123
Resizeで1行追加して、配列を1行減らせばいいんじゃないかと思った。 すいません
パソコンのエクセル2016で作ったVBAをスマホで動かすことはできますか?
スマホでVBAの作成編集は無理のようなので >>130
基本的に無理じゃね。
スマホ側OfficeがVBAサポ―トしてないと。
その上でWin32API使用してたら、更に無理だし。 ノートでも画面狭く感じるのにスマホでなんてストイック過ぎる アクセスやワードでも使えるよ
アクセスvbaはたまによく使う。SQL覚えたほうがいいけど
ワードはワード自体使わん 初歩的な質問で、すみません。
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 関数 percent(num) で呼び出しもとで
引数 numに Range("a1") をセット(厳密には違うか)してるから
って釣りだよな >>139
残念ながらかなり根本的な事がわかっていない
function〜はユーザー定義関数っつって、処理をひとまとめにしたもの
numってのは変数名。これは自分で決めるもので、
「num」でも「namu」でも「ナンバー」でもなんでもいい。
「sub」「if」みたいな単語は予約語と言ってそれらは使えないんだけど、まぁ何となく分かるだろう
毎回'こう書くのがめんどくさいから
Range("b1") = Range("a1") / 100 & "%"
'functionを定義して、使い回しできるようにしているだけの話
Range("b1") = percent(Range("a1"))
function作るのめんどくさくね?
と思ったかもしれないけど、それは何もわかっていないだけ
素直にこういうもんだと覚えてくれ >num以外に自動認識されるような用語
自動認識されるような用語って何?初めて聞いた >>143
AレジスタとかBレジスタとかと想像してみる
>>142 ほ、ほんとに初心者だったのかスマン >>143
多分だが、引数を理解できてなくて
numに勝手にマッピングされてる、みたいに思ったんじゃないか
なんか勉強の順番おかしいんじゃない?
もっと前のフェーズでの学習が抜け落ちたまま次進んでる気がする >>145
いやいや、いきなりアセンブラは無いだろとw >>146
俺もそう感じた
ただ学習の本やサイトも「おまじない」とかアホなことぬかすからわけがわからなくなるんだと思う 俺何年もVBAつかってるけどオプションイクスプリシットとか読めないわ書けるけど
ただのおまじないだしないいよな別に Private Sub Worksheet_Calculate()
If Worksheets("sheet1").Cells(3, 20) > 4000 Then
Worksheets("sheet1").Range("V4:AP4").Insert
End If
end sub
インサートがめっちゃ繰り返される。どうして? >>150
ifが永遠にtrueになるからではないか
セル挿入→再計算→ifがtrue→セル挿入→再計算→ifが(略
Worksheets("sheet1").Cells(3, 20) がいつ4000以上になるのか
本当になるのかチェック >>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 >>151,>>152
的確な指示ありがとう!!(笑)
すごいなここの人は >>149
別にいいよ、モジュールの一番上にそれを書くのを忘れなければ モジュールの一番上に書くのは153でしょ
'2ちゃんねるの神様に教えてもらったコードです
'神様ありがとうございます
Option Explicit
Sub foo()
〜 こんばんは。
困ってます。
先日作成したマクロが動かなくなりました。
作成した日は動きました。
(特定のフォルダをコピーしてリネームするだけの動きです。)
プログラムを手動で実行したときは問題なく動くので、
プログラムの問題ではなさそうなのですが。
エクセルのセキュリティは、「警告を表示してすべてのマクロを無効にする」
にしています。
エクセルの再起動・PC再起動は試しましたが、だめでした。
C:\...Local\Temp\Excel8.0のMSForms.exdも消してみたりしましたがダメでした。
原因は何でしょうか・・・? スペック全然書いてなかった。
Windows8.1
Excel2013 です。 すみません。
書き込んですぐに自己解決しました。
コマンドボタンのオブジェクト名が違ってた・・・。 >>158
良いんだけどさ、最低限デバッグ出来るようになってくれ。 デバッグ始めにtypoを疑って問題ないと確認して、
さんざん調べてやっぱりtypoの時の脱力感 optionexplititをつけよう(typo) >>161
他人のtypoはすぐにわかるのになぜかわからない自分のtypo 初心者的な内容ですいません。
よければ教えてください。
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 Sh As Objectって何だよ。
Sh As Worksheetじゃないのか。
問題に突っ込んでもしょうがないけど。 スタンダード公式ページの模擬問題3に書いてありました。
問題がおかしいのでしょうか? >>164
新しくできたシートが引数Shで渡されている。
(ByVal Sh As Object)の部分。
Workbook_NewSheetのイベントプロシージャの仕様。
たいてい、どのイベントプロシージャも自分自身の参照を引数で渡されている。
ので、この場合、新しくできたシート自身を操作したければ
引数で渡ってきているShを操作すればよい。 挿入された新規シートが必ずActiveSheetだとは限らないんじゃない?
イベントプロシージャに新規シートが引数として渡されるのだから、それを使うのが確実
ちなみに問題が As Object なのは間違ってない
https://msdn.microsoft.com/ja-jp/library/office/ff821246.aspx?f=255&MSPPError=-2147217396 こういう仕様があったんですね‼
ありがとうございます。
スタンダード合格出来るよう頑張ります。 worksheetでもいいだろ、と思ったらエラーになった
確かにobjectであって、worksheetではない
http://stamp-uploda.com/src/file7295.jpg
ってかこれ、一体なんなんだ?参照だろうけど、中身が全くないobjectが渡されてる。意味がわからない ウォッチ式では
sh.name
はウォッチ式が不正です
イミディエイトウィンドウでは
?sh.name
Sheet4
とシート名が返ってくる
なんだこりゃ?? >>171
ウォッチ式にsh.nameが指定されてる?
shじゃ無くて? ためしに別の変数にShを突っ込んでみたら
中身が見られるようになった。
どっかで、オブジェクト変数は利用されるまで中身が入らないよ
みたいな話を聞いたような・・・。 >>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
なんらかの理由でウォッチ式が正常に機能してないだけならいいけど、正常な状態でこれだとどういう状況なんだろう >>174
Dim sheet as Worksheet
Set sheet = Sh
これをmsgboxの前に追加すると全部の変数がウォッチで見られると思う。
ググってみたらNewで作ったオブジェクトは初めて利用するまで空ですよ
らしいので、新シートのオブジェクトは内部的にNewで作成している?
Sh.nameが引けるのは何ででしょう? それよりも改行しないコードかく人は何を考えてコード書いてるのか気になる >>174
objectで受け取ってるからshのままでは何のクラスなのかわからないからどんなプロパティがあるかわからない
Nameプロパティを指定したら
Nameプロパティを持っているクラスとして解釈して
Nameプロパティの位置を文字列として表示しただけ
worksheetクラスのデフォルトプロパティがNameだからかな
countプロパティとかとして解釈させたら想定外の値になると予想 >>178
VBAだけじゃなくて他のプログラミング言語C言語とかと共通の考え方
メモリ確保とかキャストとか >>164
1が実行されるまでの間にactivesheetが変わるかもしれないからactivesheetでは不正解だと思う
出来るだけactivesheetを使わない方が想定外の動作にならないと思う てかお前らそんなに一か八かでactivesheet使ってんのかよw これが通るけど、ウォッチ式には現れない
多分ウォッチ式の不具合だと思う
そう考えないと気持ち悪くて仕方ないし疲れてきた・・・
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〜を使ってたけどね >>182
worksheetクラスではないクラスのプロパティを指定したらどうなると予想する?
例えばRangeクラスのプロパティとか
もしかしたらサイズとかを見ていてサイズが異なる場合はキャスト出来ないかもしれないど
メモリ領域には値が格納されているけどそれをどう解釈するかはクラスが決まらないと特定できない >>183
Private Sub Workbook_NewSheet(ByVal Sh As Object)
Debug.Print Sh.Range("a1").Address
End Sub
で
$A$1
が返ってきたわ
http://stamp-uploda.com/src/file7301.jpg 写ってないけどウォッチ式のshのプロパティは不明なままね
ウォッチ式がおかしい以外考えにくい 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はあったんで通る。 >>186
それはrange指定してないっす・・・
Private Sub Workbook_NewSheet(ByVal Sh As Object)
Sh.Cells(1, 1).Value = "aaa"
End Sub
で通ったよ >>184
Debug.Print Sh.Range("a1").Address
ではなくて
Debug.print sh.address
だったらどうなるかって意図だったけど
ためしたら実行時エラーになる
これはtypename(Sh)を表示したらわかるけど
Shという変数自体にクラス(型)に関する情報を持っているから
無理矢理Rangeクラスのプロパティを表示させようとするとエラーになる
dim rng as Range
set rng = Sh
とかやっても実行時エラーになる
文法的にはエラーじゃないからコンパイルは通る
VBAが型チェックしてバグにならないようにしていると思う
他の言語だとこれができるものもある >>187
ShがWorksheetクラスだっていうのが判ってるからRangeを指定するってわかるけど
Objectクラスだったら何のプロパティを持っているかわからなくない?
Objectクラスはすべてのクラスのスーパークラスだから何でも参照できる
Sh as Objectと宣言されているShが実態はRangeクラスである場合もある
その場合は、Sh.Value = "a"でも実行時エラーにはならない >>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 しかし>>175がどうしてもわかりません
object型をobject型に渡してもプロパティは分からない、それは分かります
http://stamp-uploda.com/src/file7303.jpg
object型をworksheet型に渡すと、ウォッチ式で見れるようになる、それがわからない
http://stamp-uploda.com/src/file7302.jpg
全部のプロパティ・メソッド見たら全部一致してたからworksheetとしてコピーしますね〜ということ? >>190
Set sheet = Sh
を実行した時点で、Sh = sheet = Worksheetクラスのオブジェクトと特定可能
なのでworksheetクラスのデフォルトプロパティを表示しているのではないか
ウォッチ式にsheet変数も追加すると、そのタイミングで
Shの他のプロパティも見えるようになった >>191
型キャストで
Shがワークシートだと判明したので
Shとsheetは同じ物なので
両方のプロパティが同じで表示されるのではと思うが。
詳しくはマスターにまかせる。
と思ったらもう回答されていた。
すごい勉強になった。 >>191
ウォッチ式の表示更新タイミングはその内容が特定されたときに
即座に表示更新されるとは限らない
つまり表示更新されるよりもずっと前に表示すべき内容が特定されていた可能性もある activesheet使うのはworksheets.copy使うときぐらいだな
真面目に作るときは書式とか直で指定するように頑張るけど レコードセットをそのままシートに張り付けると、元の型を継承して数字のみのカラムも文字列として貼られるんだけど、さすがにどうしようもない? >>197
和は加算の結果を表す言葉
0を加算とか足す0じゃないと意味が違ってくる
因みにレコードセットの型はcolumnの最初の7行分のデータから推測されるとかだったと思うから
目的の型になるようにソートすればいいかも 関数の引数にbyval ws as Worksheetってやるとどうなるの?
worksheetに対しては、byrefしか使ったことない オブジェクト型はbyval渡し出来ないんじゃなかったっけ? >>198
なるほどそうだぬ
「ゼロを一括して加算(D)すりゃいい」と言い直させてもらう
もともと具体的に書かず曖昧な表現を目指していた >>200
できるよ。
メソッド呼び出しもそのオブジェクトに対するものとなる。
違いが出るのは代入(=)演算の意味だけだと思う。 >>199
たぶんプロシージャ内の set ws=hoge が引数に反映されるかされないかが変わってくる >>203
ありがとうございます。
時間あるときに試してみます! thisworkbookをoptionalな引数のデフォルト値にしたいんだけどできない
何かいい方法知りませんか >>205
確認せずに答えるけど、できないならOptionalのデフォルト値をNothingにして、
モジュール内で判断・分岐する
If a Is Nothing Then Set a = ActiveWorkBook
とか デフォルト値は定数式で、って言われるな
デフォルト値を文字列にして"thisworkbook"、evalで…とか考えたけど2013持ってないから試せない
そこまでしても読みにくくなるだけなので、素直に>>206みたいに条件分岐させたほうが良いと思う 質問です。
ユーザーフォームをShowModal=Falseで表示しており、フォームを表示したまま、フォーカスをフォームからセルに移動することは可能でしょうか?
cells(1,1).select や application.goto cells(1,1) ではフォーカスがフォームから動きませんでした。 >>208
昔やったことあるなぁ
と思って試したら、仕様変更でできなくなってるっぽい
http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=44929;id=excel
2010は無理だった >>209
回答ありがとうございます。
後出しで申し訳ないですがバージョンは2007です。
試せるのが明日になりますが、appactivate試してみます。 >>206
やっぱりそうなるか
でもなんでできないんだろうインスタンスとして実体化されてないから?
そんなことないよな >>211
コンパイル時点で決まってないからかな〜 >>209
AppActivateもApplication.Visible=Trueでもいけました!
ちなみに以下のも試しましたが全部ダメでした。
ActiveWindow.Activate
ActiveWorkBook.Activate
ActivateSheet.Activate
2010以降だとWIN32APIとかでシートのマウスクリックを挟まないとダメかもですね。 >>213
良かったね
2007と2010でそんなとこに差があるとは驚いた ↑誤送信すまん。
Sh As Object
Sh As Worksheet
どちらでも動くのは分かる。
Objectにするのって、
どんな値が入るかわからないから、
Variantでいいやって考えるのと同じ? どんな値が入るかわからないコードってどんなコード?
デバッグ用にエラーで分岐させた先とか? つっこむならせめて値と型の違いぐらい分かっていて欲しかったなあ >>218
普通にすまん
>>219
あってもなくても一緒では?
variantを書くのは「どんな型が入るか分からない」と明示する以外に利点があるのだろうか NewSheetイベントの引数の場合、Shには
「Worksheet オブジェクトまたは Chart オブジェクトが渡されます」
と書いてあるので
どっちが渡されてもいいようにObjectなのでしょう 俺の書くVBAはVariantばっかりだけど問題ないよね? 書籍にさえ糞みたいなコードが平然と書かれてるVBA
どんなコードだってヘーキヘーキ そもそも宣言しなくても特に問題はない
vbaの型なんてやわらかすぎてあってないようなもん、死にはせん >>223
もちろんさ!
ちょっと単体テストすりゃ全然平気!
唯一気をつけるのはNULLが来た時の扱いだけど、「NULLがあり得る」場合は結局避けられない問題だし ただこーゆー所でVariantプログラムって言うとなんやかんやめんどくさいので胸の内に秘めとくことをオススメする >>229
まあNothingが来れば気を付けなきゃいけないだろうけど、NULLはDBから読んだデータソースに含まれている場合が多いから。 She As Object
Set She = New LoveDoll
She.DressUp(MaidCostume)
She.Attach(SilliconVagina)
I.Fuck(She)
I.FinishAlone()
She.Detach(SilliconVagina)
I.Wash(SilliconVagina) 5行目にSet her = She があればよかった NewSheetイベントの引数ShがObject型なのは、WorkSheetクラスとChartObjectクラスの両方でNewSheetイベントの呼び出しが定義されていて、実行時にしかShの型が決まらないからだと思うが
Workbook.Sheets(Index)の戻り値がObject型なのと一緒 variantとかobject形はコンパイルエラーで止めてくれないからめんどい
今ちょうど使いたい場面出てきてるんだが二の足踏んでる 指定日(A)から現時点(B)までの経過時間をミリ秒で取得したい場合、
どのようにしたら上手く取れるでしょうか?
VB.NETの時はGetTimeMillisecondsがあったので、(B-A).GetTimeMillisecondsで取得出来たんですが。 >>237
ありがとうございます。
GetTickCountも試してはみたんですが、システム稼働してからの時間だからか
自分では上手く取得できませんでした。
「指定日」(今回やりたいのは1970/1/1)からの経過時間をミリ秒取得するには
どのようにしたら良いでしょうか? >>236
doubleに変換して計算してまた変換するとか >>238
どうせそんな長いスパンならミリ秒はなんちゃってでいいんでしょ
Application.WorksheetFunction.RoundDown((Date - CDate("1970/1/1")) * 86400000 + Timer * 1000, 0) >>236
timediff()関数だかdifftime()があったはず datediff()だった
ただ秒単位が最小だった Win32API の GetSystemTime( ) を呼び出して後は頑張って差を計算するなりすればいいだけでしょ そもそもソースがクソ精度のシステム時刻だからmsecなんてあてにならない気がする
直前にNTPで同期をとるとか? 指定日から当日までをdatediffの秒単位で取得して
当日からその時刻までをmsで取得して
足し合わせればいいんじゃね ミリ秒の精度が求められる操作をVBAでって嫌だなぁw 作成するファイルやデータの一意な命名、識別とかに使うんじゃないの
だいたいでいいと思うわ 要件って喪前らは横浜のシューマイ屋さんか!!!!
(´・ω・`)b Range("250").ClearContents !!!?
その手があったか!!
今まで、真面目に名前を付けることしか考えなかったわ。
Dim Sh As Worksheet
Set Sh = Thisworkbook.Worksheets("(´・ω・`)b")
こんなのもありだな。 そういやみなさん
その場限りの適当マクロじゃなくて
ずっと使い続けてメンテも必要なVBAでセルにアクセスするなら名前経由でやってます?
自分はまずセルに名前をつけて
Const hoge = "セルにつけた名前"
Range(hoge).value = "うんこ"
みたいなことやってます
ちなみに、シート名でもこれやってるんですが‥
シート名やセル名が変わる可能性を前提にしたら
こういうアプローチになるとは思うんですけど
結局凄く無駄なことをやってる気がして…(結局変えることあんまないし)
特にセルの名前に関しては、どうせその文字列をConstのところにハードコードするなら
名前つけずに
Const hoge ="A1:B5"
でもええやんけとか思ってるんですが
行挿入とかに追従してくれる名前の方を使うべきかなぁとか思ったり… >>253
セルに文字列で意味をつけて
その文字列を検索して特定する
そのセルからのオフセットを固定しておく
例えば列名とか行名とか >>253
よくある表の列の増減対応する場合は
列挙体で列名を定義しておいて
Cellsで列名を参照させてる。
途中にぶっこんでも列挙体のほうをちょろっと書き換えればいい。
行にも対応させると、面倒かも。 >列の増減
会社のやつ、一切弄れないようにしたわwwwww
セルを保護するとかじゃなくて、
データの更新時に、全消しして再描画するのwwwwwwwwww
列挿入とかしても無駄ですよってwwwwwww そういうの、このスレだと基本だと思う
・正規化したデータを引っ張ってくる
・ボタン押したらvbaで構築。シートすら削除して再作成
こんなんばっかだろ。誰もさわれなくて非難轟々だけど、どうかんがえてもこっちのほうが安全なんだよな >>253
普通にやってるしシート名とかも定義する
あとは汎用的なクラスや関数いくつも作っておいて雛形エクセルにしてる >>256
コードをいじらないといけないじゃないか >>258
データの更新自分しか出来ないんじゃね
参照しか出来ないならwebシステムにすればいいんじゃね >参照しか出来ないならwebシステムにすればいいんじゃね
ヒント:権限 >>253
> ずっと使い続けてメンテも必要なVBAでセルにアクセスするなら名前経由でやってます?
状況次第だけどよくアクセスするとか重要なセルは適当なところでまとめて変数に代入してる
Dim hoge As Range
Set hoge = Range("A1")
...
hoge.value = "うんこ"
> 行挿入とかに追従してくれる名前の方を使うべきかなぁとか思ったり…
行とか列の挿入を想定するなら名前をつけてそれで参照する
ユーザーが作成するようなシートなら特定の文字列を検索して場所を特定するとかもやる >>264
自分に権限がないなら権限を持ってる人に許可貰えばいいだけじゃね?
なんの権限か不明だが >>258
批難がでるって事は不便な点とかがあるって事で
仮にそれが商品だとしたら売れない可能性があるってこと
競争相手がいたら使われなくなる商品 >>267
売れてるiPhoneのスレでも見てこいよ
売れない/使われないものをいちいち非難するほど人は暇じゃない >>268
売れないなら批難は出ないと言う主張なら
批難轟々なら売れるって事だよな
じゃ売ってみればいいんじゃね? >>268
それは代替品がある場合だ
その代替品に乗り換えれば済むから
社内とかの代替品がなければ嫌々でもそれを使うしかない >>269-270
レスを分けて書く奴はもれなくバカの法則 w >>271
それ面白いか?
別に面白くないけどなぁ VBAのマクロって
・マクロ制作者本人の操作を補助する為のものであり、他人に使わせる事は想定されていない
・オフィス製品の操作を補助する為のものであり、アプリケーションの本来の振る舞いを超えた動作は想定されていない
・ユーザーフォームはマクロの操作を容易にする為のものであり、別のアプリケーションであるかの様に振る舞う事は想定されていない
なので想定されていないものを作ろうとしたら不便さを感じるのは当然
どんな言語もそうだけど、想定された使い方なら便利だし、そうでないなら不便だよ >>255
なるほど
例えば
○年○月 の○のセルを指定する際に
「年」のセルを探してOffset(0,-1)する、みたいな感じですかね
自分はこれも名前つけて管理してましたが
セルが1つの場合はそれで良さそうですね
ただ、全く同じ内容のセルが検索範囲にないことが保証された運用にしないとバグりそうなのでちょっと怖いかも
>>256
表に対してレコードセットみたいなアクセスをしたい場合に
つい最近その方法を知って目からウロコでした
とにかくインテリセンスを効かせたい派なので・・
http://thom.hateblo.jp/entry/2015/12/17/000132
こういうことですよね
行方向に関しては、列のように各行に別々の意味を持たせるような使い方はしたことないので
問題ありませんね
>>261
自分は簡単なSQLを作る(ANDとかORで結合するだけ)に特化したStringBuilderみたいなのだけ使ってますね
>>265
やっぱ可変範囲のこと考えると名前つけるのは意味ありますよね >>273
>他人に使わせる事は想定されていない
これは本当に思いますね
Accessなんかはフォームでの入出力が基本だし
各データの型も指定するから
出来ること出来ないことを設計者が細かく指定しやすいですが
Excelは書式や入力データを限定させようとすると
そのノウハウの習得のことも考えたら相当な時間がかかる気が…
以前「値のみの切り取り・コピーしかできない」ようにしようとして
えらい苦労しました 所詮道具 しかし便利な道具 それをよりによってなんで使い辛くするのか 神経を疑うわ
改変、改ざん、変更がダメならそっちに注力すべきだろ
バックアップなりPDF出力なり変更者・変更ヶ所の記録なりなんなり
余計な仕事して会社の利益を浪費すんなよ Excel VBA一本で家族養って食っていけてる人いる? >>277
vbaしか扱わない仕事なんて無いよ
必ず何かのついで
vbaあると事務作業の確実性は上がるけどね >>279
プログラマー志望でvbaの仕事しかやったことないんだが。 >>280
クルマで言えば「1車種しか運転できない」のと同じ
プログラマになろうなど論外 >>281
別の言語の方が得意なんですけどね。。
他言語のキャリアないから呼ばれない。 >>277
半年ぐらいならあるよ
社内システムの一部を担当しててVBAだけずっとやってた
もちろんそれに付随する仕様書とかマニュアル作りとかも含むけど 自分は業界デビューがAccessVBAで、そのうちC/C++もやるようになった。
で、今PHPとかJavaとか知らなくて仕事減ってきてる。 PHPは言語は楽ちんだけどネットワーク周りがキツイ
専サバならどうでもいいけどレンタルサーバーだと制限多くて何もできん VBA4とかの時代はなぜかユーザー定義型のリファレンスをクラスモジュールに渡せなくて悩んだ覚えがあるけど最近は大丈夫なのねと >>287
うん。
50万ぐらいのレコードを扱う、MySqlをバックエンドとしたC/S型のシステム作ったよ。
vbaは例外ハンドラが弱すぎて、自作スタックトレースみたいな仕組みを作ったりとか、バージョン管理大変だし、vbaでシステム開発は怖すぎてやりたくないっす。
初速はいいけど、規模が大きくなってくると生産性が著しく落ちるねー。 >>289
クレイジーだな
VBAでやるの間違ってね >>290
バックエンドがMySQLなら50万レコード程度は楽勝だろうしフロントエンドにExcel VBAはたいして珍しくないぞ そもそも、VBA使いってエンジニアじゃないよね。
なので、エンジニア目線での会話はしないほうがいいよ。 方言で喋るヤツは日本人じゃないよねみたいな言い回しは嫌い エンジニア畑の出身ではないということ。
エンジニア畑を歩いてきた人はVBAなんかには染まらないよ。 じゃあ東京出身以外は日本人じゃないんだね
哀れな見識の狭さだな 東京出身で大阪に住んでる人は関西人じゃないし、大阪出身で東京に住んでる人は江戸っ子ではない。 他の言語をバリバリ使うエンジニアがVBA使うなんていくらでもあるだろ 馬鹿の一つ覚えみたいに、なんでもかんでも変数に入れちゃうし、しかもいまだにハンガリアン記法だったりする。
エラー対策もバッチリですと言わんばかりにエラー処理が延々と続くコードを晒す。
ただでさえ冗長な言語なのに輪をかけて冗長なコードを書く。
誰もお前のコードなんかコピペしねーからコアな部分だけを簡潔にかけ、と言いたくなる。
VBAが書けるぐらいでエンジニアづらするな。 >>302
あれ?
VBA使いはエンジニアじゃないんじゃなかったっけ >>305
つまみ食いするエンジニアはいるでしょ。 お前の中ではVBAからプログラムに入り今は別言語メインってやつは存在しないんだね エンジニアかどうかってプログラム言語に依存する概念だっけ?
実現手段なんかコロコロ変わるのに vbaからhtml・phpに行ってなんか社内SEみたいなことやってるわ
割りと楽 >>307
うん、縛り。
>>308
多くのエンジニアの中で揉まれた経験があるかどうか、だよね。
>>310
ありがちだよね。「みたいなこと」止まり。
いわゆる「エンジニアもどき」ってやつw >>311
揉まれた経験からだと言う割にメイン言語で縛ってたりVBA出身は違うとか言ったり
主張は明確に頼む ExcelVBAの挙動が謎すぎて困る
IF xx IS NOT NULL AND xx.value = 100
みたいので例外出たときは目を疑った
nullのときも両辺評価するって決まってるならまだしも
普段は何事もなく動いてるのに
急に気まぐれに両方評価するのやめーや… >>313
君こそ何が言いたいのかよくわからないけど、
まぁ、コードは簡潔に、ということ。 >>315
俺の言いたいことは「方言で喋るヤツは日本人じゃないよねみたいな言い回しは嫌い」ってだけ
コードは簡潔にって所は同意見だな >>314
今更だろう
longな数値同士を文字列結合できるぐらいなんだし、何が起こっても驚かん
Sub foo()
Dim a As Long
Dim b As Long
a = 1
b = 2
Debug.Print a & "|" & b
End Sub ってかvbaって実は内部的に全部variantで処理してない?と思うことがたまによくある >>314
短絡評価が保証されてない言語で
> IF xx IS NOT NULL AND xx.value = 100
なんて書く奴の方が謎
NothingじゃなくてNULLなのも謎
あとNULLならIsNull( )じゃないのも謎 知らんがな!そんな詳しくない
環境制限されて使わざるをえずに使って
ちょっとカルチャーショック受けただけ まえ2chでEXCELVBAが挙動アバウトだから使いたくないって言ったら
お前の頭がアバウトなだけでVBAはアバウトじゃないって返された
ほんとにアバウトやん いつもながらの仲間内のどうでもいい戯言が続いているだけなんで、質問者の方は気になさらずにどうぞ〜 >>314
>「nullのときも」
Nullかどうか関係なく AND 演算子がつねに両辺評価だってだけよ >>320
ところでちょっと興味あるんだけど「環境制限」て何がNGなの? うんそれならまだわかる、たぶんそんな気がしてきた
Nullのとき正常終了してるケースがあるように見えたんだ
たぶん見間違いだ まあ、VBAが言語としてクソなのは認めざるを得ないよな
最近javascriptつまみ食いしてるけど、これはこれで魔境とは言え進化してるしさ、常に >>319
短絡評価が保証されてないというか無いものだと思ってたけど、短絡評価される状況ってあるの?
あるなら活用したいもんだけど。 nullの話出たから聞きたいんだけどnullとかnothingの判定を完結にやるいい方法ってないの?
やりたいのはnull,vbnull,nothing,emptyなどなど値が入ってない状態を検知したい
全部if elseifでやるのは汚すぎるからあまりやりたくない If文を可能な限り避けるとなると
Function foo(hoge) As Boolean
Select Case VarType(hoge)
Case 0,1
...
Case 9
If hoge Is Nothing Then
End Select
End Function
みたいな書き方かな データの値の状態を判定するならif elseif よりも
Select Case Expressionの方が無駄なく綺麗に書ける >>329
保証されてない ≒ 動作する場合があるかも知れないけど面倒だしどうでもいいから調べてない >>337
なるほど。
null判定は自分で関数作っちゃうのが早いよってことね。 こんな感じかな。
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 なんでこんな初心者用のスレでVBAはゴミだのカスだのドヤ顔でほざいてるの?
どうせ普段は別の言語で仕事してる奴が、ちょっと頼まれたVBAが解らなくてファビョってるんだろ?w >>341
その状況なら確かに愚痴りたくなるだろうね どうせ自称VBAに詳しいクズと自称メインは他言語のクズしかいないんだから仲良くしろよ >>341
他の言語出来るやつなら自分で調べられるし聞き方も賢くできると思うぞ >>341
vbaで仕事は暇になるも、ひたすらすることがない。
コミュニケーション能力のほうが大事と気づくのに、そう時間はかからなかった
コミュ力も高まる言語、それがvba >>340
横からですが、借りてってもいいですか? >>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
なんか美しくないね。
ま、好きなように書き換えて。 >>349
ありがとうございます。
エラーの度に色々悩んでたもので。
この辺を美しく書けるのが理想ですが、なかなか難しい。 僕は唱える 魔法の言葉 on error resume next
みんなで歌おう 魔法の言葉 on error resume next >>349
objectを掴めてないときのemptyとか、開放できないときのオートメーションエラーとかに悩まされて、ある程度解決してたんですが、これで最終解脱できそうな予感。
ありがたや。 ExcelからOutlookを起動し、予定表から会議依頼を作成するマクロを作成しています
あらかた思っていたものは作れたのですが、自分の予定表ではなく共有の予定表に保存する場合のコードがさっぱり分かりません
共有の予定表での作成方法をご教示頂けますでしょうか >>349
IsObject(Expression)の判定をしてるIfブロックの終了間際にExit Function入れないとダメなんじゃね? >>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 >>355
isNoneが未定になるパスがあるんじゃね 値とかオブジェクトが普通に入っている場合がすっぽり抜けてるんですがそれは >>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
みたいな使い方を考えたんですが、全然美しくない・・・
どうすれば良いでしょうか。 >>357
IsNoneの初期値をFalseにすればいいんじゃね? As Booleanで指定した場合はデフォルトがFalseだからTrueになる条件だけ書いていけばいい。 ああなるほど、初期化って頭が全くなかった。サンクスです。 >>359
Case vbarray を加えればいいだけじゃね?
…って思ったら、配列の空判定は結構やっかいかも。
配列判定いる? どういうものを実装するかにもよるけど経験から言うと配列の判定は別の方がいい。
アプローチの仕方が違うから、変数単体で認識させていたものを配列突っ込める様にした時なんかにバグの温床になる。 >>364
もちろん目的によるけどね。
個人的には空の文字列は正常側だと思うし variant型は脊髄反射で否定するくせにvariantみたいなヤリマン関数が大好きなお前らってw variantのみを使うor絶対variantは使わない
みたいな論争は見たこと無いな 前スレかその前かの最後の方でVariant型絶対使わないマン出てきていた様な気がするけど。
そういう信条自体は別に良いんだけど、Variant型使えば解決出来る事を信条のせいで解決出来ず、
その結果として「VBAは欠陥」って言い出す変な人はこのスレでよく見かける。 便利な道具を使いこなせないドンくさい奴ってことだよ すいません、353ですが自決しましたのでスルーで結構です
コピペだけでなく内容も理解できるようもっと勉強します >>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 訂正。最後、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 >>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型以外の場合もあるから、この方がいい。 >>375
おおー、まだブラッシュアップできたか。
素晴らしい。
それなりに使える関数になったかもね。 配列と型のチェックを同時にする時はとりあえず一次元配列に直せば楽ってばっちゃが言ってた 書いてから気づいたけどvbnullは型ではなくてただの列挙体なので判定しなくてもいいよな
あと““はなんかダサいからvbnullstring使うのがいいかも 判定としては UBound < LBound にしなくちゃね >>379
たとえば、InputBoxでキャンセルを押すとvbnullstringが返る。
何も入力せずにOKを押すと "" が返る。
つまり、vbnullstringと "" は別物なのでそれぞれに判定する必要がある。 >>380
たしかにそのほうがきれいだね。
いや、いろいろ出てくるもんだなぁw
美しいコード書きへの道のりは遠い… >>379
vbNullStringと""は判定としては別なので、片方だけにすると抜けが起きる。 >>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で判定したい。 一応簡単なテストコード的な…
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) エクセルでLISTAGGに相当するものは何ですか?
ソートしてForで上下比較して足してけとか言わないでください。 >>373
> 配列は要素数の空判定でお茶を濁そう。
それが簡単にできれば>>363とかがわざわざレスせんよ
>>375
> ArrayはVariant型以外の場合もあるから、この方がいい。
アホか、ビットマスクなんだから And VbArray で判断しろよ vbNullString を厳密に判定する場合、StrPtr()使わないと判定できないと思ふ
If StrPtr(vbNullString) = 0 Then ’〜 Null Pointer >>388
Select文だとAnd vbArrayって使えないと思うんだけど、例文出してくれる? >>390
ひょっとして応用力ないとか?
Selectにこだわる必要ないし
どうしてもやりたきゃ
Select Case True
Case (VarType(hoge) And VbArray) <> 0
...
でいいだろ >>392
ああ、やっぱりそういう方法しかないのね。
元々がIf文を可能な限り使わないというところから出発しているし、
それだとIf Else使った方が処理も速いしSelect文で読みやすくするっていう利点も潰してるんだよな。 >>381,383
たしかにvbNullStringと""は別物なんだが
vbNullString=""の比較はTrue返すはず
単に空チェックだけなら""とだけ比較しとけば良いんじゃね やはり、配列の空判定は別関数にしたほうが良さそうだね。
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 >>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 >>394
> 単に空チェックだけなら
Len(Trim(hoge)) = 0
で事足りてるような気はする。
イミディエイトウィンドウでテストしてみて。
? Len(Trim(InputBox("値を入力してね"))) = 0
[OK][キャンセル]どちらでも True が返る。 >>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
あくまで配列要素数があるかどうかだけ判断したいなら、こういう関数でもいいと思うけど。 >>398
おおー、だいぶスッキリしたね。
ひとつ残念なのは、引数の次元指定が美しくないんだよなー。
つか、1次元の要素が空の配列なんて使う?
1次元が空かどうかだけ判定すればいいんじゃね? 関係ないけど配列の次元を求めるWin32APIがあるのに、いつまでたってもVBAから使えないのは何なの? >>399
Optionalをわかってないのは美しい美しくないとか言う以前の問題。 その理屈だと、大抵の事はC++で出来るから他の言語は不要ということになるな >>402
VBAから使えるようになればC++の必要性が減る、と解釈するのが自然だと思うけどな? >>393
速いとか読み易いの前に正しいコードを書きましょう
って話
動けばOkでいいじゃんと言うなら返す言葉はないけど >>401
optionalはわかるよ。
仮に引数指定するとして、どの時点で指定するのかな、って。 >>404
つか、正しくないコードは動かないでしょ。 >>398のは
配列要素数があるかどうか「だけ」判断するというのとOptional引数で
次元を指定させる点がちぐはぐなんだよね。 ま、配列の空判定関数は各自で書くということでこの話題は完結かな。
ちなみに俺は、
Function ArrayEmpty(hoge) As Boolean
On Error Resume Next
If UBound(hoge) - LBound(hoge) < 0 Then ArrayEmpty = True
End Function
って感じ。
空判定関数を書くというだけの話題だったけど、いろいろ勉強になったね。
おつかれさまー。ノシ 3行目は
If UBound(hoge) < LBound(hoge) Then ArrayEmpty = True
のほうが美しいな。 そしたら
ArrayEmpty = UBound(hoge) < LBound(hoge)
でもいける。 >>411
素晴らしい!!
頭が柔らかくて羨ましいよ。 完成した関数テンプレにのこしておいてよ
vbaの良質なコードはすごく希少だし >>406
たまたま動いてるだけのコードも正しいと言い張るの? >>414
つか、いったい何が悔しかったの?
君ほどの実力者が。 >>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
簡潔で美しいね。みんなの力の結晶だ。 >関数テンプレにのこしておいてよ
どこにあんだよ、そんなの
ここで知った人間で保存しておきたいって奴が保存しておけば良いだろ スレッドのテンプレに残しておいてほしいって事なんじゃないの。
でも残し始めたら際限無くなるし、コピペで済ませずに理論と意図を理解して同じものを一から書けるようになってほしいなぁ。 >>415
えっ?
なにか悔しいことでもあったの? w こんなコードテンプレに残したらますます初心者が初心者を惑わすスレに拍車がかかるなw
本当に仕事でエクセルマクロを必要としてる人には迷惑かけんなよw > 初心者が初心者を惑わすスレ
言い得て妙だww
いいんだよ、それで。
VBA使いはエンジニアじゃないから。 >>422
まだVBA使い≠エンジニアとか言ってるの?
エンジニアでもVBA使いは居るってのに どの言語の質問スレも初心者が初心者を惑わすスレ化してるのが悲しい。
「よくある質問と回答」レベルなら問題ないんだけど、ちょっと突っ込んだ質問になるととたんに雲行きが怪しくなる。
ある程度の実力を身につけたら2chじゃなくてちゃんとしたコミュニティか何かに参加するべきなんだろうけど、
だいたい見つからないし、見つけても2chほど気軽に質問投げられるような場所じゃなかったりするんだよな。 >>426
ネットの情報なんだから裏を取ればいいだけ
今時書いてあるキーワードでググれば調べるのもそんなに苦労しないしな
惑わされるより過疎化してまともな回答が少なくなってる方が問題だわ >>424
エンジニアでもVBA使いは居るけど、
VBA使いになりたいエンジニアはいない。 >>429
これな
いやいやだわ
javascriptのほうが楽しいし >>430
JavaScriptのほうが楽しい理由は? javascriptってvbaの次に底辺やんwww >>433
使ったことある人が多い言語って底辺扱いされやすいよね。
おそらく、C や Java の比じゃないと思うよ。>VBA
でも、Java は使う人が多くなりつつあるから、底辺扱いされるのは時間の問題かもね。 新興の言語って利用者全員が似たような習熟度だから意思疎通が図りやすいし、
どんなにクソみたいなコード書いても判断材料が無くて効率的なコードって言ってもらえるからな。 >>369
欠陥なんじゃなくて、馬鹿ほどvariantを使う法則なだけ 長い間SQL触ってたので、
SelectがVBAにもあったのを完全に忘れていた、という話。 複数の言語を使うとselectとswitchは妙に間違える
俺だけかねー? JavascriptにおけるjQuery的な
VBAのクラスってどっかにないのかな
Set class = New class
class.lastRowAdd(Range("a1"),array)
ってやったら最終行に配列の内容をぶっ込んでくれる
とか
よくある操作をパラメーター渡せばやってくれるような >>444
このコードは妄想クラスメソッドなのでエラーになるけど
もし、いろんな汎用処理を詰め込んだクラスなりを
誰か作ってたら欲しいなーと思いましたとさ、という話 >>445
そうじゃなくて1次元配列が出来上がるとか2次元配列が出来上がるとか
もちょっと具体的に
あと第二引数はなんだ? そこまで引っ張る話題でもなくね?と思うけど確かにどうしたいのかわからんのもあってちょっと聞きたくもあり 科学計算が爆速でできるVBAのフレームワークができれば、VBAの価値は一気に上がる。 データベースな表で
第一引数のセルから下に見ていって一番下に
第二引数の配列をズドンと書き込む
という想定
たしかにそこまで引っ張るネタでもないです >>450
ネタで言ってるなら申し訳ないが、それその通りに書くだけで良くね? >>452
そういう話ではない。
まあでもVBA用の色んな処理の検索はしてきたけど、アドイン化されてるものは全然見かけないなあ。
汎用的な機能を詰め込んだアドインってこれくらい?
http://software.opensquare.net/relaxtools/
>>443の求めるものとは違うんだろうけど。
結局は自作クラスってことになりそう。 >>451
お前の下らん雑談ネタのためにこのスレが有るわけじゃないんだyo あぁarrayは横向きの配列ってことか、なるほど
VBAで汎用ライブラリ作るとしたらどんな名前になるだろう
tyっと作ってみたくもあるな ブログ検索すれば色々出てくるから好きなのを使う。
製品的なやつが欲しいなら知らん 完成した関数テンプレにのこしておいてよ
vbaの良質なコードはすごく希少だしアドインってメンテナンス大変じゃないか?
用途としてはいろんな人に使わせる用だと思うんだけど誰かが使ってる最中に変更できないじゃん
やたらにバージョン上げると某ライブラリみたいな顛末になるし じゃあコピーしたもん編集して誰もいないときに上書きすればいいじゃん >>431
新しい昨日が追加されるところ
まだクソなのはクソだけどvbaは一切進歩せんからなあ >>460
> vbaは一切進歩せんからなあ
エンジニアのための言語じゃないからね。
Dim だの Set だの If Then だの、
うんざりするのはしょうがないとしても、
objFSO
なんていう変数を見た日にゃ、
ぶっ殺したくなるね。 >>463
継承もサポートしてないしね
だから初心者の入口としても不向き
マイクロソフト的にもお荷物だろうな
はよ.net framework対応してほしいわね そもそも継承が必要になるほどの大規模な開発をVBAでやる事自体が間違い定期。 まあ継承より配列周りの強化してほしいかな
わざわざ自分でコレクションもどき作ってるけどめんどいわ 初めてADOっての使ったけど、なんだこりゃ。
MSQueryと違って、列名が出ないじゃん。
いや、ヘッダのON・OFFで無理矢理出せるけど、
そうするとUnionした時に、レコードの途中に列名が出やがる。(列名扱いされないから?)
列名は、出力位置の上に、予め書いとかなきゃいけないの? >>467
コレクションもどきって何?
配列もどきのコレクションとは違う何かかな? フォームを作ってるとき、同種のパーツのオブジェクト配列が簡単に作れたら良いのにって思うわ >>470
For Each x In Userform.Controls
Select Case Typename(x)
Case "Label"
...
End Select
Next
みたいなのじゃなくて? >>471
VBだとフォームパーツの型のオブジェクト変数として配列変数が宣言できる
何かと便利 >>470みたいな需要は確かにありそうだ。
さっそくオレ様ライブラリに取り入れよう。 >>469
コレクションて値の出し入れできなかったりするじゃん?
値の追加、挿入、削除、入れ替え、ソートあたりメソッドにしたクラスだね
型は安全に出来ないけどなかなか便利
objectにも対応させたいけどやや面倒だから手を付けてない >>472
Forで1つずつ取る方法しかなかったわ。
CopyFromRecordsetみたいに一撃弾平なのはないのね。 >>475
コレクションもどきって表現はミスリーディングだな
コレクションの拡張クラスだそれは
アイテムのソートと入れ替えは便利そう >>477
for eachできないからコレクションもどきとした
中身はただの配列だし >>478
コレクションをラップしてるんじゃなくて中身が配列なのか
確かにそれだとコレクションもどきだな >>479
継承できればコレクションからゴニョゴニョした方がいいんだろうけど
どうでも良いけど値の入れ替えのメソッド名をRepracementにしてるんだけどなんかしっくりこないんだよね
なんかいいのないかな >>481
入れ替えで辞書ツール突っ込んだらそれでてきたからしゃーない 配列の話題になってから調べて初めて知ったけど
ArrayListをVBAで使えるんだね
一通りメソッドもそろってるみたいだし、どうかな
実際に使ってみたわけではないけど >>483
便利は便利だけど遅い
三桁四桁の配列なら大差無いだろうけどね
大抵はコレクションで事足りちゃうしね 使い勝手はArrayListのほうが便利そうだね
まぁ確かに自分も使ったことないけど ちゃんとしたやつがあるのかよwww
自作配列にArrayListって変数名付けたわwwww .netライブラリの話で思い出したけどコンストラクタに引数渡せないのクソ不便だよな
渡せるようになれば使えるライブラリも増えそうだが >コンストラクタに引数渡す場面ってある?
シートの名前ぐらいなら返り値の.nameを変えるけど、何とも思わん コンストラクタでしか初期化できない(他の初期化用メソッドを持たない)クラスがあれば困るけど、
そういうものって.Netにあるの? >>491
const
vbaでconstが必要な用途が良くわからんけど >>491
VBA から使うとは思えないけど Exception の Message はコンストラクタでしか設定できないよ
そもそも>>489はそういう話じゃないような気がするけど >>493
.netのクラス使えないのかな?って以前ググったときに
http://officetanaka.net/excel/vba/tips/tips98.htm
が引っかかって
えらい簡単に使えるんだなぁと思ったんだけど
思っただけで使ったことないし
細かいことも知らない…
ていうか、本当にいろいろ便利に使えるなら
ググるだけでバンバン情報引っかかっていいと思うんだけど
ArrayListのことくらいしか出てこんかった >>490
ブックをそのままラップしたクラスとか作りたいときにパス指定するためのメソッドわざわざ実装するのとかクソめんどくさいじゃん
結構引数指定したい場面あるよ
逆になんで引数渡せないのかという >>496
そういうのは諦めた
エクセルに限らず、IEやら何もかもインスタンス作成してから、プロパティを変更している
言語仕様を嘆いても始まらん 話の流れで思い出したけど
これ使ったことある人いる?
マクロをC#で書けますよっていうやつ
http://mokumokucsharp.hateblo.jp/entry/2016/07/13/140602
Visual Studio Codeとかいうのもインストして
サンプルは動くんだけど
インテリセンスがうまく効かんくて使い方がよくわからない それもそうだけどクラスを含むプロジェクトを参照しているモジュールからそのクラスのインスタンスを
直接Newで作れないのにも困ってる。
Create〜系の関数を書いて置き場所に迷う場合が特に。 仮にC#使いだったとしても、VBA覚えるわ。
VBAにある機能をどれくらいカバーしているのか。
99%以下ならイラネ。
ていうか、そもそもどういう仕様だろう。
C#で書いたのを、内部的にVBAに翻訳して標準モジュールに書き込むとかだったら笑う。 よく見たら、
全てのVBAコードを生まれる前に消し去りたいとか、凄いこと書いてる。
何かに憑りつかれてはいませんか。 機能よりも言語仕様で
if()then
とかやっちゃう 重複した行を削除したいのですが、ググってみると
重複した下の行を削除するプログラムが殆どです。
上の行を消すプログラムはないでしょうか? >>500
なんでこんな馬鹿なのに偉そうにできるんだろう >>506
だって、要は、VBA使いこなせないからC#でとか言ってるわけだろ。
VBAに心の底から辟易って、使う人の能力の問題を、何で言語のせいにしてるのか。 質問です。
Excel2007ですけど、複数のオートシェイプをグループ化せずに同時にカットできますか?
オートシェイプを選択してSelection.Cutメソッドを実行すると、なぜかセルがテカテカするのです。
ShapaRangeオブジェクトにはCutメソッドが無いみたいですし。
とりあえずSendKeys "^x"で対処してるけどなんだかなあ、という状況です。 RangeのUnion、初期値がNothingのときエラーになるのが残念だ Officeが入っていればどのPCでも動く、というVBAの最大の利点を犠牲にしてまでC#で書く意味はないね。
自己満以外の何ものでもない。
幸せになるのは自分だけ。 自分の仕事が楽になるならいいんじゃないか
共有するやつは別 VBAって基本、かならず自動でコンパイルされた上で実行されるんですか?
[デバッグ]-[コンパイル]ってやらずに実行するとえらく遅いんですが。 >>512
コード資産が共有できない(自分の中でも)、というプログラマにあるまじき行為。 >>495
> http://officetanaka.net/excel/vba/tips/tips98.htm
> が引っかかって
> えらい簡単に使えるんだなぁと思ったんだけど
これは知らなかったわ、教えてくれてありがとう
> ていうか、本当にいろいろ便利に使えるなら
> ググるだけでバンバン情報引っかかっていいと思うんだけど
> ArrayListのことくらいしか出てこんかった
ちょっとググったらCOM経由で動くみたいね(CreateObject で作成するんだから当たり前か)
http://qiita.com/mima_ita/items/efcd1a6ea86f09047984 >>498
これ使うぐらいならPowerShell使う >>515
環境の問題なら、自分のなかでは使い続けられるんじゃね? >>518
既存のVBAコードに、C#で書いたプロシージャを呼び出すコードを追加することはできないよね。
VBAで書いたWinのExcelマクロはMacのExcelでも使えるけど、C#で書いたらMacでは使えないよね。 VBAはもう言語仕様をアップデートするつもりはないんだろうけど
せめてIDEくらいはもうちょっと便利にして欲しい
>>516
つまり相互運用の登録がされているライブラリは使えるってことか
でもいちいち自分でdll作ってまでは使わないかなぁ… >>508
コードや実行環境、ファイルサイズなどを見ないと何とも言えない
それから、セルがテカテカするとかいう感覚的な表現はなるべく避けるように >>522
dllを作るってどういう状況で必要になるのかよく分からんよな。
別途用意する必要があるって事は他人に使わせるのに難があるし、
VSTO使えるならVSで他の言語使った方が早い場面が多いだろうし、
自作のdllが必要になるような処理をVBAに求める場面というのが想像出来ない。 「Macだと」とか「プログラマとして」とかちょっとこのスレの想定ユーザーからはかけ離れてるんじゃないか? >>507
いや、vbaがクソ言語なのは避けようのない事実だろ
C♯erがわざわざ新しく覚える時間が無駄というのは分かるよ
オブジェクト指向にドップリしてたら使いにくいことこの上ないと思うし VBAをクソクソ言っている人たちはどういう立場なんだろうな。
クソだと思うなら近づかなければいいのに。
なんか他の言語でもメインで使い始めた途端にクソクソ言いそう。 作ったものを他人と共有しようとすると限界が低い。でも自分一人ツールと割り切れば相当なことができる。
Officeソフトにそれ以上求めてもしょうがないでしょ。 VBAは手軽さを重視してるんだから、高度な機能がないって意見は的外れなんだよ >>529
ん?
アマチュアの人かな?
お仕事ならクソだろうが使わざる得ない状況なんていくらでもあると思うが >>532
VBA言語をクソって言っちゃうくらいなのにVBAでお仕事取っちゃうの?
もう少し仕事は選んだ方がいいんじゃないか。 >>526
うん、そういうこと。
ExcelマクロをC#で書くような人は、このスレの想定ユーザーからはかけ離れてるよね、ってこと。 クソだけどofficeのマクロ言語はこれしかないから仕方なく使うしか無いだろ
プログラム言語としては時代遅れの化石なのはさすがに共通認識だと思ってたわ
現状くそなのもそうだし、これから先進化することも決してないこともクソ
あと、手軽さと高度な機能は別に共存できるでしょ >>536
それは別にかけ離れてはいないだろ
Macだとかプロのプログラマはかけ離れている プログラマとしてって言いだしたのって(オッペケ Sr1b-QbI6)だな
自演までして何がやりたいんだか・・・ >>527
> オブジェクト指向にドップリしてたら使いにくいことこの上ないと思うし
俺は逆だと思うよ
オブジェクト指向をよく知ってたほうが、VBAを使いこなせる
・クラスモジュールを使いこなす
・いわゆる「インタフェース継承」を使いこなす
・WithEventsを使いこなす
大抵の奴は「クラスモジュールっていつ使うんですか」レベルだから >>540
俺の言いたいことを一ミリも汲んでくれてないなw
そりゃオブジェクト指向的なプログラミングを知ってれば非オブジェクト指向言語でも構造的に自然と書くようになる
それとこれとは別の話
機能がないからわざわざ自分で作らにゃいかんから不便だって話をしてる この手の下らんやり取りはこれまでもあったし、これからもウンザリするほど続くんだろうなぁ┐(´д`)┌ヤレヤレ >>539みたいに、自演自演て騒ぐ奴をしばしば見かけるけど、彼は何がしたいの?
つか、そもそもここは自演ができないスレなんだよね?
こういうのはスルーしたほうがよいのでしょうか。 >>541
オブジェクト指向と機能は別の概念だけどな
機能は言語がなんであっても追加出来るだろうし
オブジェクト指向は言語に関する概念だから >>541
オブジェクト指向の一切を封じられてるから使いづらいというのなら、それはそうでもないってことさ
機能が足りないというんなら、先人が作ったライブラリでも探せば?
https://github.com/rubberduck203/VBEX とか >>540
自作クラスってどういう時に使うの?
excelが思いっきりオブジェクトだから、それに対する手続き的な操作しかしないわ >>548
状態を持ったモノを扱いたいときじゃね?
状態を持たないんだったら関数の組み合わせで表現するのは簡単だ。 >>534
言語で仕事選べるとか無職の発送は素晴らしいな w >>549
状態を持つ⇒オブジェクトを使う
対偶は
オブジェクトを使わない⇒状態を持たない
対偶は必ず真とはいえなくない? >>548
ログクラスとか作ってたな
書き込むシートと書き込む行を別々に管理するのは嫌だったから
でも継承もできないしコンストラクタの引数も持てない状況ではあまり使いやすくならないし結局クラスはほとんど使わない
そもそも俺がずっと保守するわけにもいかんから >>547
オブジェクト指向言語は「オブジェクト指向的な設計が可能な言語」の事だから、
言語によってオブジェクト指向が決まるわけではないし、言語に対する概念というと違うと思うなぁ。
>>550
募集要項に何の言語が出来るかとか普通書いてないか?
Javaで募集かけたけどC#での開発がメインですみたいなカオスな職場もあんまりないだろ。 >>544
オブジェクト指向をサポートしてるかって話だよ
なんとなく分かるべ
>>546
ことさ、じゃなくてさ
俺はそういうところがクソだと言ってるの
クソはクソでも使わなきゃいから使うだけで
ライター、チャッカマン、バーナーが他所であるのにマッチでも火をおこせるしこれはこれで良いもんだぞって言ってるようなもん >>552
ログはfunctionだなぁ
コンストラクタ使えないと、わざわざNewしてクラス無いメソッド呼び出してって二度手間じゃね。
functionならいつでもどこでも一行で済む >>551
⇒(ならば)とは言ってないけどな
まあ、オブジェクトを使わない⇒状態を持たせづらい(グローバル変数を使うはめになる)
あくまでVBAでの話だよ >>549
例えば、具体的にどういう時に使うの?
状態って言っても初期値とかExcelから拾ってくるから、それをわざわざclassにほーり込むのもなー >>553
オブジェクト指向言語は
オブジェクト指向設計したものを
そのまま実装し易い言語じゃないかな
言語の概念でもあると思うけどな
オブジェクト指向言語じゃなくても実装できるのは確かだけど
それならVBAでもオブジェクト指向設計を実装できるんじゃないかな >>557
初期値より途中の経緯を記憶しておかないと次の計算ができないものとか?
「ワークシートに書き出す」じゃ再利用性に欠ける >>559
だから具体的にどんなことをするんだよw
ゲームとかはナシでね
ちと思いつかない >>556
グローバル変数を使わなくても状態を表現できるんじゃね?
例えば再帰関数みたいに状態を引数にするとか >>553
> オブジェクト指向言語は「オブジェクト指向的な設計が可能な言語」の事だから
そんなことを言い出したらアセンブリ言語でもオブジェクト指向は可能だよ
そういう極端な話をしたい訳じゃないんだと思うよ
> >>550
> 募集要項に何の言語が出来るかとか普通書いてないか?
ああ、そういう働き方してるひとなのね
もっとでっかい案件レベルのつもりだったから話が噛み合わないのも無理ないな >>555
書き込み行はどうやって覚えてるの?
複数のログを扱うとか面倒じゃね? >>558
> それならVBAでもオブジェクト指向設計を実装できるんじゃないかな
関数ポインタがないから継承とか無理じゃね? 状態を持つ必要がある入出力関係が
独立に多数ある場合は
クラスを使うと比較的実装が簡単になるのかな? >>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列の最終行を取得し、そこに記録してる
覚える必要はないと思う 表の検索とかsqlでやる人もいるんだろうけど自分としてはクラスにしちゃうのがしっくりくるわ
配列の操作もクラスにしてると楽
あと、似たような処理で操作する対象が違うメソッドなんかは同じ名前にしても問題ないところとかも地味に便利だよ
関数だと命名に困ることがよくある >>560
さあ?いろいろあるでしょ
数値を放り込むとその度に回数をカウントアップし、最大値・最小値、合計、時刻を記録する、とか。
これくらいだったらワークシートでもできるけど、そういう対象が数多くなるとオブジェクト配列でやりたくなる。
どのワークシートのどこに?とか考える必要なくなるしエクセル以外のOfficeでも使えるし。 >>564
一般的な形では難しいかもしれないけど
サブクラスに相当する関数から
スーパークラスに相当する関数を呼べばいいんじゃね?
逆にスーパークラスに相当する関数に
スイッチみたいな引数を付けて
サブクラスに相当する関数に分岐するとか >>567
SQLを使うのって速度的な理由。
自作クラスでSQL以上のスピードが出るなら、
みんなそうするわ。 >>558
VBAで出来ないと思っているならオブジェクト指向を何か勘違いしているからオブジェクト指向設計の本を読むといいよ。
他の言語みたいな書き方が出来ないだけで、VBAでもオブジェクト指向プログラミングは普通に出来るから。 >>570
まあ、あんまり大きなデータは扱わんからな
別に検索する形式が決まってるなら内部的にsqlで値抜き出してもいいわけだし
データの塊をオブジェクトとして扱っちゃったほうが何かまとまり感あってしっくり来るって感じかな >>571
できるできないの話じゃないんだって
あとオーバーライドはちょっと厳しくないか
どうやって実装する? >>564
AddressOf あるし使おうと思えば使える >>573
自身のメンバとして基底クラスを宣言して、基底クラスに自身を登録して、
基底クラスのメソッドを実行すると基底クラス側で自身の特定のメソッドが呼ばれるとかかな。 >>574
アドレス取るのはいいけどどうやって使うつもり? >>511
officeも何もなくてもc#書けるけど。
コンパイラ初めからあるから。 vbaでオブジェクト指向とか中級者がやることだな。
初心者よりタチ悪いこともある。 >>571
VBAと言う言語にクラスとかオブジェクト指向の概念が入っている
つまりオブジェクト指向の概念は言語にもつながる
と言う主張
一方でオブジェクト指向は設計にのみ関わる概念と言う主張もある
オブジェクト指向の概念を取り入れた言語でオブジェクト指向設計したものを実現するのと
オブジェクト指向の概念がない言語で実現するのでは
生産性とかに差が生じるだろう >>581
上級者はvbaは大人しく手続き型的にやるよ。
オブジェクト指向しようとして、これできないかなーあれできないかなーとか悩むだけ無駄。 >>584
各シートの統計情報を取りたい時はどうする?
例えば、セルを更新した回数、最大値、最小値、平均値
を各シート毎に知りたい時
後から分散とか標準偏差とかも知りたくなったらどうする? 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に動画投稿したほうがいい
顔出したくないならラファエルみたいに仮面かぶればいい
手っ取り早く視聴数稼ぐには有名ユーチューバーへの物申す系動画がオススメ >>587
クラスってオブジェクト指向じゃないの?
上級者的に手続き型でやらないの? >>582
> なぜ?
> 逆にスーパークラスに相当する関数に
> スイッチみたいな引数を付けて
> サブクラスに相当する関数に分岐するとか
サブクラスを増やす度にスーパークラスに手を入れるつもりなの?
真顔で言ってるなら単なるアホだろ w
> で、どうするの?
無理じゃね?
って書いてあるんだが... >>585
> 各シートの統計情報を取りたい時はどうする?
要件次第
> 例えば、セルを更新した回数、最大値、最小値、平均値
> を各シート毎に知りたい時
更新回数以外は全セルなめて計算することもあるしイベント毎に合計、最大、最小を更新していくのもあるだろうな
> 後から分散とか標準偏差とかも知りたくなったらどうする?
そういう機能を実装するだけ
イベント以外はオブジェクト指向関係ないと思うぞ >>591
全セルなめるとか性能要件を満たせなくなる可能性が高いだろ >>594
それはその時に考えたほうが良いと思う
大体
> 例えば、セルを更新した回数、最大値、最小値、平均値
> を各シート毎に知りたい時
こんな状態がまずないw >>590
サブクラスからスーパークラスを呼ぶ方は? >>592
どこからコピペが出てきたのか意味不明
>>593-594
だから「要件次第」って書いてあるんだが
最初に一度はなめないといけないから一回しか呼ばれないと言う要件ならその方が効率的だし
>>596
それになんの意味があるんだ?
マジでオブジェクト指向の基礎からやり直した方がいいレベルだぞ >>589
そうだよ。
データ構造だけ定義するんだよ。 >>575
結局それだと要らんもんまで呼び出したり不便なんだよ
やれんことはないけど不便
オーバーロードもやれんことはないけど実装がめんどくさい
使いたい場面は結構出てくると思うけどね
インターフェースもなんかスマートじゃないし 【IT】10代のネット環境「スマホのみ」が7割、「PCのみ」は25%にとどまる [無断転載禁止]©2ch.net
http://egg.2ch.net/test/read.cgi/bizplus/1500900491/ >>600
クラスモジュールがある以上、このスレの話題として守備範囲内 >>554
> ライター、チャッカマン、バーナーが他所であるのにマッチでも火をおこせるしこれはこれで良いもんだぞって言ってるようなもん
マッチだけでも十分OOできる
それにWithEventsもあるしね
https://github.com/rubberduck203/VBEX のソース読んだか?以外といろいろできるぞ >>603
これはあなたが作者さんなの?
興味深いが手っ取り早く知りたい
VBEX /testから読めばいいのかな? >>604
> これはあなたが作者さんなの?
いや、俺じゃないよ
コードサンプルとして読んでみたらってこと
あとこれとか
https://github.com/jpimbert/VBAToolKit/tree/master/Source/VbaUnit
OOの知識があって、いわゆる「インターフェース継承」を視野に入れれば、かなりのことができる
さらに、WithEventsを使えば双方向データバインディングなんかも実装できる >>605
うーん、、、
日本語のないかな?(ボソッ >>603
いやだからさ
俺の言いたいこと伝わらないし理解する気無いよね
こっちはマッチしか無いから仕方なくマッチ使ってんの
不満だからって努力を放棄してるわけじゃないからな?
ただどう考えても手間だろ
そんだけの話 >>610
君も俺の言いたいこと1ミリも理解しようとしてないから、お互い様だね >>597
意味がわからない?
学びなおした方が良いぞ >>612
> サブクラスに相当する関数から
> スーパークラスに相当する関数を呼べばいいんじゃね?
そこまで言うならなんの意味があるのか説明してみな だからさぁお前らは雑談したいだけだろ?スレ立ててそこでやれっつーの
クソうぜぇ >>611
使い方によってはvbaだってoopできるよ!って言いたいんでしょ? >>615
さいしょから言ってるでしょ
> オブジェクト指向にドップリしてたら使いにくいことこの上ないと思う
なことないよ 使いたいときに便利な機能を自由につまみ食いできるのがいいライブラリだと思っているんだが、
オブジェクト指向のライブラリって少しおせっかいというか世界観を押し付けてくるところがある。
会員にならないと利用できないサービスみたいな感じ。
自分で作ったものを自分で利用する分には当然問題ないんだけどね。
VBAの言語機能の弱さを考えると、クラス間の関連のある体系的な使い方を実現するのは厳しいだろう。 >>616
俺は工夫を強いられてる時点でうんちだと言っている
以上です 某サイトを参考にメールを一括作成する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
----------------------------------- >>620
msdnのリファレンスをみると
Outlookテンプレート(.oft)を指定しろって書いてあるので
怒られているとおり、型がちがうのでしょう。
CreateItemメソッドを使えばいいんじゃないでしょうか。 オブジェクト指向がどうこうって語りたいなら
オブジェクト指向
って言葉と
オブジェクト指向言語
って言葉をちゃんと区別して発言して下さい >>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
--------------------------------------- 関西のお笑いと関西のお笑い芸人も区別して語るべきなのか? 俺予想だと、2023年くらいに.NETと統合されるので、大丈夫じゃないの。 >>623
Sub test()
Dim ol As New Outlook.Application
Dim mi As MailItem
Set mi = ol.CreateItem(olMailItem)
mi.Display
End Sub
この最小構成でメール編集画面がでるかお試しを。
出なかったら参照設定が変なのかも。
Excelのバージョンが変わると勝手に参照設定のバージョンも
変わるという罠に引っかかったことがあるので。
実行時バインディングでやってみると言う手もあり。 >>627
最小構成でやってみると、やはり同じエラーでした!
これは、参照ができていないのですか?? '// 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 >>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。 >>628
まず、そのユーザーでOutlookはちゃんと動いてメールの送受信できるのか? >>630
試しましたが同じエラーでした。
>>631
問題なくできています。
みなさん、ご協力ありがとうございます。ご迷惑おかけしてすみません。
今気づいたのですが参照先が14.0でした。最新は15.0なんですよね?これが原因でしょうか? 皆様ありがとうございました!
理由はわかりませんが突然できるようになりました!
本当にご迷惑おかけしました! >>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 >>635
おはようございます!
ありがとうございます! win10
excel2016で
MSXML2.XMLHTTPを使って
responseTextでgoogle検索結果のページを取得しようとすると、
responseTextで返ってきたものが、今までwin7 excel2007などで返ってきたものと全然違うんですが、win7の時のように受け取る方法ってありませんか?
win7の時はhtmlそのものが返ってきてましたがwin10では最初の方が判読困難です。
やろうとしていることは、vbaでgoogle画像検索の結果の画像をセルに表示しようと思ってます。 そういえば responseBody しか使ったことないなあ
(adTypeBinary な ADODB オブジェクトに Write するために) すみません、いろいろ試してたんですが、google以外ではちゃんと同じようなものを受け取れてました。
googleでは環境によって返すものが違うのかもしれません。
その先はスレ違いになるので自分でいろいろやってみます。ありがとうございました。 api以外でgoogleの検索結果を取得しないほうがいい
すぐにアクセス禁止になる 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 少々長くてもわかりやすい名前をつけるのが基本だからね。
ハンガリアンよりは全然いい。 少々長くても分かりやすい名前を付ける、それがハンガリアン記法
想像してるのはたぶんシステムハンガリアン記法 変数はAddressなのにメソッド名はAdrで統一してないのは理由あるの? 変数名長いなぁ
olAppとかAdrListとかにすれば良いやん >>644
単に「ハンガリアン」と言った場合は、システムハンガリアンの意味で用いられていることが多い。
ということでどうかひとつ。 >>646
むしろ関数名を
GetNameToAdddress
にしたほうがいいかも。 >>641
Dim Cts As Folder, Ct As ContactItem
で
ユーザー定義型が定義されてません
エラーが出た >>650
まぁそうだけど、どれ参照するのか探すのめんどい
開発用に、コンポーネント参照の全選択ほしいな。それともあるんかな? >>650
649は店に来たお客さんのつもりのようだから、まともに相手する必要はないよ 単なる自己満足なんだからそこまで突っ込むなよ
どうせ永遠に平行線なんだろ? >>648
メソッドの頭文字は小文字にしたいな
あとd多いのはなんか意図あるの? >>654
ごめん、dはタイプミスだ。
メソッドの頭文字を小文字にするのは何流?
VBA流では大文字だよね。 みなさん、ご迷惑おかけしてすみません。
outlook vbaのスレに書くべき質問だったでしょうか、、
>>649
すみません、outlookのライブラリです。
よろしくお願いします。 >>656
いや、だからメソッドをキャメルケースにするのは何流なのかなと。 >>658
javascriptはキャメルだと思う みなさん、ご迷惑おかけしてすみません。
outlook vbaのスレに書くべき質問だったでしょうか、、
>>649
すみません、outlookのライブラリです。
よろしくお願いします。 >>659
IDの最後がvbaだ。カコイイ
なるほど、メソッドキャメルはJS流だったのね。サンクス >>660
Outlook VBA スレないからまあここでもいいと思うが仕事中に軽くググった範疇だといい方法が見つからん
> Set olAddressEntry = olAddressEntries.Items.Find("[Email1DisplayName] = '" & str & "'") '←この行でエラー
Items.Find( ) は Folder オブジェクトしか持ってないからここでエラーになるのは当然
グローバルアドレス帳(Global Address List)は GetGlobalAddressList( ) で取得できるし内容も入っているんだが取得したリストの GetContactsFolder( ) を呼び出しても Nothing しか返ってこない
何か設定が要るのか根本的に頓珍漢なのかさっぱりわからん >>662
ありがとうございます!勉強になります。
> グローバルアドレス帳(Global Address List)は GetGlobalAddressList( ) で取得できるし内容も入っているんだが
↑その内容というのは、debug.printで見ることはできますでしょうか?? >>664
foo = bar.GetGlobalAddressList( )
をどこかに入れてfooをウォッチ式で見る >>664
Set GlobalAddressList = Namespace.GlobalAddressList( )
Debug.Print GlobalAddressList.AddressEntries.Item(1).Name
とかすれば見れるよ
全件エクスポートするサンプルとかあるので見てみて
https://www.slipstick.com/developer/code-samples/export-exchange-gal-excel/ バージョンが上がって日付時刻型の除算ができなくなりました。バリアント型にしても空になります。
対応方法はありませんでしょうか?
また、こういう仕様変更はどこで確認できますか? >>667
Dateの除算てなんのためにやるんだっけ?
CLngとかしてからじゃダメなの? >>667
エラーの出たコードを書いてみて。
あとバージョンも。2016? エラーコードは51
データ型が日付時刻の除算はエラーでる Sub foo()
bar = Date / 2
Debug.Print bar
End Sub
2010、win7だけどエラーでない ダブルにキャストしてから計算したら
ずれるのかな? >>676
Sub foo()
bar = Date / Date
Debug.Print bar
End Sub
普通に1になったけど 質問者からのエラーコードの提示がないので無駄な回答だな。 時刻を時刻で割る意義は? どんな分野で必要と成るんだ? それは知りたい バージョンが上がって…
とか言いながらバージョンを書かない馬鹿
指摘されても書かないという >>681
8時間の就業時間の間に25分掛かる作業を何回できるか見積るとか しょうもない質問はほっとけばいいんじゃ?
それとも答えたくてウズウズしてる感じ? >>683
無理くり理由をこじつけてもその程度だよな…ほんと何がしたいんだろうな 質問するのにバージョンも書かない
ID変わってるのに名無しのまま
環境書けと言ってるのに無視
こんな処理する理由は?と聞かれても無視
こんな人間の生産物を現場で使う恐怖 >>686
何のためにここで質問したのかわからないよね。
つか、俺たちが釣られただけ? 質問者が軌道修正のために必要な情報を提供しないってのはここではザラにあることだろ。
そんなのによく付き合ってられんなー >>678
dim a as date
dim b as date
dim test as date
a = time
b = time
test = a / b
でエラー出た >>693
地域オプションで先頭が数字以外になるような書式だったとか? >>693
環境書けよ
なんでエラー出たとか言うやつは環境書かないの
VBAの日付型は原則数値として扱えるはずので
日付型である事が原因でエラーが出るとは考えにくいけどなぁ
ちなみにエラー51のヘルプ(2007)には
>このエラーが Error ステートメントまたは Raise メソッドで生成されたものでなければ、Microsoft 製品テクニカル サポートに連絡して、メッセージが表示されたときの状況を知らせてください
ってあるから、ホントにエラー51出たならEXCELのバグの可能性もないではないな 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 Cdbl()で分母をDoubleにキャストすればいいだけじゃね? >>697
まぁ解決法としてはそれでも何でもいいし、そもそもdateで除算って事をやらないんだけど
根本的な原因が分からないと、変なとこで悪影響受けそう Time って
DateTime.Time プロパティのことだよな
Property Time As Variant
だからもともとVariant型
dim a As Time がエラーになるんだが Date型はVBAのデータ型で"21:02:32"みたいな文字列なんじゃね?
だから計算するとエラーになる
分子にDate型を持ってきたときはDoubleに自動的にキャストされてると予想 >>699
ごめんなさい訂正前の送ってしまいました
定義部分は以下に変えてください
Sub foo2()
Dim a As date
Dim b As date データベースのDATETIME型の値がそのままVBAのDate型変数にマップできれば楽なのに、
1900年以前だとうまくいかないのが残念だ。 >>702
2010とかだとエラーになる
分母にDate型を持ってくるときは
明示的にCdblでキャストすればエラーにならなくできる
MS側にバグレポートしたところで修正するかどうかはMS側次第
仕様変更したと言うかもしれない >>705
>>683
全くない需要ってわけでもないと思う キャストしてできるんならなんの問題もないだろう
キャストできない理由があるんじゃないのか?
まさか発想になかったわけじゃないだろうし >>693
つか、dateをdateで割った答えがdateっておかしくね?
たとえば、60分を15分で割ったら答えは「4分」ではないよね。
なので、
Dim test as Long
とすべき。 >>709
そこはエラーとは関係ない
debug.print a/b
でもエラーになる
意味的に間違いでも形式的文法的には正しい これエラーにならん
Debug.Print 1 / Time
これはエラー
foo = time
Debug.Print 1 / foo
意味わかんねぇmsに聞くか >>711
型が関係してるとしか思えないんだけど… >>706
>>683は 時間÷時間 の話で 時刻÷時刻 じゃないだろ
時間を演算するならシリアル値に変換して演算すればいいだけ
日付時刻に対する加減算以外の演算なんて意味ない >>711
TimeはDaterime.timeでvariantだからエラーにならないのはわかる
fooもvariant?それともDate型? >>713
時刻を基準日時刻からの時間以外で定義できるんだっけ? >>713
>日付時刻に対する加減算以外の演算なんて意味ない
除算も乗算も意味あるんだが、一体何を言ってるんだ 今のとこ試した範囲では、2010で割る方の方がDate型だとエラー51だすな
バリアントだとVarType 7(vbDate)でも平気
どうにもバグくさい。だれかインシデント余ってるやつMSに聞いてくれ
>>711
だからエラーになるやつは環境かけよ
Win7 2010ではそれだけではエラーにならんぞ
どっかでfooをDateで宣言してんじゃねえのか >>713
VBAでは時間と時刻の型は区別されてないから、その議論に意味があるかは微妙だな
Date型を時刻ととらえるか基準時点からの時間ととらえるかの問題だろ
>>716
時間と時刻の違いわかってる?
一般的な会話での時間って言葉はほとんどが本来だと時刻の間違いだぞ
時刻の除算にどんな意味があるんだ? 除算は1900/1/1からの経過日数の比
って認識で良いのかな >時間の就業時間の間に25分掛かる作業を何回できるか見積るとか
(終了時間ー開始時間)を分単位に直して25で割るってことじゃないですか。
これは10000円を100円単位に分けたらいくつになる?ってのと同じ数量の問題だよね?
時刻の除算ってのは例えば
A = "2017/04/11 16:54:00"
B = "2017/08/15 10:45:48"
で A / B (Aは日付型でなくてもいいんだろうけど)ということでしょ?
これにどんな意味があるのよ 単純な操作のはずなのによくわからん
0. .xlmxファイルを(パス:\A)に作成しておく
1. フォルダ(パス:\B)内のすべてのCSVファイル(データは1列のみ)を、先ほど作成したファイルのSheet1の2列目から順次マージする
データを繋げるところで詰まるので助けてください >>715
日時が先か時間が先かは知らんが今の議論には関係ないと思う
>>716
どういう意味があるのか書いてからほざきない
>>718
言語で区別してないから使う人が意識しなきゃねって話 >>722
Date型で割るとエラーになると言う点と
あとどうでもいいんだが時刻で割ると言う点の
2つの論点が並行している
Dateで割る時はdoubleにキャストすればいいだけ >>720
Bを1とした時にAを数値で表した値
どんな価値があるかはその時によるが
全く価値がないとも言い切れない >>721
君が書いたコードのどこが拙いのか検討しようぜ。
まずはコード書いて。 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 複数ステップのOLE DBの操作でエラーが発生しましたとか言われて、
adOpenKeyset, adLockOptimisticで対策したら、
今度はUpdateで怒られるんですが、どうにかなりまんせん? >>727
エラーとカーソルタイプやロックタイプは関係あるの? >>728
わからないんですが、
他にも、adUseServerでエラーになるので、
adUseClientに直すと、違うエラーが出たり、
何かを直すと違うエラーが出る、もぐら叩き状態です。 sqlのエラーならそこらへんは関係ないんじゃないの?
なんのエラーか知らんけど DB操作はClose通らない処理を挟んでしまって二重にOpenするとかで苦労した事があるなぁ。
それが原因ならクラス作ってデストラクタにClose書いておけば忘れなくて便利。 >>723
> Date型で割るとエラーになると言う点と
俺はそんなことは問題にしてない
意味のない演算ができてしまう言語なんて珍しくないし
> あとどうでもいいんだが時刻で割ると言う点の
どうでもいいなら放置しておけば? >>726
保存先をパス付きで指定したらどうかな
chdirは自分のパスだろうし >>727
こいつもそうだけど、ソースも示さずエラーが出ると言ってどんなエラーかも示さず
アホか
大方SQL単体でも失敗してんだろ >>734
たぶん、『解答』が欲しいのではなく、『レス』が欲しいんだろうね。
つまり、雑談したいだけなんじゃね? >>733
ありがとうございます。帰宅後、やってみます。 >>734
一般的でなく、同じ目にあった経験者しか答えを知らなそうな内容なので・・。
ググって出てきた例が全滅なので、
多分、AccessではなくExcelでやってるのが原因だとは思うのですが。 ちなみに、EOFがtrueじゃありませんとか、
IZAMが有効じゃありませんとか、
そんなやつです。 >EOFがtrueじゃありません
俺もmysqlにアクセスするのを作ってる段階でそういうのを出すことはあるよ。けど、そういうのここで
チンタラチンタラ言っててもソースがない以上こちら側ではどうしようもないわけで。 >>740
もしかしてEXCELで直接開いてるのにAccessと同じ文法のSQL使ってない?
ワイルドカードとか色々と違う点があるんで、もしかしたらSQLが失敗して空のレコード開いてるのかも。 そもそも何のDB(ドライバ)かすら書いてないし
どうやってレコードセット開いてupdateしたのか書いてないし
レスするだけ無駄な気がするぜ
>EOFがtrueじゃありません
そんなエラー見たことないな。EOFがFalseなら普通にデータ取れてるってことじゃねえの?
EOFがTrue前提の操作が浮かばんが、何しようとしたらそんなエラーになるんだよ
>IZAMが有効じゃありません
IZAMって何さ?ビジュアル系バンドメンバーかよ >>743
> レスするだけ無駄な気がするぜ
いいんだよ、それで。雑談が目的なんだから。
答えを出す必要はない。
>> EOFがtrueじゃありません
> そんなエラー見たことないな。
ADOでレコードセットを操作していると、ときたま現れるエラー。
クエリ結果にレコードが1件もない場合とかに出たりする。 初心者ですがご教授下さい
クラス内に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 >>745
なんでcolTRをclassnameで取得してんの? あと並べて書いた場合でも変数一つずつ型指定してかないとvariantになるよ、vbaの場合 >>747
vbaでieを操作を読んでもググってもあり理解出来なくてとりあえず作りながら覚えようと
コピペしたものを一部変えました
tr、tdは特定出来ずclassが特定出来るのですがどのように書き換えればよろしいのでしょうか? >>749
処理対象によってどうすればいいか変わるから
対象が判らないとなんとも言えないのではないと思う
クラスで全部のTRを取れてるのかも判らないし >>749
trがほしいならgetElementsByTagName("TR")で取るのが普通じゃね
その後のfor eachの中の処理もよくわからんが 例えば下のように文字と数字が並んでいて、文字を数字の横に持って行くにはどうしたらいいですか?
12
q
15
b
10
c
↓
12 q
15 b
10 c >>745
生のjsそのまま使うのはめっちゃめんどくさいから、ラッパーを探したほうが良い
で、探した。以下のサイトのラッパー使えば多分すぐに出来ると思う
http://language-and-engineering.hatenablog.jp/entry/20090710/p1 >>752
必ず数字と英語が入れ替わりで来るなら以下のマクロ
Sub foo()
For i = 1 To 100
行 = Int(i / 2)
If i Mod 2 = 1 Then
Cells(行 + 1, 2) = Cells(i, 1)
Else
Cells(行, 3) = Cells(i, 1)
End If
Next
End Sub >>754
ありがとうございます。
でもすみません、2連続で文字のパターンもあります
正確には下のような感じです
○
q
r
○
d
○
c
↓
○ qr(セル内改行)
○ b
○ c >>755
まず数字か文字列か判別すればいいんじゃね?
if a like "[0-9]*" then
って感じでできる様なきがする >>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 >>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 >>756
なんでlikeなんだよ
isnumericでいいだろw >>759
数字を含む文字列をどっちに判別するかによるんじゃね >>749
追記でおせっかいついでに、ie操作覚えたいなら軽くhtml勉強したほうがいいよ
エクセルのオブジェクト理解せずにvbaで扱うなんて無理なのと一緒 Ruby で書いた
https://paiza.io/projects/HhNVuMxF20bU1t4-GMp0VQ
ary = []
File.open("File1") do |file|
# 1行ずつ処理する
file.each_line do |line|
# 0〜9
if /^\d+$/ =~ line.chomp!
ary << line + ' '
else
ary[-1] = ary[-1] + line
end
end
end
puts ary
入力
01
a
b
12
c
23
出力
01 ab
12 c
23
ただし、23 の後ろに、半角空白が入っているけど >>742
普通にCopyFromRecordsetするだけなら出来るんです。
Do Until rs.EOF
rs!項目=何とか ←ここで何かしようとすると、Debug.Print以外は全て失敗します。
rs.MoveNext
Loop
諦めて、GetRowsして編集してから出力しようとしたら、
縦横入れ替わってるし(Excelで使うのに何故こんな仕様にした?)、
Transposeで直そうと思っても型が違いますとか言われるし・・。
>>743
I-zamはサポートしてませんだったかも? >>763
>rs!項目=何とか ←ここで何かしようとすると、
rs.項目に何か代入しようとしてんのか? >>744
>クエリ結果にレコードが1件もない場合とかに出たりする。
それ普通はEOFがTrueになるはずだけど
MySQLのドライバでそうならなかったりするのか?ドライバのバグじゃねえの?
それどうやってゼロ件かどうか判定するんだ? >>763
だからDBとドライバ何で、どうやってそのレコードセット作ってるんだよ
そもそもレコードセットを更新する必要があるのかどうかも疑問だけどな
レコードセットは常に更新できるとは限らんのだぞ >>764
そうです。
SQL上だと難しい内容があるので、後から入れようかなと。
>>766
CsvとMicrosoft.Ace.OLEDB.12.0です。
元のCsvの方は、多分更新出来ないだろうとは思ってたのですが、
出力結果の方に、編集した内容が反映されればいいかなと。 >>767
CursorTypeがどうなっているのかとかいちいちこちらから聞かないと情報を出さないのか?
で、延々と続ける気? >>764
rsに代入できるんだっけ?
debug.print出来るならrsから読み込むのは出来るんじゃね?
別変数にコピーしてから変更したら? Excel(VBA)でデータベース接続ってどういうのが一般的なんでしょうか?
自分は専ら生ODBCを叩いているので他人のことが気になってる。 >>770
そんなの統計とかアンケートとかとってる人いないんじゃないかな
実現したいことができればいいんじゃね そもそもexcelでデータベースに接続しないな
全部accessで済ませてしまう >>772
VBAとODBCドライバしか使わないのでExcel, Outlook, Word, Access その他 Officeなら何でもOKにはしてる。
ExcelとOutlookくらいしか使わないけどね。
Outlookはメールで「このテーブルをこう読んだときに〜」とか連絡を受けたときにそのままVBEを開いて使ったりとか。 >>768
それは最初に、読み取り専用じゃないやつに変えたけどダメだったと書きましたけど。
>>770
ググって引っかかる率が高いのはADO。
外部データ取り込みの方なら、参照設定もいらないのに、どういうわけかADOばっか。
ADOばっか出るから、ADOに乗り換えてみたら、このザマですよ。 >>775
外部データ取り込み(Microsoft Query)からです。
シートの指定が、なぜか[シート名$]じゃなくて`シート名$`とか、
データの出力開始列にコマンドボタンを配置すると、ボタンを押した瞬間、
ボタンが横に逃げるとか(離すと元の位置に戻ってくる)、
意味不明な軽い嫌がらせがありますけど。 ヘルプ見ると日付型の説明として以下のように書いてあるじゃん。
日付型 (Date) の変数は、IEEE 64 ビット (8 バイト) の浮動小数点数の変数です。
西暦 100 年 1 月 1 日〜西暦 9999 年 12 月 31 日の範囲の日付と、0:00:00 〜 23:59:59 の
範囲の時刻を表すことができます。
でも1900年以前のDate型変数をワークシートに貼ろうと思ってもできなくて、
実行時エラー'1004':
アプリケーション定義またはオブジェクト定義のエラーです。
ってエラーが出てくるじゃん。これ控えめにいtt mysqlとodbc経由で接続している。以前はSQLServerとでもやってた。他にもポスグレやoracleとやってる人間も沢山居るだろ。
んでそんな文句言ってるのはお前だけ。
お前のソースがバグだらけなんだよ。けどソースは示さないんだろ?一人勝手にやってろ >>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 >>.777.
それはVBAの問題じゃない
EXCELで扱える日付範囲がVBAより狭いだけ VABでIEを開いて、
情報を取ってるんですが、
ie.Visible = False
で、
画面でないようにしてるけど、
これは、どこか裏で開いてる?
それとも、消えてくれるのかな、
Falseで画面出さない時は、
IE閉じる処理はしなくてもいいでしょうか? よくわからんけど、WBEクエリってので、
画面出さずに取れませんか。 >>784
クエリでも獲れるけど、
VBAも使いたいので、
なにか閉じる処理とかいるのかなぁ >>784
表の中の項目だったら<td>のinnerTextを取ればいいし、リンクだったら<A>のhrefを取ればいい。
ググればなんとかなるさ。 >>783
タスクマネージャのプロセスにieが残ってるはず。
たとえバックグラウンドであっても、開いたら閉じるが原則。
ie.Quitの1行は必須です。 >>784
ごめんWebクエリってExcelの機能があったのか。
>>786ではCreateObject("MSXML2.XMLHTTP")とCreateObject("htmlfile")を使う方法を答えてしまった。 >>787
そうですか、
閉じるようにします、
ありがとうございます!
>>788
俺も、
htmlのタグとか、でieから情報とってる。 >>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 >>790
昔作った簡易ツールなんだけどさ、これで指定のURLのページのDOM情報を全部ごっそり取れるから試して見たら。
標準モジュールに張り付けて保存して閉じた後で再度開くとアドインリボンにボタンが2つ出来る。
https://pastebin.com/KkNL9u4G 一点忘れてた。
このツール、取ってくるページが重いと時間がかかる。
あんまり遅いときはBreakしてくれ。 CreateObject("InternetExplorer.Application")
なんてしたくないからMSXML2.XMLHTTPとか使うんじゃないのか? >>793
DOM情報は一緒に使える。
情報を得るだけならMSXML2.XMLHTTPの方が良い。
俺のツールは10年以上前に作ったから、その頃はMSXML2.XMLHTTPを知らんかった。 >>791
タイプミスが1個あったよ。
181行目:objndode
おそらく、objNodeと思われ... お前の過去とか知らんし、判ってる事なら修正版を出してはくれまいか >>795
おお、確かに。
>>796
必要なら自分で修正しなよ。
使えるから長いこと使ってるけど簡易ツールだし、マウス下のDOM情報を取って来るツールとかを使う場合も多い。
バグだらけだから公開はしないけど。 >>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 >>798
そうじゃなくて、そのツールでとってこれるのは指定のURLのページがどういう構造になっているかという情報。
それが分かれば自分で組めるでしょという話。
500個のURLのページがみんな同じ構造なら取りあえず1つだけ構造を調べれば他は同じように組めるでしょ。
例えば君は9個のTRの内、1〜4を取りたいけど1だけしか成功して無いんだろ。
なぜ2〜4が取れないかを調べるのに使う。
取りたいデータに名前やクラス名がついてたらそれで取ってきた配列を使うし、無ければタグ名で取って来る。
タグ名ならその右にある番号から何個飛ばしで取れば良いとかを類推する。
MSXML2.XMLHTTPやMSHTML.HTMLDocumentは単純にInternetExplorer.Applicationを置き換えて使えるわけじゃない。
ソースを取ってきてそれをDOMDocumentに当て嵌めれば似たように使えるけど。
ところで、1日に500個のURLから情報取ってきて問題無いんだろうね。
岡崎図書館の例にもある通り、不正アクセスとして捕まるのを避けるために先方には確認してる? ふだんプログラミングはExcelのVBAがほとんどでこれならかなり本格的なこともできるスキルがあります。
ところでJavascriptに興味を持ちメモ帳でJavascriptをはじめました。
これでExcelVBAのようにコード書くときにインテリセンスで入力補助ができるツールってないんですか?
メモ帳だから当然そんなのできません。
Javascriptの入門書はいつくか読んでますがExcelVBAのようなインテリセンスが使える開発環境のことには全くふれていません。 フリーのテキストエディタなんて腐るほど調べりゃ出てくるだろ >>802
いや、ここに居座る。
>>803
VSってVisual Studioですかね?かなり本格的なツールと思いますが
Javascriptでインテリセンスだけできたらいいのですがシンプルなツールはないものでしょうか?
というよりJavascriptやってる人の使用ツールの使用率みたいな円グラフはないでしょうか?
あとExcelVBAでよくやるブレークポイントを使ってF8のコマ送りや実行途中で変数の値を見るのって
Javascriptで使うツールでもできるんですかね? 回答率が低い方で聞くのは時間の無駄では?
NGにするから何でもいいけど >>806
javascriptサポートしてるやつは出てくるんじゃねえの?
使ったことないけど
出ないならvsとか使えばいいじゃん / ̄ ̄ ̄ ̄ ̄\
/ \
/ ヽ
/ ̄\ l \,, ,,/ | そりゃないよ
,┤ ト | (●) (●) | かあちゃん!
| \_/ ヽ \___/ |
| __( ̄ | \/ ノ
ヽ___) ノ >>809
VSは会社で気軽にインストールできないじゃん TR取れないくんはgetElementByTagName("TR")は試したのかよ >>812
そこなんだよ、問題は。
じゃ、テキストエディタは気軽にインスコできるのかっつーと、インテリセンス実現するためには、やれプラグインだなんだって追加する必要が出てくる。
ソフトのインストール申請は1回で済ませたいよね。
となると、なんだかんだでVSが最良の選択肢になる。
配布元がMSなのも安心だし。
HTMLやCSSも入力補完できるからね。
入れておくとめちゃ便利でっせ、旦那。 TeraPadは便利そうだけどvbscriptが標準でサポートされてないのがつらい Notepad++とか軽くていいぞ
申請通りやすいかどうかは分からんが TeraPad は、サロゲートペア(4バイト文字)のような、
ユニコードに新しく採用された漢字は、? に変換されてしまう
中国の「深圳」みたいな漢字 >>819
こんな掲示板のルールは守る必要がない。
そもそも20年くらい前のインターネット創始期にリアル世界からバーチャル世界への人々の続々の初参加で
みんなが気軽に参加さえできればどこでもいい掲示板がたまたまここだっただけで
まるで自分のアイデアで発明して作り上げた掲示板と勘違いした管理人が有名になったことも利用して年収数億円にもなった
そんなずるいアホの作ったルールを守る必要あるか? IDEがダメならVSCにすりゃ良いだろ
デバッグ機能使えるし、エディタ扱いだから軽い >>821
それはあちらのスレでもだれかが言ってたvisual studio codeですか。
評判よさそうなので使ってみます。 あと最重要なことを忘れていた。
Excel VBAのF2で呼び出せるオブジェクトブラウザは上級者ならこの便利さは涙ものだと思うけど
これに相当するものはJavascriptでも使えるんですよね?
たいていのツールならJavascriptでのオブジェクトブラウザは見れる仕様になってるの? visual studio codeはフリーで商用利用も可能だったはず VSCかー、使ってみようかな
今までVSとVBEでしかプログラム書いたことないや >>820
>まるで自分のアイデアで発明して作り上げた掲示板と勘違いした管理人
何かの著書で、自分のオリジナルじゃないと言い切ってたけど。 >>820
ヒュー
スゲー承認します。
が提案は却下でーーす >>820
> こんな掲示板のルールは守る必要がない。
相手してくれる人がいるんならそれでいいんじゃね。
相手したくないやつはスルーするだろうし。 しかもそいつはYoutube動画のすべてのサムネイルで
自分のカバみたいなデカい顔を恥ずかしげもなくデカデカとのせてる。
https://www.youtube.com/channel/UCWlenAgH6lBO36CKiAQR6gQ/videos
これが許させるのはイケメンだけではないか?
勘違いもはなはだしい。 動画の内容も幼稚。
こんな低レベルのことしか考えれないのにしゃべるな!というレベル。
例えばプログラミングついての動画見てよ。
https://www.youtube.com/watch?v=N9Xl2m-GZwc
コピペが最良とか言ってて、こんなんやってたら共同作業でプログラングやってたらめちゃめちゃになる。
このレベルじゃデザインパターンとかリファクタリングのことを全く知らないしろうとだとわかる。
この人さっぱりプログラミングできないのは明らか。
言語の見解としてCOBOLはやる人がいないからチャンスかも、というのもそれは違うだろ。 >>831
まあ、どうでも良いんだがjavascriptは詳しくないからなあ。
有用な回答が得られるかっていうと知らんということでjavascriptのスレよりは難しいんじゃないか?
ところでググることぐらいはしてるんだろうね。
OmniSharpが使えるエディタならなんでもいけるかも。
あと、マイナーかもしれんがScite4がいけるかも。
AutoItで使ってるからjavascriptはどの程度使えるかは分からんが。 >>814
うん、DOMの構造を調べて求めるデータがgetElementsByTagname("TR")の何番目なのかや、実際にはその子どもや孫の可能性もあるからその何番目かっていうのを簡易ツールで調べて欲しいんだがね。
テーブルの場合、連続した番号にならないことも多いから何個飛ばしかが分かれば取ってこれると思うんだけど。 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に格納の
具体的なコードを教えて頂けないでしょうか >>798
1つのドメインにつき、1日1回までにしておかないと、業務妨害で逮捕されるぞ。
同じサイトへ、しつこくアクセスするなよ
普通のサイトは、ツールでのアクセスは認めていないから
robots.txt に、検索エンジンのクローラー(ロボット)に対する、命令が書いてあって、
それに従わないアクセスは、業務妨害で逮捕される >>838
えっ1日に2回サイトにアクセスすると逮捕って日本の法律?
じゃあスクリプト組んで商品買ってるやつみんな逮捕されてんの
コードの書き方書いてるやつやソフト屋も幇助で逮捕されてるんだ
ちなみに取りに行くの海外サイトなんだけど同じなの?
国際指名手配とかになると困るんだけど >>839
大丈夫だよ
>>838はちょっと頭がおかしいだけ >>840
> 岡崎図書館アクセス事件か
wikiを見てみると、1秒に1アクセスは「常識的で礼儀正しい」って世間の認識のようだね
男性の作成したクローラの動作
このクローラは、同時には一回しかリクエストを送らず、受信後に間隔をおいてから次のリクエストを送信していた
(1秒に1アクセス程度に調整)。これはクローラの動作としては「常識的」「礼儀正しい」程度のものであり、
応答を待たずに過大なアクセスを行うことで高負荷にさせる攻撃用のプログラムと異なる動作であった。
男性の業務妨害の強い意図が認められないとして起訴猶予処分となった >>798
1日に500URLの取得が場合によってはサーバーの稼働を妨害していると見られる場合があるので
注意したほうがいいぞ、2回目で通報はないだろうけどな >>841 >>843
OKです
例えばですが同一サイトの目的の個別ページに100アクセスするのと
1アクセスになるのかわからないけど根こそぎリンクたどっていくのとどっちがいいのでしょうか
前者のやり方はググっても同じやり方の参考になるサイトがなくてコードを希望しました
後者なら似た感じのがあったので自分でも作れそうです
欲しい情報のほとんどが各ページ10字程度のTD1ケ所だけです
素人考えで該当のページから必要な部分だけ抜いたほうがいいのかなって思ったんですがどっちがいいのでしょうか サーバーの性能、サイトやデータの構成、取得の目的とか書かないの? 必要な情報は提供せず、こちらが知りたいことだけ教えろ!
これがこのスレの質問者のデフォ >>847
教えても例もしないゴミクズが多すぎるな
特に「具体的なコード教えて」君は人としてのレベルの低さがすけて見えて気持ちが悪いわ 岡崎図書館事件では、逮捕されている。
第三者機関である裁判所から、逮捕状も取れている
裁判所だから、警察などの行政執行機関じゃなくて、司法の判断で、ほぼ有罪になる。
単に、起訴猶予処分にしたというだけ
1秒に1回なら、アクセスしても無罪というのは、
無罪になるために、こういうのが常識ですよって広めただけで、
実際には、逮捕状も取れている
robots.txt に従っていないと、相手のサイトが訴えるのは自由だから、
各社の検索エンジンは、1日1回しかアクセスしない >>849
オンラインゲームでチート反対って言ってる人? >>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を使わない)
この辺は趣味の問題だと思うけど。
なお、スマホから打ってるからコードには間違いが有るかも。 別に反対とは言わないけど、
相手のサイトが、業務妨害で訴えるのは自由だから、逮捕されるよってだけ
コンビニのアイスクリームのケースに入って、写真を撮っただけで逮捕されてる
被害額は、0円なのにw
気持ち悪くて、客に出せないから、アイスクリームを全部捨てましたって
相手は、何とでもできる。
無傷でも、被害額を請求できる >>853
なぜ脅したがるのか知らんがクローラーでなければ問題ないし
先にrobot.txtの内容を見る処理書けばいいだけだから 岡崎図書館の場合は図書館側に問題があって、プログラムでアクセスした時にそれが顕在化したということだったと思うが。
ただし、プログラムでのアクセスはサーバーをダウンさせることもあり得るわけでそれはアクセスの程度問題であるということ、過度なアクセスはサーバー側にとっては迷惑であるということ、不正アクセス防止法は意図しなくても問えるということは、留意する必要があるだろう。
要は無断でのアクセスは迷惑になるから気をつけてってこと。
そういう意識があって、でもそれほどアクセスが有るわけじゃ無いから連絡はしなくても良いだろうという判断ならそれもありじゃないかとも思う。
これが全く気にもせず、人のことはどうでも良いと考える人ならもう教えないし、プログラム組むのも辞めた方が良いと思う。
そういう人のプログラムって動けばOKの独りよがりプログラムになって周りが迷惑になりがちだから。 仕事でWebから情報取って来るプログラムを作ったときは客にその旨を説明し、先方には実際のプログラムのソースコードと一緒にどういう手順でアクセスするかの説明を提示して貰った。
先方と言っても会社は違うけど客の会社の関連会社で情報取って来るプログラムもその会社関連の仕事の中の一部だったわけだけど。
先方が承諾することは分かってたけど一応報告すべきってことで。
>>839
そういうわけで手順を踏んで許可を取れば問題ないから幇助には当たらない。 全部MDISのせい
Librahack氏はMDISに慰謝料を請求してもいいレベルだと思うね 同じコードで実行してもできる時と反応がない時とあるんだけどなんで? >>861
必要な情報は提供せず、こちらが知りたいことだけ教えろ!
これがこのスレの質問者のデフォ
らしいですよ。 >>849
> 1秒に1回なら、アクセスしても無罪というのは、
> 無罪になるために、こういうのが常識ですよって広めただけで、
> 実際には、逮捕状も取れている
不起訴になってるじゃん
前例ができたから、今後は逮捕されることもないでしょ 岡崎図書館不起訴になったのか
じゃあ問題無しだな。一時間に一回ぐらいのクロールなら余裕だろう >>861
その同じコードをさらせよって意味だよ
日本語わかるよな >>862
逆に言うと
その程度の脳みそだから教えてもらわないとわからないってことなんだろうな
低レベルな質問するやつほど
自分の環境言わなかったりコード提示しないイメージ >>853
> コンビニのアイスクリームのケースに入って、写真を撮っただけで逮捕されてる
> 被害額は、0円なのにw
そういう思考回路の時点で、お前も同じレベルのキチガイだ 被害額0円でも女子トイレに入っただけでも逮捕されることあるけどな >>853
それが被害額ゼロ円だと思ってる時点でお察しだよ 初心者ですいません。教えてほしいです。
シートが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 >>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
…
こうすれば何をしているかわかりやすいと思う で、更に言うと、スコープの関係で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
… >>875
874理解しました。
なるほどです。
外出中なので検証できませんが、
changeイベントはシート1の値を対象で
イベントが発生すればifを実行
ifでシート1にデリが記載されていれば
シート2にデリを入力
というのは不可能なんでしょうか、、
帰ったらやってみます。 できるよね
Worksheets("シート2").Cells(linenm,2).Value = "デリ" >>878
今戻って書き直したら正常に動作しました。
ありがとうございます。
別件の質問なんですが、
worksheet_changeは
セルの値を削除した際には対応していないのでしょうか。
うまくいかない・・。 >>879
どう言う手順でセルを削除してるのか知らんが、ブレークポイント置いても止まらんのならそうなんだろ
削除の手順変えるか他のイベントを当たれ >>879
削除ってDELETEキーの事?
それとも行削除?
どっちにしても取得できたけど
Private Sub Worksheet_Change(ByVal Target As Range)
Debug.Print Target.Row
End Sub >>846
余った金で買ってるですら時間かけれなくて基本放置メインの優待株なのにちまちま転売なんて時間ないですよ
休みは家族サービスしなきゃなんないし
暑いなかヨドバシ並んだり労力に合わないこと無理
>>845
いや初心者なんでほんと申し訳ないが相手のサーバーの性能とか構成とかどうやって調べるの?
知りたいしやり方具体的に教えてほしい
自分で貼ったコードは今は理解出来てるけど
初心者からすると3日前ならポカーン
正直debug→sellsなんて簡単な事すらわからないレベルが初心者ですw
>>852
ありがとうございます
変数の置き換え等がまさに知りたかった事です
改変出来るサイトが見つけられず完全にお手上げでした
お酒入ってるんで明日試してみます
質問ですが456行目の...はなにか入るかのでしょうか?それともこのままでしょうか?
tb3のみの取得の場合でもこれでいけるのでしょうか? >>879
おそらくその削除行為で↓のNothing が成り立って終わっている
>If Intersect(Target, range(Cells(13, 3),cells(52,3))) Is Nothing Then >>880
>>881
>>883
解決しました‼
無事作りたいのできました。ありがとうございます‼ すまぬ。助けてほしい。
シート上にActiveコントロールのボタン配置します。
なぜか、勝手に大きくなったりちいさくなったりして堪らん。
解決策ありますか?
別件でもうひとつ。
シート右クリックメニューにコマンド追加してます。(マクロで追加)
端末によって、改ページシート表示時なら、コマンド表示されるけど、標準表示時は標準されない。
何が原因ですかな。標準表示でだしたいの。 >>886
後者に関しては
Cellって名前のCommandBarを取得して変更してると思うけど
改ページと標準で名前はどちらもCellだけど実体は別々のCommandBarだから
改ページの方だけしかメニュー追加できてないんだろう
ついこないだ自分も全く同じ現象にハマった
そのことも加味して作ってるサンプルググれば出てくるよ
出先だから細かいことは書けん >>886
右クリックしてコントロールの書式設定→プロパティ
セルに合わせて移動するがサイズ変更しないを選択 >>888
ためしてみるよ。
ファイル開くたびにミリ単位に小さくなる。開放されたい。 変数のウォッチ式を見ていると、変数の中身が勝手に変わるという現象に遭遇しました
以下のコードのどこかに問題があると思います。問題を絞り込み切れませんでした
直前に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 >>893
変数の中身が変わってるって事は、どこかで代入してるってことだな
変数の宣言はどこでしてる? >>894
宣言は型も指定して、最初にまとめてしてます。
しかし宣言を削除しても変わりませんでした
代入は、していません。
ステップインで以下の行を実行すると、「リスト最終行」という全く関係ない変数の値が変わっています
可変変数かと思いましたが、一体何なんでしょうか
特売コード名 = "" '何故かここで変数「リスト最終行」が「特売コード」の値になります。13桁なのでものすごい量の処理になってしまいます
また、コードの最初に以下の高速化を入れていますが、関係あるでしょうか(もちろん最期に解除しています)
Application.EnableEvents = False
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual >>895
コードを切り出す時に本当は関係ある所を
関係ないと思い込んでいる可能性があるから
コード全体を何処かにアップした方が早く解決すると思う >>896
ありがとうございます
社外持ち出し禁止のファイルなので、もう少し再現性のある部分を整理してみます >>895
long型の変数なら何らかの形で代入処理してないとあたいは変わらんはずだがな
自作関数にbyrefで渡したりしてねーかな
まあ、何にせよ上の人が言ってるようにもう一度全体を見直そう >>898
参照みたいというのは、私も感じました
しかし本当にこの行だったのです
特売コード名 = "" '何故かここで変数「リスト最終行」が「特売コード」の値になります
何度やっても結果が参照だか可変変数だかコード内の改行「 _」にしか見えなかったのですが、絶対に違うのです
メモリが書き換えられているのか、ポインタがぶっ飛んでいるのが、そこまで調査する能力はありません
同僚に「顔青白いけど大丈夫か!?」と言われました。
明日もう一度試してみます >>899
そうですね、もう何が怪しくてもなんでもいいです
最終行を取得せずに直接140を入れてみるテストをしてみます >>901
ちなみに最終列はどうやって取得しとるん?
forで使うときにobjectから引っ張ってきてるのか、その前に変数に代入してるのか >>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 わざと宣言をIntegerに変えてエラーが出ないかどうか 宣言を削除しても、ってことは Option Explicit はなし?
Dim 最終行, 最終列 As Long
のように最後だけに As ○○ ってしてないか? >>905
>宣言を削除しても、ってことは Option Explicit はなし?
そのあたり纏めてです
>Dim 最終行, 最終列 As Long
それもないです、というか宣言あてもなくても変わりません 日本語の変数名ってどうなのかな
仮に全角の空白がコード中にあると見つけるのは厄介なんだよね >>907
解決方法としてはVBEからコードをエクスポートして
記号を表示できるテキストエディタで開くとか たまにしか日本語使わないがそんなことでトラブったことはないな ie制御系の本てあんまりないよね。ネットでちまちま調べながらやってるけどエラーがおこってその原因を調べるのも一苦労。数百回のループの中で99%成功一度だけエラーとか読み込み関係だと思うんだけど、こうすれば絶対防げるとかあるんかね。 >>911
なんのためにIEを制御したいのかわからないけど、データ取得が目的ならIEを制御するという
方法をやめて、直接HTMLを取得して解析する方法にするとか。 変数が日本語で不具合でたことはないな
怪しいのは、変数の方をちゃんと指定してないんじゃないかなってとこ
最初の方でdoubleが入ってるって言ってたよね
〜.Columnの参照持ってきちゃってるとかね
longで型指定してみたら >>912
エクセルから値をコピー→会社のシステム(ie)のテキストボックスにペースト→サーチボタン押す→チェックボックス押す→リストボックスから選ぶ→決定ボタン押す
てのを毎日数百件。
こんなのはスクリプトでも手作業でもなく、エクセルアップロードして終わりとかにして欲しいんだけど。 >>914
ブラウザ側で、jsとか使ってcsv読み込めるようにした方が早そう >>914
RubyやPythonを使えるなら、すぐ作れそうだけどね
頑張って ブラウザのコンソール使えばサイト変更せずに何でもできるよな
あれすげー好き >>914 とりあえず>>791のツールを使ってみ。 そうすれば自動的にどういうコード書けば良いかわかる。 >>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 >>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 >>915
>>916
VBA以外やった事ないんだよね。ie操作はエラーになった時の原因や対処がブログとか個人の質問回答とかで情報少なくて決定版みたいなの見つけにくいんだけど、別言語は充実してる?
>>918
ありがとう。でも会社のパソコン外部ネットワークにつながらなくてUSBとかの持ち込みもだめなんだよ。
一応ieの部品に対して行って欲しい処理自体はできてるから、ループ中に止まりにくい方法調べてみます。 >>920
クソ&クソ作業。
皆当たり前のようにやってる。自分もだけど、プログラミング的な知識無いと、そのやり方に疑問を持つのすら難しい。 ExcelからIEを操作せずにバッチスクリプトでcURLやWgetみたいなHTTPクライアントを使ったらいいと思うけど
外部ネットワークにアクセスできなくて追加インストールもできないとなるといろいろ詰んでるね
Powershellが使えるならそれほど苦労せずスクリプト化できるよ
https://docs.microsoft.com/en-us/powershell/module/Microsoft.PowerShell.Utility/Invoke-WebRequest >>923
なるほど。
うちの職場も無駄な作業が多いけどみんな疑問をいだかないことに対してなんてアホの集団なんだろうと思ってたけど
「プログラミング的な知識が無いとやり方に疑問を持てない」のが原因だったか。
これで疑問が氷解した。
あと1つこの職場で学んだことだが
せっかく自分が自動化するVBAのツールをつくって何人かにそのツールをあげても「使ってくれない」。
これは便利なのが嫌い」なのではなくて「自分が作ったツールじゃないからなにをしているかがさっぱりわからないから怖くて使えない」からだということだ。 だから完全なるアホの集団ではないのかもしれないが、やっぱりアホの集団にはかわらない。
そんな周りの人たちの心理がわかる自分は天才だということだ。 >>922
クリップボードとかSendkeysとか使って無いだろうな?
特にSendkeysは危険。
絶対使うべきじゃない。
分かって使うなら良いけど。
あと、Domを使ってるならクリック時にsubmitでなくClick使ってる場合は注意。
submitは送受信前提だから直後はIEがBusyになるけど、Clickは送受信前提じゃないから(と俺は思ってるけど別の理由かも)いっぱく置いてBusyになることがある。
つまり、Busyチェック時にはかからず、チェック抜けてからBusyになることがある。
俺の場合はClickの時だけチェック前に300msくらいSleepしておく。 >>927
やっぱスリープ入れるべきかな
なんとなくスマートじゃない感じして抜いても動くように作ろうとしてんだけどうまく行かん >>928
そのページの作りによる部分は有るからね。
submitでさえSleep入れる必要があるかもしれない。
遷移した後で少し待ってからさらに遷移する場合とかもあるし、どうしてもそのページに合わせる部分は有るでしょう。 >>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番目) >>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
多分、こんな感じ。 全くの素人です
質問させてください
A1=1の場合タブの色を赤
A1=2の場合タブの色を青
としたくて
A1にはsum関数で数式を組んでるんだが1や2になっても反映されない
手入力で数値を入れるかセルをダブルクリックしてエンターを押すと反映される
何故でしょうか。 >>932
イベントが間違ってる
そんなん条件付き書式でよくね? コードは
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
初心者ですのでここはこうした方がいいなどアドバイスいただけると幸いです >>934
シートのタブ色変更なんですが条件付き書式でできますか? >>932
どちらでも変わったけど
A1=SUM(1)
A1=SUM(2) >>937
条件付き「書式」なんだから、そういう事をするための物だよ >>935
"1"と"2"の両脇の"外したら動かないか? >>935
色が変わったあとに1,2以外が入っても戻らない >>942
A1の数字は一定期間ごとに変化するんですがそれには対応できないということになりますか? >>935
そもそも
Target.addressって絶対参照が返ってくるんじゃなかったっけ?
でもそれなら手入力でも反映されない気がするなぁ
あと、たとえばB1のセルを変更してA1の計算結果が変わったとしても
A1の数式を変更したわけじゃないから
targetにはB1が渡されるだけじゃない?
全部予想ですまん >>935
Worksheet.Change イベント (Excel)
https://msdn.microsoft.com/ja-jp/library/office/ff839775.aspx
>セルが再計算時に変更されると、このイベントは発生しません。シートの再計算をトラップするには、Calculate イベントを使用します。 >>948
ありがとうございますどう組んでいいかわからないので
Worksheet_change
calculateを調べてみます 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)に書き換えればいい すまんちょっと間違えてたわ
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 >>935
ちなみに<> を半角にして、"A1" を "$A$1" にしたら変わったぞ >>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 は変更(入力)した場所が入っているから SUMとしか言ってないので後だしっぽいが
=SUM(Sheet2!B1:B2)は考えなくていいかな >>925
じゃあ関数ならわかるだろうと思って、
IFだらけのクソ長い関数作ってやったわ。
それもわからんて言われたけど。
当たり前か。 そのツールでやってるのは上司も知ってる?
それでも使わない?
何かあれば責任の所在は明らかなのに ADOでエクセル上にあるテーブルに接続していますが、
テキストデータを追加したり、更新したりすると先頭にシングルクォテーションが付いてしまいます。
これは仕様だと思いますが、付かないようにする方法ないでしょうか?
後から消すって方法は無しでお願いします。 >>914
> エクセルアップロードして終わりとかにして欲しいんだけど。
システムへの大量レコードのアップロードって、ミスした時が大変なのよ。
アップロードするファイルを間違えたりするやつが必ずいるから。
場合によっては、システムを停めて修正しなければならなくなる。
なので、コピペによる数百件の手入力は言わば安全策。
派遣スタッフが多い職場でありがちだよね。
というわけで、手入力作業をIE制御で自動で行うツールはどうしても必要になるんだけど、エラートラップ(例外処理)をきちんと作り込まないと逆に使いづらくなるので要注意。 >>957
元データに入ってる、というオチではない? >>958
> アップロードするファイルを間違えたりするやつが必ずいるから。
そんな奴はコピペでも間違えたファイルからコピペするだろ w >>962
エクセルだと無理ってことはアクセス使えってこと?
余計に問題が増えそうだが >>958
なるほど
レコード数に関係なく一定の手間でできるとなると、一瞬で大量のエラーを発生させるやつが出てくるな >>956
そういう責任問題はマクロや関数使わなくても同じ話。
というか、コンピューター使ってる時点で駄目だろ。
最後は何やってもお前のコンピューターの使い方が悪いという話になる。 >>958
それはそういうシステム作った奴が悪い。
いくらでも規定のフォーマットじゃなければ受け付けないシステムは作れるだろ。
CSVなんかでもカンマ区切りじゃなくて普通ならどうやってもキーボード入力出来ない文字で区切るなんてやるし。
それで区切ってなければ1行のデータ数不正で受け取らないなんて簡単。
それ以外にもチェック項目入れてEXCEL上で出力編集できるプログラム組めば良いし。 >>966
データの中身が間違っているものをアップロードしてしまうことを言ってるんじゃないだろうか 正しいデータを入れなおして直るならいいんだけど
取り返しのつかないミスで業務に支障がでたら知らん >>958
データのバリデーションが足りてないだけでしょ >>958
ウチの会社にもいましたわ、こんな事やらかす人達。
所詮、人間がやる事ですけど。 >>966
フォーマットの問題じゃないんだよね。
アップ済みのファイルを再度アップしてしまったり、修正前のファイルをアップしたりとか、フォーマットに問題はないのでシステムは受け付けてしまう。
その辺をリカバリできるシステムにしようとするとまた莫大な金がかかるので、上はなかなか動かない。
それによってどのくらいのコスト削減あるいは利益が見込めるのか、まずは数字出さないと話も聞いてもらえないよ。 >>972
???
後からでも受け付けるようにするだけだろ。
別に難しくないだろ。
後からアップしたのでデータ上書きすれば良い。
もちろん戻れるように履歴取る必要は有るけど。 >>974
一応、ファイルのフォーマットにはユニークなカラムはあるんだけどね。
システム側では、そのカラムはキーになってない。。。と思われ。
さすがにシステムの仕様まではわからない。 >>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")
毎度すいませんがよろしくお願い致します。 >>958
>システムへの大量レコードのアップロードって、ミスした時が大変なのよ。
>アップロードするファイルを間違えたりするやつが必ずいるから
人間は、必ず間違うから、絶対に回復機能が必要。
普通は、バックアップ・スナップショット機能で、前の状態へ戻れる
銀行では、アルバイト3人が、同じデータを入力する。
3人とも同じ金額の時だけ、合格
バリデ、validation >>977
JavaScript の、jQuery でやれば?
Groovy, Ruby でも良いし
何で、VBA でやる?
VBAには、クロージャがあるのか?
最初から、ライブラリが揃っている言語を、使えば良いだけ >>978
>銀行では、アルバイト3人が、同じデータを入力する。
どこの銀行だよwww聞いたことないわwww >>972
>アップ済みのファイルを再度アップしてしまったり、修正前のファイルをアップしたりとか、
間違ったと気づいた時点でオペレータ自身が元に戻せるような仕組みを作るのはそれほど難しくないよ
手動でExcelを修正するステップやその前のステップを含めてシステム化するのが理想ではあるだろうけどね
ただ100~300万くらいのお金を莫大な金と言ってるんであれば自力で頑張るしかない
担当が変われば元の木阿弥だし、本来機械にやらせるべき仕事を人間がやってることによる逸失利益を加味したら安い買い物 >>982
要件も確認しないうちから
> 間違ったと気づいた時点でオペレータ自身が元に戻せるような仕組みを作るのはそれほど難しくないよ
とか言うアホ営業 w 在庫と直結するようなシステムだと現物が関わるからタイミングによっては取り戻すの大変だしね。 >>983
ははは、言いたいことはわかるけどそれは客が要件をすべて決めると思ってるやつの発想
費用に応じて提供出来る内容を変えてあげればいいだけ
そういう調整が出来ない人ばっかりだと苦労するよね
まあそこは論点じゃなく莫大な費用がかかると思ってるのは解決方法の選択肢が見えてないだけで
思ってるほどの費用がかからない方法も有るよってことよ
VBAのかわりにスクリプト書くだけなら100万もいらんし >>984
それは今でも発生しうる業務フローの問題でしょ?
誰かが確認するっていうステップが必要なだけで1件1件コピペ入力しなきゃいけないのとは別問題
確認が必要ならそのフローをシステムに取り込んであげればいい
機械で自動確認できるほうが楽だけどそれは必須じゃないじゃん >>985
> まあそこは論点じゃなく莫大な費用がかかると思ってるのは解決方法の選択肢が見えてないだけで
だから要件も見えてないのに選択肢が見えるわけないだろ w
>>984の件も数件なら後追いで修正できるけど1万件とかになると破綻するとかあるだろうし あれはトレーダーによる入力だからそれ自体が一次情報
複数人による入力対象ではない いつから問題の対象が
複数人による入力
に限定されるようになったんだ >>914が
> こんなのはスクリプトでも手作業でもなく、エクセルアップロードして終わりとかにして欲しいんだけど。
と書いた時から、サーバ側も巻き込んだシステム全体の話になってしまって
このスレの範疇を越えるものになったんだろうな
それは多分「単純作業をVBAでなんとかしたい」と思ってただけの>>914にとって
「そんなことを議論されても俺にはどうしようもない・・・」と思ってると思う >>993
そもそもは>>958が手入力を安全策とか言い出したことからだろ。
手入力なんて全く安全策じゃないし、コンピューターを使う以上、安全性を追求しすぎると本末転倒になるという話。 >>996
あるよ。金融業だけど、新規口座の個人情報入力は子会社の派遣君がやってた。
チェックは正社員がやる。
振込処理なんかはもちろん、絶対にないw このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
life time: 62日 11時間 19分 6秒 2ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 2ちゃんねる専用ブラウザからの広告除去
★ 2ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.2ch.net/
▼ 浪人ログインはこちら ▼
https://login.2ch.net/login.php レス数が1000を超えています。これ以上書き込みはできません。