Excel VBA 質問スレ Part49at TECH
Excel VBA 質問スレ Part49 - 暇つぶし2ch883:デフォルトの名無しさん
17/08/20 05:28:39.28 C1zPHqEG0.net
>>853
> コンビニのアイスクリームのケースに入って、写真を撮っただけで逮捕されてる
> 被害額は、0円なのにw
そういう思考回路の時点で、お前も同じレベルのキチガイだ

884:デフォルトの名無しさん
17/08/20 08:32:07.00 1pFA1rOB0.net
被害額0円でも女子トイレに入っただけでも逮捕されることあるけどな

885:デフォルトの名無しさん
17/08/20 09:23:54.53 B8YXLqYv0.net
>>861
コードが間違ってるから

886:デフォルトの名無しさん
17/08/20 10:22:38.45 fQYf1WJRM.net
>>853
それが被害額ゼロ円だと思ってる時点でお察しだよ

887:デフォルトの名無しさん
17/08/20 11:34:29.55 xnxdM6Sy0.net
初心者ですいません。教えてほしいです。
シートが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

888:デフォルトの名無しさん
17/08/20 13:16:25.67 hXI6dDhp0.net
>>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

こうすれば何をしているかわかりやすいと思う

889:デフォルトの名無しさん
17/08/20 13:17:04.87 hXI6dDhp0.net
で、更に言うと、スコープの関係で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


890:デフォルトの名無しさん
17/08/20 14:44:51.18 Qs6CySsIa.net
>>875
874理解しました。
なるほどです。
外出中なので検証できませんが、
changeイベントはシート1の値を対象で
イベントが発生すればifを実行
ifでシート1にデリが記載されていれば
シート2にデリを入力
というのは不可能なんでしょうか、、
帰ったらやってみます。

891:デフォルトの名無しさん
17/08/20 18:50:52.94 1pFA1rOB0.net
できるよね
Worksheets("シート2").Cells(linenm,2).Value = "デリ"

892:デフォルトの名無しさん
17/08/20 18:56:54.50 hXI6dDhp0.net
すまんかった、普通に間違えてたわ

893:デフォルトの名無しさん
17/08/20 22:03:48.69 xnxdM6Sy0.net
>>878
今戻って書き直したら正常に動作しました。
ありがとうございます。
別件の質問なんですが、
worksheet_changeは
セルの値を削除した際には対応していないのでしょうか。
うまくいかない・・。

894:デフォルトの名無しさん
17/08/20 22:23:57.13 4PP/aROC0.net
>>879
どう言う手順でセルを削除してるのか知らんが、ブレークポイント置いても止まらんのならそうなんだろ
削除の手順変えるか他のイベントを当たれ

895:デフォルトの名無しさん
17/08/20 22:27:23.10 hXI6dDhp0.net
>>879
削除ってDELETEキーの事?
それとも行削除?
どっちにしても取得できたけど
Private Sub Worksheet_Change(ByVal Target As Range)
Debug.Print Target.Row
End Sub

896:デフォルトの名無しさん
17/08/20 22:32:57.93 ikiDo2Le0.net
>>846
余った金で買ってるですら時間かけれなくて基本放置メインの優待株なのにちまちま転売なんて時間ないですよ
休みは家族サービスしなきゃなんないし
暑いなかヨドバシ並んだり労力に合わないこと無理
>>845
いや初心者なんでほんと申し訳ないが相手のサーバーの性能とか構成とかどうやって調べるの?
知りたいしやり方具体的に教えてほしい
自分で貼ったコードは今は理解出来てるけど
初心者からすると3日前ならポカーン
正直debug→sellsなんて簡単な事すらわからないレベルが初心者ですw
>>852
ありがとうございます
変数の置き換え等がまさに知りたかった事です
改変出来るサイトが見つけられず完全にお手上げでした
お酒入ってるんで明日試してみます
質問ですが456行目の...はなにか入るかのでしょうか?それともこのままでしょうか?
tb3のみの取得の場合でもこれでいけるのでしょうか?

897:デフォルトの名無しさん
17/08/21 00:12:17.86 yLjCptZM0.net
>>879
おそらくその削除行為で↓のNothing が成り立って終わっている
>If Intersect(Target, range(Cells(13, 3),cells(52,3))) Is Nothing Then

898:デフォルトの名無しさん
17/08/21 02:11:48.51 7jIbvv4Ra.net
>>880
>>881
>>883
解決しました‼
無事作りたいのできました。ありがとうございます‼

899:デフォルトの名無しさん
17/08/21 10:14:11.43 WASZaGRQ0.net
>>884
どう解決したか書けよハゲ

900:デフォルトの名無しさん
17/08/21 12:19:06.20 EyA7fO9yr.net
すまぬ。助けてほしい。
シート上にActiveコントロールのボタン配置します。
なぜか、勝手に大きくなったりちいさくなったりして堪らん。
解決策ありますか?

別件でもうひとつ。
シート右クリックメニューにコマンド追加してます。(マクロで追加)
端末によって、改ページシート表示時なら、コマンド表示されるけど、標準表示時は標準されない。
何が原因ですかな。標準表示でだしたいの。

901:デフォルトの名無しさん
17/08/21 12:42:03.35 a8XpI6K5M.net
>>886
後者に関しては
Cellって名前のCommandBarを取得して変更してると思うけど
改ページと標準で名前はどちらもCellだけど実体は別々のCommandBarだから
改ページの方だけしかメニュー追加できてないんだろう
ついこないだ自分も全く同じ現象にハマった
そのことも加味して作ってるサンプルググれば出てくるよ
出先だから細かいことは書けん

902:デフォルトの名無しさん
17/08/21 12:44:17.85 yLjCptZM0.net
>>886
右クリックしてコントロールの書式設定→プロパティ
セルに合わせて移動するがサイズ変更しないを選択

903:デフォルトの名無しさん
17/08/21 13:44:10.34 EyA7fO9yr.net
>>887
たすかる。あとは、さがしてみるよ!

904:デフォルトの名無しさん
17/08/21 13:46:53.82 EyA7fO9yr.net
>>888
ためしてみるよ。
ファイル開くたびにミリ単位に小さくなる。開放されたい。

905:デフォルトの名無しさん
17/08/21 14:35:20.65 yLjCptZM0.net
>>890
URLリンク(answers.microsoft.com)
それでもだめならグループ化すれば治る場合もあるらしい

906:デフォルトの名無しさん
17/08/21 14:42:45.59 EyA7fO9yr.net
>>891
おう!。たすかります。

907:デフォルトの名無しさん
17/08/21 20:36:29.86 F/qAyFl80.net
変数のウォッチ式を見ていると、変数の中身が勝手に変わるという現象に遭遇しました
以下のコードのどこかに問題があると思います。問題を絞り込み切れませんでした
直前に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

908:デフォルトの名無しさん
17/08/21 20:44:14.03 WASZaGRQ0.net
>>893
変数の中身が変わってるって事は、どこかで代入してるってことだな
変数の宣言はどこでしてる?

909:デフォルトの名無しさん
17/08/21 20:48:40.29 F/qAyFl80.net
>>894
宣言は型も指定して、最初にまとめてしてます。
しかし宣言を削除しても変わりませんでした
代入は、していません。
ステップインで以下の行を実行すると、「リスト最終行」という全く関係ない変数の値が変わっています
可変変数かと思いましたが、一体何なんでしょうか
特売コード名 = "" '何故かここで変数「リスト最終行」が「特売コード」の値になります。13桁なのでものすごい量の処理になってしまいます
また、コードの最初に以下の高速化を入れていますが、関係あるでしょうか(もちろん最期に解除しています)
Application.EnableEvents = False
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

910:デフォルトの名無しさん
17/08/21 21:01:33.61 UpqFzRYS0.net
>>895
コードを切り出す時に本当は関係ある所を
関係ないと思い込んでいる可能性があるから
コード全体を何処かにアップした方が早く解決すると思う

911:デフォルトの名無しさん
17/08/21 21:04:30.96 F/qAyFl80.net
>>896
ありがとうございます
社外持ち出し禁止のファイルなので、もう少し再現性のある部分を整理してみます

912:デフォルトの名無しさん
17/08/21 21:21:28.12 WASZaGRQ0.net
>>895
long型の変数なら何らかの形で代入処理してないとあたいは変わらんはずだがな
自作関数にbyrefで渡したりしてねーかな
まあ、何にせよ上の人が言ってるようにもう一度全体を見直そう

913:デフォルトの名無しさん
17/08/21 21:23:33.08 WASZaGRQ0.net
個人的には最終列の取得方法が怪しいと見ているが

914:デフォルトの名無しさん
17/08/21 21:41:38.22 F/qAyFl80.net
>>898
参照みたいというのは、私も感じました
しかし本当にこの行だったのです
特売コード名 = "" '何故かここで変数「リスト最終行」が「特売コード」の値になります
何度やっても結果が参照だか可変変数だかコード内の改行「 _」にしか見えなかったのですが、絶対に違うのです
メモリが書き換えられているのか、ポインタがぶっ飛んでいるのが、そこまで調査する能力はありません
同僚に「顔青白いけど大丈夫か!?」と言われました。
明日もう一度試してみます

915:デフォルトの名無しさん
17/08/21 21:43:58.48 F/qAyFl80.net
>>899
そうですね、もう何が怪しくてもなんでもいいです
最終行を取得せずに直接140を入れてみるテストをしてみます

916:デフォルトの名無しさん
17/08/21 22:46:20.73 WASZaGRQ0.net
>>901
ちなみに最終列はどうやって取得しとるん?
forで使うときにobjectから引っ張ってきてるのか、その前に変数に代入してるのか

917:デフォルトの名無しさん
17/08/21 22:55:53.80 F/qAyFl80.net
>>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

918:デフォルトの名無しさん
17/08/21 23:16:57.21 AMZKW1PT0.net
わざと宣言をIntegerに変えてエラーが出ないかどうか

919:デフォルトの名無しさん
17/08/21 23:24:15.17 AMZKW1PT0.net
宣言を削除しても、ってことは Option Explicit はなし?
Dim 最終行, 最終列 As Long
のように最後だけに As ○○ ってしてないか?

920:デフォルトの名無しさん
17/08/21 23:38:13.41 F/qAyFl80.net
>>905
>宣言を削除しても、ってことは Option Explicit はなし?
そのあたり纏めてです
>Dim 最終行, 最終列 As Long
それもないです、というか宣言あてもなくても変わりません

921:デフォルトの名無しさん
17/08/22 02:30:22.28 UcqKMUBs0.net
日本語の変数名ってどうなのかな
仮に全角の空白がコード中にあると見つけるのは厄介なんだよね

922:デフォルトの名無しさん
17/08/22 07:30:25.87 IrcFtIiG0.net
>>907
解決方法としてはVBEからコードをエクスポートして
記号を表示できるテキストエディタで開くとか

923:デフォルトの名無しさん
17/08/22 08:46:12.95 efKhXBAh0.net
変数名が日本語なのがバグの原因、に100ペリカ

924:デフォルトの名無しさん
17/08/22 11:48:53.83 EWbmYfD4d.net
たまにしか日本語使わないがそんなことでトラブったことはないな

925:デフォルトの名無しさん
17/08/22 13:57:55.46 bO04JkUdM.net
ie制御系の本てあんまりないよね。ネットでちまちま調べながらやってるけどエラーがおこってその原因を調べるのも一苦労。数百回のループの中で99%成功一度だけエラーとか読み込み関係だと思うんだけど、こうすれば絶対防げるとかあるんかね。

926:デフォルトの名無しさん
17/08/22 14:17:54.96 BcNwm5wtH.net
>>911
なんのためにIEを制御したいのかわからないけど、データ取得が目的ならIEを制御するという
方法をやめて、直接HTMLを取得して解析する方法にするとか。

927:デフォルトの名無しさん
17/08/22 14:32:57.14 3oFcm+Eea.net
変数が日本語で不具合でたことはないな
怪しいのは、変数の方をちゃんと指定してないんじゃないかなってとこ
最初の方でdoubleが入ってるって言ってたよね
~.Columnの参照持ってきちゃってるとかね
longで型指定してみたら

928:デフォルトの名無しさん
17/08/22 14:52:26.20 bO04JkUdM.net
>>912
エクセルから値をコピー→会社のシステム(ie)のテキストボックスにペースト→サーチボタン押す→チェックボックス押す→リストボックスから選ぶ→決定ボタン押す
てのを毎日数百件。
こんなのはスクリプトでも手作業でもなく、エクセルアップロードして終わりとかにして欲しいんだけど。

929:デフォルトの名無しさん
17/08/22 15:03:25.63 X7Tz7Bl60.net
>>914
ブラウザ側で、jsとか使ってcsv読み込めるようにした方が早そう

930:デフォルトの名無しさん
17/08/22 15:31:32.03 BcNwm5wtH.net
>>914
RubyやPythonを使えるなら、すぐ作れそうだけどね
頑張って

931:デフォルトの名無しさん
17/08/22 19:14:59.94 mRcKPRVe0.net
ブラウザのコンソール使えばサイト変更せずに何でもできるよな
あれすげー好き

932:デフォルトの名無しさん
17/08/22 19:32:43.17 j7l9pWc0a.net
>>914 とりあえず>>791のツールを使ってみ。 そうすれば自動的にどういうコード書けば良いかわかる。

933:デフォルトの名無しさん
17/08/22 19:53:03.47 j7l9pWc0a.net
>>836
とりあえず、>>745と合わせてプログラムを類推して、ツッコミどころを順々に修正しながら8つのパターンで組んでみた。
たぶん、5つ目のサンプルでB2からB101まで取得データを書き込めると思う。
ただし、実際にはTHタグが何個あるかわからないのでIE上でF12キーを押して問題のテーブルを表示させてTHが何個あるかを確認して修正すること。
現在のプログラムはTHが3個、TDの2番目からデータを取得する前提で組んでいる。
(0始まりでTHは0、1、2なのでTDの2番目は全体で4番目)
URLリンク(pastebin.com)

934:デフォルトの名無しさん
17/08/22 19:59:15.08 Gbnbr+eX0.net
>>914
クソみたいな作業だなw
ご愁傷様

935:デフォルトの名無しさん
17/08/22 20:14:43.78 j7l9pWc0a.net
>>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

936:デフォルトの名無しさん
17/08/22 20:24:31.59 fju/pSre0.net
>>915
>>916
VBA以外やった事ないんだよね。ie操作はエラーになった時の原因や対処がブログとか個人の質問回答とかで情報少なくて決定版みたいなの見つけにくいんだけど、別言語は充実してる?
>>918
ありがとう。でも会社のパソコン外部ネットワークにつながらなくてUSBとかの持ち込みもだめなんだよ。
一応ieの部品に対して行って欲しい処理自体はできてるから、ループ中に止まりにくい方法調べてみます。

937:デフォルトの名無しさん
17/08/22 20:35:39.11 fju/pSre0.net
>>920
クソ&クソ作業。
皆当たり前のようにやってる。自分もだけど、プログラミング的な知識無いと、そのやり方に疑問を持つのすら難しい。

938:デフォルトの名無しさん
17/08/22 20:57:35.78 1JK3C2LQ0.net
ExcelからIEを操作せずにバッチスクリプトでcURLやWgetみたいなHTTPクライアントを使ったらいいと思うけど
外部ネットワークにアクセスできなくて追加インストールもできないとなるといろいろ詰んでるね
Powershellが使えるならそれほど苦労せずスクリプト化できるよ
URLリンク(docs.microsoft.com)

939:デフォルトの名無しさん
17/08/22 20:59:25.09 yhGjK5+g0.net
>>923
なるほど。
うちの職場も無駄な作業が多いけどみんな疑問をいだかないことに対してなんてアホの集団なんだろうと思ってたけど
「プログラミング的な知識が無いとやり方に疑問を持てない」のが原因だったか。
これで疑問が氷解した。
あと1つこの職場で学んだことだが
せっかく自分が自動化するVBAのツールをつくって何人かにそのツールをあげても「使ってくれない」。
これは便利なのが嫌い」なのではなくて「自分が作ったツールじゃないからなにをしているかがさっぱりわからないから怖くて使えない」からだということだ。

940:デフォルトの名無しさん
17/08/22 21:01:25.05 yhGjK5+g0.net
だから完全なるアホの集団ではないのかもしれないが、やっぱりアホの集団にはかわらない。
そんな周りの人たちの心理がわかる自分は天才だということだ。

941:デフォルトの名無しさん
17/08/22 21:39:28.52 RSpbi9dUa.net
>>922
クリップボードとかSendkeysとか使って無いだろうな?
特にSendkeysは危険。
絶対使うべきじゃない。
分かって使うなら良いけど。
あと、Domを使ってるならクリック時にsubmitでなくClick使ってる場合は注意。
submitは送受信前提だから直後はIEがBusyになるけど、Clickは送受信前提じゃないから(と俺は思ってるけど別の理由かも)いっぱく置いてBusyになることがある。
つまり、Busyチェック時にはかからず、チェック抜けてからBusyになることがある。
俺の場合はClickの時だけチェック前に300msくらいSleepしておく。

942:デフォルトの名無しさん
17/08/22 22:07:32.73 Gbnbr+eX0.net
>>927
やっぱスリープ入れるべきかな
なんとなくスマートじゃない感じして抜いても動くように作ろうとしてんだけどうまく行かん

943:デフォルトの名無しさん
17/08/22 22:56:13.57 3iMCLjz4a.net
>>928
そのページの


944:作りによる部分は有るからね。 submitでさえSleep入れる必要があるかもしれない。 遷移した後で少し待ってからさらに遷移する場合とかもあるし、どうしてもそのページに合わせる部分は有るでしょう。



945:デフォルトの名無しさん
17/08/22 22:57:24.09 vl5o4wqs0.net
>>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番目)

946:デフォルトの名無しさん
17/08/23 00:05:41.99 FdVTMyW1a.net
>>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
多分、こんな感じ。

947:デフォルトの名無しさん
17/08/23 08:10:00.16 EgpJbwY2a.net
全くの素人です
質問させてください
A1=1の場合タブの色を赤
A1=2の場合タブの色を青
としたくて
A1にはsum関数で数式を組んでるんだが1や2になっても反映されない
手入力で数値を入れるかセルをダブルクリックしてエンターを押すと反映される
何故でしょうか。

948:デフォルトの名無しさん
17/08/23 08:11:08.70 OKqU/Ui90.net
>>932
実際に何をやったの?

949:デフォルトの名無しさん
17/08/23 08:15:41.26 RC4smTF3a.net
>>932
イベントが間違ってる
そんなん条件付き書式でよくね?

950:デフォルトの名無しさん
17/08/23 08:18:48.53 EgpJbwY2a.net
コードは
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
初心者ですのでここはこうした方がいいなどアドバイスいただけると幸いです

951:デフォルトの名無しさん
17/08/23 08:29:58.52 OKqU/Ui90.net
>>935
エラーになる

952:デフォルトの名無しさん
17/08/23 08:33:36.33 EgpJbwY2a.net
>>934
シートのタブ色変更なんですが条件付き書式でできますか?

953:デフォルトの名無しさん
17/08/23 08:36:18.74 OKqU/Ui90.net
>>932
どちらでも変わったけど
A1=SUM(1)
A1=SUM(2)

954:デフォルトの名無しさん
17/08/23 08:47:09.36 13NrMZgc0.net
>>925
それはお前が信用されてないからでわw

955:デフォルトの名無しさん
17/08/23 08:49:04.48 13NrMZgc0.net
>>937
条件付き「書式」なんだから、そういう事をするための物だよ

956:デフォルトの名無しさん
17/08/23 09:21:19.41 +0TvjQ0a0.net
>>935
"1"と"2"の両脇の"外したら動かないか?

957:デフォルトの名無しさん
17/08/23 10:06:33.42 zci6CT9Ca.net
>>935
色が変わったあとに1,2以外が入っても戻らない

958:デフォルトの名無しさん
17/08/23 10:15:50.03 EgpJbwY2a.net
>>940
ご教示下さい

959:デフォルトの名無しさん
17/08/23 10:23:11.79 EgpJbwY2a.net
>>941
動きませんでした

960:デフォルトの名無しさん
17/08/23 10:24:44.20 EgpJbwY2a.net
>>942
A1の数字は一定期間ごとに変化するんですがそれには対応できないということになりますか?

961:デフォルトの名無しさん
17/08/23 10:47:29.53 N2QxNW8Oa.net
>>937
ごめんタブか

962:デフォルトの名無しさん
17/08/23 11:13:45.38 yxvWLKA00.net
>>935
そもそも
Target.addressって絶対参照が返ってくるんじゃなかったっけ?
でもそれなら手入力でも反映されない気がするなぁ
あと、たとえばB1のセルを変更してA1の計算結果が変わったとしても
A1の数式を変更したわけじゃないから
targetにはB1が渡されるだけじゃない?
全部予想ですまん

963:デフォルトの名無しさん
17/08/23 12:01:09.88 QSg8qhxn0.net
>>935
Worksheet.Change イベント (Excel)
URLリンク(msdn.microsoft.com)
>セルが再計算時に変更されると、このイベントは発生しません。シートの再計算をトラップするには、Calculate イベントを使用します。

964:デフォルトの名無しさん
17/08/23 13:56:51.41 EgpJbwY2a.net
>>948
ありがとうございますどう組んでいいかわからないので
Worksheet_change
calculateを調べてみます

965:デフォルトの名無しさん
17/08/23 18:51:26.23 Rd2CDMDCM.net
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)に書き換えればいい

966:950
17/08/23 18:54:14.54 Rd2CDMDCM.net
すまんちょっと間違えてたわ
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

967:デフォルトの名無しさん
17/08/24 01:43:32.58 gFPKAoW/0.net
>>935
ちなみに<> を半角にして、"A1" を "$A$1" にしたら変わったぞ

968:952
17/08/24 02:23:07.38 gFPKAoW/0.net
>>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 は変更(入力)した場所が入っているから

969:デフォルトの名無しさん
17/08/24 05:57:45.02 H9WPuZGK0.net
SUMとしか言ってないので後だしっぽいが
=SUM(Sheet2!B1:B2)は考えなくていいかな

970:デフォルトの名無しさん
17/08/24 21:45:58.84 fiG1XOAx0.net
>>925
じゃあ関数ならわかるだろうと思って、
IFだらけのクソ長い関数作ってやったわ。
それもわからんて言われたけど。
当たり前か。

971:デフォルトの名無しさん
17/08/24 22:13:24.34 H9WPuZGK0.net
そのツールでやってるのは上司も知ってる?
それでも使わない?
何かあれば責任の所在は明らかなのに

972:デフォルトの名無しさん
17/08/24 23:00:01.92 q91vBAgZ0.net
ADOでエクセル上にあるテーブルに接続していますが、
テキストデータを追加したり、更新したりすると先頭にシングルクォテーションが付いてしまいます。
これは仕様だと思いますが、付かないようにする方法ないでしょうか?
後から消すって方法は無しでお願いします。

973:デフォルトの名無しさん
17/08/25 01:43:07.95 KTLmtMM0r.net
>>914
> エクセルアップロードして終わりとかにして欲しいんだけど。
システムへの大量レコードのアップロードって、ミスした時が大変なのよ。
アップロードするファイルを間違えたりするやつが必ずいるから。
場合によっては、システムを停めて修正しなければならなくなる。
なので、コピペによる数百件の手入力は言わば安全策。
派遣スタッフが多い職場でありがちだよね。
というわけで、手入力作業をIE制御で自動で行うツールはどうしても必要になるんだけど、エラートラップ(例外処理)をきちんと作り込まないと逆に使いづらくなるので要注意。

974:デフォルトの名無しさん
17/08/25 02:02:02.49 jgB7N/LP0.net
>>957
コードは?

975:デフォルトの名無しさん
17/08/25 06:46:28.19 eH4j8CdN0.net
>>957
元データに入ってる、というオチではない?

976:デフォルトの名無しさん
17/08/25 07:59:18.90 s9vD7wq8M.net
>>958
> アップロードするファイルを間違えたりするやつが必ずいるから。
そんな奴はコピペでも間違えたファイルからコピペするだろ w

977:デフォルトの名無しさん
17/08/25 08:16:24.76 fNT5yRt6a.net
大量のデータをエクセルでやるのに無理がある

978:デフォルトの名無しさん
17/08/25 08:39:54.31 ZY8b+JLd0.net
>>962
エクセルだと無理ってことはアクセス使えってこと?
余計に問題が増えそうだが

979:デフォルトの名無しさん
17/08/25 11:34:23.91 9EHfqskZd.net
>>958
なるほど
レコード数に関係なく一定の手間でできるとなると、一瞬で大量のエラーを発生させるやつが出てくるな

980:デフォルトの名無しさん
17/08/25 12:46:59.96 4kzNGnM2a.net
>>956
そういう責任問題はマクロや関数使わなくても同じ話。
というか、コンピューター使ってる時点で駄目だろ。
最後は何やってもお前のコンピューターの使い方が悪いという話になる。

981:デフォルトの名無しさん
17/08/25 12:55:04.81 4kzNGnM2a.net
>>958
それはそういうシステム作った奴が悪い。
いくらでも規定のフォーマットじゃなければ受け付けないシステムは作れるだろ。
CSVなんかでもカンマ区切りじゃなくて普通ならどうやってもキーボード入力出来ない文字で区切るなんてやるし。
それで区切ってなければ1行のデータ数不正で受け取らないなんて簡単。
それ以外にもチェック項目入れてEXCEL上で出力編集できるプログラム組めば良いし。

982:デフォルトの名無しさん
17/08/25 13:18:40.53 11RxMW0L0.net
>>966
データの中身が間違っているものをアップロードしてしまうことを言ってるんじゃないだろうか

983:デフォルトの名無しさん
17/08/25 14:22:18.70 jgB7N/LP0.net
正しいデータを入れなおして直るならいいんだけど
取り返しのつかないミスで業務に支障がでたら知らん

984:デフォルトの名無しさん
17/08/25 15:30:41.90 7eimf3NdH.net
>>958
データのバリデーションが足りてないだけでしょ

985:デフォルトの名無しさん
17/08/25 16:19:40.23 YOvDFOChp.net
バックアップを取ってリカバリしないの?

986:デフォルトの名無しさん
17/08/25 18:19:08.43 ljcbkcPnp.net
>>958
ウチの会社にもいましたわ、こんな事やらかす人達。
所詮、人間がやる事ですけど。

987:デフォルトの名無しさん
17/08/25 18:24:10.85 KTLmtMM0r.net
>>966
フォーマットの問題じゃないんだよね。
アップ済みのファイルを再度アップしてしまったり、修正前のファイルをアップしたりとか、フォーマットに問題はないのでシステムは受け付けてしまう。
その辺をリカバリできるシステムにしようとするとまた莫大な金がかかるので、上はなかなか動かない。
それによってどのくらいのコスト削減あるいは利益が見込めるのか、まずは数字出さないと話も聞いてもらえないよ。

988:デフォルトの名無しさん
17/08/25 22:45:26.71 jbJbRr/0a.net
>>972
???
後からでも受け付けるようにするだけだろ。
別に難しくないだろ。
後からアップしたのでデータ上書きすれば良い。
もちろん戻れるように履歴取る必要は有るけど。

989:デフォルトの名無しさん
17/08/25 23:17:31.65 11RxMW0L0.net
>>973
たぶんキーが無いんじゃない?

990:デフォルトの名無しさん
17/08/26 07:13:30.51 vvYv5Hier.net
>>973
働いたことないの?

991:デフォルトの名無しさん
17/08/26 07:22:16.86 vvYv5Hier.net
>>974
一応、ファイルのフォーマットにはユニークなカラムはあるんだけどね。
システム側では、そのカラムはキーになってない。。。と思われ。
さすがにシステムの仕様まではわからない。

992:デフォルトの名無しさん
17/08/26 09:32:33.78 5dccF0/k0.net
>>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")
毎度すいませんがよろしくお願い致します。

993:デフォルトの名無しさん
17/08/26 13:59:12.95 1Xp/S2sl0.net
>>958
>システムへの大量レコードのアップロードって、ミスした時が大変なのよ。
>アップロードするファイルを間違えたりするやつが必ずいるから
人間は、必ず間違うから、絶対に回復機能が必要。
普通は、バックアップ・スナップショット機能で、前の状態へ戻れる
銀行では、アルバイト3人が、同じデータを入力する。
3人とも同じ金額の時だけ、合格
バリデ、validation

994:デフォルトの名無しさん
17/08/26 14:10:14.30 1Xp/S2sl0.net
>>977
JavaScript の、jQuery でやれば?
Groovy, Ruby でも良いし
何で、VBA でやる?
VBAには、クロージャがあるのか?
最初から、ライブラリが揃っている言語を、使えば良いだけ

995:デフォルトの名無しさん
17/08/26 14:14:47.08 svByvDEZ0.net
>>978
>銀行では、アルバイト3人が、同じデータを入力する。
どこの銀行だよwww聞いたことないわwww

996:デフォルトの名無しさん
17/08/26 15:49:08.64 O53zOlu10.net
データを2人で入力してチェックするのは割りと普通
URLリンク(www.noc-net.co.jp)
重要な奴なら3重チェックもあるんじゃね

997:デフォルトの名無しさん
17/08/26 16:55:31.30 azDqTcfP0.net
>>972
>アップ済みのファイルを再度アップしてしまったり、修正前のファイルをアップしたりとか、
間違ったと気づいた時点でオペレータ自身が元に戻せるような仕組みを作るのはそれほど難しくないよ
手動でExcelを修正するステップやその前のステップを含めてシステム化するのが理想ではあるだろうけどね
ただ100~300万くらいのお金を莫大な金と言ってるんであれば自力で頑張るしかない
担当が変われば元の木阿弥だし、本来機械にやらせるべき仕事を人間がやってることによる逸失利益を加味したら安い買い物

998:デフォルトの名無しさん
17/08/26 17:26:45.76 O53zOlu10.net
>>982
要件も確認しないうちから
> 間違ったと気づいた時点でオペレータ自身が元に戻せるような仕組みを作るのはそれほど難しくないよ
とか言うアホ営業 w

999:デフォルトの名無しさん
17/08/26 17:45:46.64 6HYM9FnY0.net
在庫と直結するようなシステムだと現物が関わるからタイミングによっては取り戻すの大変だしね。

1000:デフォルトの名無しさん
17/08/26 17:49:54.05 azDqTcfP0.net
>>983
ははは、言いたいことはわかるけどそれは客が要件をすべて決めると思ってるやつの発想
費用に応じて提供出来る内容を変えてあげればいいだけ
そういう調整が出来ない人ばっかりだと苦労するよね
まあそこは論点じゃなく莫大な費用がかかると思ってるのは解決方法の選択肢が見えてないだけで
思ってるほどの費用がかからない方法も有るよってことよ
VBAのかわりにスクリプト書くだけなら100万もいらんし

1001:デフォルトの名無しさん
17/08/26 17:55:27.18 azDqTcfP0.net
>>984
それは今でも発生しうる業務フローの問題でしょ?
誰かが確認するっていうステップが必要なだけで1件1件コピペ入力しなきゃいけないのとは別問題
確認が必要ならそのフローをシステムに取り込んであげればいい
機械で自動確認できるほうが楽だけどそれは必須じゃないじゃん

1002:デフォルトの名無しさん
17/08/26 17:56:27.22 azDqTcfP0.net
Excel関係ない気がするからこの辺にしとくわ

1003:デフォルトの名無しさん
17/08/26 18:39:24.64 O53zOlu10.net
>>985
> まあそこは論点じゃなく莫大な費用がかかると思ってるのは解決方法の選択肢が見えてないだけで
だから要件も見えてないのに選択肢が見えるわけないだろ w
>>984の件も数件なら後追いで修正できるけど1万件とかになると破綻するとかあるだろうし

1004:デフォルトの名無しさん
17/08/26 19:30:25.78 qX5fc/S5a.net
株かなにかで金額間違えてニュースになったな

1005:デフォルトの名無しさん
17/08/26 19:42:35.36 eHXsO5oX0.net
あれはトレーダーによる入力だからそれ自体が一次情報
複数人による入力対象ではない

1006:デフォルトの名無しさん
17/08/26 21:03:15.65 F72uLJPi0.net
いつから問題の対象が
複数人による入力
に限定されるようになったんだ

1007:デフォルトの名無しさん
17/08/26 22:10:58.71 eHXsO5oX0.net
さあ

1008:デフォルトの名無しさん
17/08/27 02:42:06.83 L7AzHdYH0.net
>>914
> こんなのはスクリプトでも手作業でもなく、エクセルアップロードして終わりとかにして欲しいんだけど。
と書いた時から、サーバ側も巻き込んだシステム全体の話になってしまって
このスレの範疇を越えるものになったんだろうな
それは多分「単純作業をVBAでなんとかしたい」と思ってただけの>>914にとって
「そんなことを議論されても俺にはどうしようもない・・・」と思ってると思う

1009:デフォルトの名無しさん
17/08/27 09:42:07.86 M71tiO6/0.net


1010:デフォルトの名無しさん
17/08/27 10:41:40.78 hneRKt3Sa.net
>>993
そもそもは>>958が手入力を安全策とか言い出したことからだろ。
手入力なんて全く安全策じゃないし、コンピューターを使う以上、安全性を追求しすぎると本末転倒になるという話。

1011:デフォルトの名無しさん
17/08/27 12:36:10.64 9rRkVsmFa.net
銀行でバイトに入力させるとかないだろ

1012:デフォルトの名無しさん
17/08/27 12:40:26.06 LjjEWylk0.net
>>996
あるよ。金融業だけど、新規口座の個人情報入力は子会社の派遣君がやってた。
チェックは正社員がやる。
振込処理なんかはもちろん、絶対にないw

1013:デフォルトの名無しさん
17/08/27 12:40:42.78 LjjEWylk0.net

Excel VBA 質問スレ Part50 [無断転載禁止]?2ch.net
URLリンク(mevius.2ch.net)

1014:デフォルトの名無しさん
17/08/27 13:14:20.45 EGaKBA6h0.net
>>998


1015:デフォルトの名無しさん
17/08/27 13:34:20.02 rBvqwKY30.net
ぬるぽ

1016:1001
Over 1000 Thread.net
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
life time: 62日 11時間 19分 6秒

1017:過去ログ ★
[過去ログ]
■ このスレッドは過去ログ倉庫に格納されています


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch