Excel VBA 質問スレ Part38 [転載禁止]©5ch.io
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2015/09/07(月) 18:59:39.00ID:E2JS6OsF___
___ /____ヽ ____
/____\ | |´・ω・`| | /___ヽ
.l |´・ω・`| ニX二 . ̄ ̄ ̄ 二X二 |´・ω・`| l 俺たちに任せろ
!、 ̄ ̄ ̄ ヽ | | /  ̄ ̄ ̄/
ヽ_/ヽ、 ヽ__) \__/\_/. /_/ ノヽ_/
 ̄  ̄ ̄
このスレはコード書き込みOKです。
作成依頼もOKですが、作成依頼限定ではありません。
コードが嫌な人・作成依頼が嫌な人は別スレ建ててください。
※前スレ
Excel VBA 質問スレ Part37 [転載禁止]2ch.net
http://peace.2ch.net/test/read.cgi/tech/1420841190/
0446デフォルトの名無しさん
2015/10/19(月) 16:57:47.92ID:GKIe3Ccj投げ込めば投げられた側でなんでもやってくれそうな関数作る人いるよね。
でも、結局投げ込む側でもエラー処理を書くという・・・。
じゃぁ、投げ込む前にチェックしてもいいじゃねっていう。
0447デフォルトの名無しさん
2015/10/19(月) 17:47:44.09ID:aF0TbBtn0448デフォルトの名無しさん
2015/10/19(月) 17:50:41.80ID:bIFzKXU5VBAのバージョンって最新のExcelと
違うんですか?
(´・ω・`)
0449デフォルトの名無しさん
2015/10/19(月) 19:07:35.04ID:aF0TbBtnLongPtrとか64bit対応絡みの新しいキーワードが登場してる。
あとDeclare文にはPtrSafeって付けなきゃいけないとか。
0450デフォルトの名無しさん
2015/10/19(月) 20:07:53.08ID:l1IvYy1d直交の意味わかって書いてる?
>>445
> 何らかの加工
の内容にもよるけど、加工するならエラーチェックするのは当たり前だし、何を分解しようとしてるんだろう…
0451デフォルトの名無しさん
2015/10/19(月) 21:11:37.44ID:zICYHlOTそりゃ 「日付に何らかの加工を施した日付を返す」関数を単独に切りだせってことだろ。
引数をDate型にして。
0452デフォルトの名無しさん
2015/10/19(月) 21:43:46.61ID:qpkaMJyWおまいらの付け焼刃のコーディング論なんかクソの役にも立たんねん
要するに余計なお世話なんやで!
0453デフォルトの名無しさん
2015/10/19(月) 21:45:34.98ID:KNkiK4C3LONG_PTR型を使えるようになったVBAバージョンっていくつからかわかりますか?
またLong型を全てLONG_PTR型にすれば、使えるようになったバージョンから〜VBA7で、
オフィスが32bitも64bitも対応可能ってことになりますか?
0454デフォルトの名無しさん
2015/10/20(火) 01:19:09.68ID:xZ1KRCFN成功値ならエラーオブジェクトがNothingであることで判別が付くし、
エラー用のクラスを引数に持たせるなんて書いた覚えないんだけど、
何で引数に持たせると思ったの?
0455デフォルトの名無しさん
2015/10/20(火) 02:20:56.20ID:tpteZREFhttps://msdn.microsoft.com/ja-jp/library/office/gg264421.aspx
0456デフォルトの名無しさん
2015/10/20(火) 07:13:45.13ID:ydswHXZHbyrefで、の流れでレスしてた。すまん。
実処理の結果と論理的な結果が別の変数に乖離するのが嫌なだけだよ。
エラー用のクラスが引数でも、成功値セットのクラスが引数でも同じ事で。
インは引数、アウトは戻り値が理想だよね、って話で、
俺はVariantは宣言したら使っても良いと思う。
0457デフォルトの名無しさん
2015/10/20(火) 07:48:04.26ID:10B2/fqw閏秒のデータはどうなっているんだろう。
規定的には59、60,61秒での桁上がりがあるんだよね。
結構罠だよね
0458デフォルトの名無しさん
2015/10/20(火) 10:20:00.56ID:haHjjt4S> 直交の意味わかって書いてる?
凝集度が低く、なおかつ異なるレイヤー・ドメインの処理が混在していることを、
直交していないと俺は表現してるが、間違ってる?
0459デフォルトの名無しさん
2015/10/20(火) 11:01:43.40ID:iuUw7odg横だが、間違いだと思う。
0460デフォルトの名無しさん
2015/10/20(火) 11:29:40.01ID:haHjjt4S正しい意味は何?
0461デフォルトの名無しさん
2015/10/20(火) 11:31:10.14ID:haHjjt4S> ソフトウェアでの直交性は、機能間の組み合わせや順序について依存関係が小さい事を意味する場合が多い。具体的には次のような事例を指す。
> ・オブジェクトへの操作があるなら逆操作もある。
> ・プロパティ間に依存関係がない。
> ・不変契約が保持されている。
0462デフォルトの名無しさん
2015/10/20(火) 11:58:14.44ID:iuUw7odg>>458に書かれていることと因果関係・相関関係はあるかもしれんが。
0463デフォルトの名無しさん
2015/10/20(火) 12:21:52.14ID:6DVsWO41転じて、無関係ってことやで直交て。
分かりにくい表現の代表みたいなもんだから
使うとむしろ馬鹿っぽい。
0464デフォルトの名無しさん
2015/10/20(火) 12:38:08.75ID:yevMkF1yそれを直交してる/してないって表現するのは初めて聞いた
0465デフォルトの名無しさん
2015/10/20(火) 12:53:13.15ID:9SyfYFZF離れてないけど、
>>458は結果で、あくまで直交性としては、
並行ではない、の逆説的な意味で、機能が独立していること、逆変換可能であること、参照透過であること、じゃないかな。
目がくりっとしてて、耳が立っているのが柴犬、と
犬とは目が2つついてて、耳がついててワンと吠えるもの、
を混同して、
目がくりっとしてて耳が立っているのは目と耳があるから犬である、と言われても、三段論法以前の問題。
0466デフォルトの名無しさん
2015/10/20(火) 13:04:01.33ID:haHjjt4S> 機能が独立していること
うん、これが担保されていないので直交してないと表現したんだけど、どうも一般的じゃ
ないみたいだね。
これからは、使わないようにするよ。
0467デフォルトの名無しさん
2015/10/20(火) 13:23:19.18ID:haHjjt4S俺が直交性という言葉を知ったのは多分『達人プログラマー』で、そこにはこういう説明が
あったらしい。(今手元にないので確認できない)
直交性と DRY
https://gist.github.com/sunaot/625336
0468デフォルトの名無しさん
2015/10/20(火) 16:44:20.95ID:iuUw7odg直交性と参照透過は関係あるのかな?
というのも、たった今こういう記事を読んだから。
http://qiita.com/knaka/items/b18134d9d11b51da4e2e
0469デフォルトの名無しさん
2015/10/20(火) 18:02:51.75ID:wXDHjVPO参照透過であるからこそ、直交性があると思うけど、どうなんだろう。
論旨は面白かったけど。
厳密に言えば、モナドを持つ関数は直交性が無いとすら言えると思う。
解析的に考えると、それは関数じゃない。
0470デフォルトの名無しさん
2015/10/20(火) 18:28:06.05ID:xsVY88X70471デフォルトの名無しさん
2015/10/20(火) 21:03:13.42ID:wFL9h+A/直交って何かと思ったら「次元」みたいな扱いか。
0472デフォルトの名無しさん
2015/10/20(火) 21:47:59.14ID:cLnE5KNn6と10は独立してないけど、2,3,5の組み合わせに分解すると独立する3つの概念に分けられるみたいな。
0473デフォルトの名無しさん
2015/10/20(火) 22:47:59.69ID:eF8264ko0474デフォルトの名無しさん
2015/10/21(水) 00:53:02.66ID:ZXMR/M8n文を改行して書いて!
0475デフォルトの名無しさん
2015/10/21(水) 01:01:19.64ID:PkHZsUUS結合度とは違うのか?
0476デフォルトの名無しさん
2015/10/21(水) 01:03:12.03ID:H5R6aAd2すいません、検索しても見つからず教えていただけないでしょうか?
0477デフォルトの名無しさん
2015/10/21(水) 01:04:55.09ID:PkHZsUUSボタンは知らないけど、シェイプなら登録するマクロに引数持たせれば出来るんじゃないの?
0478デフォルトの名無しさん
2015/10/21(水) 01:11:13.58ID:PNxVph4Dどこまで聞きたいのか分りずらいけど とりあえず。
※あるセルの上にボタンを配置したければ
Set Sel = Range("C5")
With ActiveSheet.Shapes("Button 1")
.Left = Sel.Left
.Top = Sel.Top
.Height = Sel.Height
.Width = Sel.Width
End With
とかで出来る
※あるボタン(実際にはボタン左上の角)がどのセルにあるかは
ActiveSheet.Shapes("Button 1").TopLeftCell
で取得できる
で ボタンが フォームコントロールなら登録したマクロ内で
ActiveSheet.Shapes(Application.Caller).TopLeftCell
で押されたボタンが配置されてるセルが取得できる
0479デフォルトの名無しさん
2015/10/21(水) 01:18:18.38ID:BhomK4j20480デフォルトの名無しさん
2015/10/21(水) 01:23:26.93ID:PNxVph4Dマクロを作るマクロも可能だよ(正確にはプロシージャ)
初心者向きじゃないけど
0481デフォルトの名無しさん
2015/10/21(水) 01:34:40.42ID:H5R6aAd2トンです
0482デフォルトの名無しさん
2015/10/21(水) 15:51:13.20ID:LkMjUTyJリストボックス内は4列あります。
0483デフォルトの名無しさん
2015/10/21(水) 16:34:10.31ID:jN1Om2/z0484デフォルトの名無しさん
2015/10/21(水) 16:41:04.20ID:ZXMR/M8n{
リストボックスから1つずつ項目を取得する。
それを、セルに代入する
}
0485デフォルトの名無しさん
2015/10/21(水) 18:08:08.25ID:H5R6aAd2¥¥2015年度¥10月1日¥xxx.xls
これを分割、結合し、日付型でセルに格納するにはどうしたらいいでしょうか?
0486デフォルトの名無しさん
2015/10/21(水) 18:29:15.59ID:KAyomFd30487デフォルトの名無しさん
2015/10/21(水) 18:35:49.80ID:H5R6aAd2書き方がわかんないので。申し訳ない
0488デフォルトの名無しさん
2015/10/21(水) 18:41:35.80ID:kluOGpTby = Val(Mid(p, 3))
m = Val(Mid(p, 10))
d = Val(Mid(p, InStr(p, "月") + 1))
0489デフォルトの名無しさん
2015/10/21(水) 18:44:59.78ID:PNxVph4DDim X As Variant
Path = "\\2015年度\10月1日\xxx.xls"
X = Split(Path, "\")
DD = Left(X(2), 5) & X(3)
Debug.Print DD
0490デフォルトの名無しさん
2015/10/21(水) 18:48:55.18ID:PNxVph4Dついでたから
"フォーム"って "ユーザフォーム"の事だよね?
それで こゆことかな?
With ListBox1
Range("A1").Resize(.ListCount, .ColumnCount) = .List
End With
0491デフォルトの名無しさん
2015/10/21(水) 19:11:00.07ID:H5R6aAd2これで日付型二なるんですか?
0492デフォルトの名無しさん
2015/10/21(水) 19:21:40.43ID:vq6gVT+v0493デフォルトの名無しさん
2015/10/21(水) 19:23:15.43ID:PNxVph4D実際やった上で ならなかったのかな?
そこハッキリしてもらえる?
でどうなったかも
あと EXCELのバージョンは?俺は2013
0494デフォルトの名無しさん
2015/10/21(水) 19:55:02.13ID:AyxO5/kI意味わかるけど、それだとCとかJavaとかだよっと。
0495デフォルトの名無しさん
2015/10/21(水) 20:05:40.83ID:AyxO5/kIDim path As String
path = "\\2015年度\10月21日\xxx.xls "
path = Replace(path, "\", "")
path = Replace(path, "年度", "/")
path = Replace(path, "月", "/")
path = Left(path, InStr(path, "日") - 1)
Debug.Print path
'どうぞ^^
0496デフォルトの名無しさん
2015/10/21(水) 20:43:44.15ID:kPIHjX0Mpath = "\\2015年度\10月21日\xxx.xls"
path = Replace(path, "\", "")
path = Replace(path, "度", "")
path = Left(path, InStr(path, "日"))
0497デフォルトの名無しさん
2015/10/21(水) 21:04:24.47ID:AyxO5/kIお前嫌いだわw
0498デフォルトの名無しさん
2015/10/21(水) 21:18:48.27ID:AyxO5/kIあと、間違ってるぞw
0499デフォルトの名無しさん
2015/10/21(水) 21:31:54.39ID:PNxVph4Dもう一個作ってみた DateValue関数使ってるから問題ないと思うが・・・・
(正規表現のパターンは 問題なく抽出出来るというだけで 適当です)
Path = "\\2015年度\10月21日\xxx.xls "
With CreateObject("VBScript.RegExp")
.Pattern = "\D*(\d*)\D*(\d*)\D*(\d*)"
.Global = True
Set X = .Execute(Path)(0).SubMatches
End With
Range("A1") = DateValue(X(0) & "/" & X(1) & "/" & X(2))
0500デフォルトの名無しさん
2015/10/21(水) 22:23:48.23ID:FoBwPO4y?
0501デフォルトの名無しさん
2015/10/22(木) 01:02:44.17ID:LWUxr4XK0502デフォルトの名無しさん
2015/10/22(木) 07:20:30.02ID:ZDrmESzip = "\\2015年度\10月22日\xxx.xls"
y = Val(Mid(p, 3))
m = Val(Mid(p, 10))
d = Val(Mid(p, InStr(p, "月") + 1))
If m <= 3 Then y = y + 1
n = DateSerial(y, m, d)
0503デフォルトの名無しさん
2015/10/22(木) 13:15:57.14ID:MOe0leML繰り返し回数を分岐させたいのですがうまくいきません。
サンプルでこんな感じなのですが、繰り返し回数が無いものと認識されてしまいます。
作っているプログラムは、「for to」 以下の処理が長いので、分岐ごとにK を確定値として書くとコードが汚いなーと思いまして。。。
なんかいい方法はございますでしょうか
Sub test()
Dim k As Long
Dim i As Long
If Cells(1, 1) = 1 Then
k = 5
Else
k = 1
End If
’
For i = 2 To k
Cells(i, 1) = "AAA"
Next
End Sub
0504デフォルトの名無しさん
2015/10/22(木) 13:33:06.72ID:XUAQn5SBそのコードでは A1 が 1 以外の時 K=1 になる
これでは 後段の forが
For i = 2 To 1
となるのでループが回らない
で この時(A1 が 1 以外の時)はどうしたいの?
ちなみに
i=2→1 と iを減らしたい時は
For i = 2 To 1 step -1
とやらないといけないのだけど・・・
0505デフォルトの名無しさん
2015/10/22(木) 14:23:49.51ID:S7H835Oy構造化プログラミングで検索して勉強してみるといいかも。
VBAでの具体的なところでは、まずはsubやfunctionにして外に追い出す感じ。
ちょっと乱暴な説明でゴメン。
0506デフォルトの名無しさん
2015/10/22(木) 15:09:41.55ID:MOe0leML>>504
ご指摘ありがとうございます。
例が間違ってました。
元のプログラムが動かなくて、
簡単な例を作ってみて、やっぱり動かないので、
繰り返し回数に変数を入れると動かないと勘違いしていたのですが、i=1が原因でしたか。。。。
動くんですね。
そのご指摘で、作ってるコードの繰り返し回数のif文の複数回分岐が間違って、
i=0となっていることに気が付きました。
stepも教えていただきありがとうございます。
>>505
ありがとうございます。
ちょうど今試してみました。ユーザ定義関数が超便利です。
0507デフォルトの名無しさん
2015/10/22(木) 18:08:56.39ID:AgyudLkAなにがしたいのかよくわからんが
こういうことがやりたいのかな
For i = 2 To k+1
Cells(i, 1) = "AAA"
Next
0508デフォルトの名無しさん
2015/10/22(木) 20:30:31.00ID:kZtQWjvo構造化とオブジェクト指向って多くの部分で重なってるよね??
0509デフォルトの名無しさん
2015/10/22(木) 21:48:11.17ID:tUEKhMi2エクセルでこういうのを作りたい
球団12と120人の選手がいて球団は1位〜120位まで欲しい選手が同列なく
いて選手もまた1〜12まで同列なくいきたい球団が決まってる
最初選手は一番目に志望を提出する。各球団は、1〜120の自分の順位に従って、10人に届くまで必ずキープする。
そこで、キープに入れなかった(トライアウトに落ちた)選手は第二希望に行く、そこで球団は今のキープ選手より順位が高い選手が来れば
入れ替えるし、来なかったらそのままにする。10人を満たしてなかった球団は必ず受け入れる。
これを繰り返して、全球団に10人ずつ選手を満たすまでやる。
というのをやってみたいんですが、選手と球団に乱数でそれぞれ重複のない順位を与える
というところでとまっています。
関数の使い方とか教えてください
0510デフォルトの名無しさん
2015/10/22(木) 22:12:26.74ID:NqpfO95zDim 球団(1 To 12), 選手(1 To 120), 希望選手(1 To 120), 希望球団(1 To 12)
For k = 1 To 12
Erase 希望選手
For i = 1 To 120
Do
j = Int(Rnd Mod 120) + 1
If 希望順位(j) = 0 Then 希望順位(j) = i: Exit Do
Loop
Next
球団(k) = 希望順位
Next
For k = 1 To 120
Erase 希望球団
For i = 1 To 12
Do
j = Int(Rnd Mod 12) + 1
If 希望球団(j) = 0 Then 希望球団(j) = i: Exit Do
Loop
Next
選手(k) = 希望球団
Next
0511デフォルトの名無しさん
2015/10/22(木) 22:15:01.81ID:NqpfO95z0512デフォルトの名無しさん
2015/10/22(木) 22:34:04.37ID:tUEKhMi2御親切にありがとうございます。
すいません、これが例えばキープという制度はなく、
最初の希望で10人とったら確定になってしまい、落ちた選手が第二希望に行ったとしても
その第二希望の球団が10人になっていたら、入れ替えはなく自動的に3,4,5と落ちて行って
空いてるところに収まる場合はどうなりますか?
細かい違いなのですが、教えていただければ幸いです
0513デフォルトの名無しさん
2015/10/22(木) 22:58:58.52ID:NqpfO95z>>510はあくまで「12球団が希望するそれぞれの選手の順番」と「選手120人が希望するそれぞれの球団の順番」が揃っただけだから、
ここで得られたジグ配列を利用してキープなり先着順なりのアルゴリズムを実装する事になる。
それぞれの配列は
「球団(i)(j)」の時、「i球団がj番目に欲しい選手」
「選手(i)(j)」の時、「i選手がj番目に入りたい球団」
とする事が出来るはずなので後は自分で考えるなりしてくれ。
0514デフォルトの名無しさん
2015/10/23(金) 07:07:59.29ID:cnjrTfagそうだね。でも基本的に重なっている部分は
「基本的に同じコードは2度書かない」ということに回帰する。
VBAの場合一応クラスが使えるから、Object指向の言語を先に勉強すると、
きちんと場所ごとに役割付けされた、無駄な分岐のない
見やすく改修しやすいコードで組むことが出来るようになるね。
0515デフォルトの名無しさん
2015/10/23(金) 08:04:19.01ID:NKqGTZsQ重なっているというよりはレイヤの違う概念だな
本当は直交する概念と書きたかったけど、ちょこっと意味が違うなw
0516デフォルトの名無しさん
2015/10/23(金) 12:02:54.11ID:p1/LXmyz他人に使ってもらうことを考えるときはVBAのクラスは採用しづらい。
自分は全くクラスモジュールを使わないようにしている。
0517デフォルトの名無しさん
2015/10/23(金) 12:12:13.25ID:C4TSXTyD自社の台帳入力にあたり入力項目が多いので省力化と入力ミス防止のため、ユーザーフォームを用意しコマンドボタン押下で対象セルに一括登録するマクロを書きました。
ユーザーフォームは29箇所のテキストボックスと4箇所のコンボボックス構成され、編集されたかどうかを判定するためいずれかのオブジェクトでChangeイベントが有ったときにパブリック変数Changeで編集フラグを立てています。
コマンドボタン押下で呼び出されるプロシージャにはApplication.EnableEvents = Falseを記述しています。
動作は希望通りの物ができたのですが、コマンドボタン押下後の動きをF8で追っていくとなぜか特定のコンボボックスのチェンジイベントが発生し、
編集フラグの有無を判定後フラグなしの場合にフラグ立てるプロシージャ(Combobox1_Changeとします)に動作が移ります。
それが一度ならばまだしも各オブジェクトのValue値を対応するセルに入れるコード度にCombobox1_Changeを呼び出してしまいます(合計33回)。
いずれかのオブジェクトに入力された時点でフラグは立っているので無意味なコードを何度も繰り返し実行していることになります。
念のために”Combobox1_Change”を”Combobox1x_Change”とするなどして名称を変更した場合には他のプロシージャに動作が移る事はありません。
動作に支障はないものの、実行速度も気持ち遅く感じております。
どなたか原因がわかるかたいらっしゃいませんか?
0518デフォルトの名無しさん
2015/10/23(金) 12:52:24.38ID:9JJo3sM8編集されたかどうかを知りたいだけなら、フォームを開く前後で全項目の比較をすれば?
0519デフォルトの名無しさん
2015/10/23(金) 13:52:01.55ID:C4TSXTyD編集されたかどうかをチェンジイベントで判定している理由は、一つのレコードは一度の入力で完了するものではなく、項目によっては後日入力する必要があるため、
フォーム上のスピンボタンを押して通し番号を変更して他のレコードに移れる様にするためです。
0520デフォルトの名無しさん
2015/10/23(金) 14:16:30.63ID:9JJo3sM8> 編集されたかどうかをチェンジイベントで判定している理由は、一つのレコードは一度の入力で完了するものではなく、項目によっては後日入力する必要があるため、
これをまとめてやってはいけない理由がわからない。
> フォーム上のスピンボタンを押して通し番号を変更して他のレコードに移れる様にするためです。
スピンボタンを押したときにまとめてチェックすれば?
0521デフォルトの名無しさん
2015/10/23(金) 14:19:17.14ID:9JJo3sM8疑問その2: 仮に各項目毎に編集フラグがあったとして、1 → 2 → 1と変更されたら、
イベントハンドラで単にフラグを立てるだけだと、変更されたと見なしてしまうのでは?
0522デフォルトの名無しさん
2015/10/23(金) 15:43:55.61ID:C4TSXTyD>これをまとめてやってはいけない理由がわからない。
用途は受注の一元管理のための物です。
受注時、請求時、入金時に各項目を入力する物で、フォームをみれば未請求・未入金が分かるようにしてあります。
請求や入金時には該当する受注のレコードを表示して空欄を埋めます。
>スピンボタンを押したときにまとめてチェックすれば?
その方法の方がスマートと思います。
一度取り組んでみます。
>>521
>疑問その1: そもそも編集されたかどうかは、何のために知る必要があるの?
スピンボタンを押したときに変更されていればMsgboxで確認後にセルに上書きしてから別のレコードに移る為です。
>疑問その2: 仮に各項目毎に編集フラグがあったとして、1 → 2 → 1と変更されたら、
イベントハンドラで単にフラグを立てるだけだと、変更されたと見なしてしまうのでは?
おっしゃるとおりです。
変更有りと見なされて確認のMsgboxが出ますが上書きするだけのコードなので変更がなければキャンセルしてレコードは移ります。
なお編集フラグはフォームのコード上で一つしか用意していないのでどこかが編集されればフラグONとなります。
フラグの立て方やチェックのタイミングはご指摘された点も納得でき、私の至らない部分も理解できますが
ご教授いただきたいのはなぜ同じコンボボックスのチェンジイベントが何度も発生し同じコードが繰り返し呼び出されるのか、と言う点なんです。
0523デフォルトの名無しさん
2015/10/23(金) 15:47:04.27ID:ivRzPMDy0524デフォルトの名無しさん
2015/10/23(金) 16:09:40.49ID:6RpU4G8/Private Sub UserForm_Initialize()
ComboBox1.AddItem "a"
ComboBox1.AddItem "b"
End Sub
Private Sub CommandButton1_Click()
Application.Worksheets("Sheet1").Range("A1").value = TextBox1.value
Application.Worksheets("Sheet1").Range("A2").value = ComboBox1.value
End Sub
Private Sub ComboBox1_Change()
MsgBox ""
End Sub
Private Sub TextBox1_Change()
MsgBox ""
End Sub
'なりませんけど?
0525デフォルトの名無しさん
2015/10/23(金) 16:15:24.71ID:6RpU4G8/>コマンドボタン押下後の動きをF8で追っていくと
追っていっているなら、コマンドボタンのチェンジイベントに行く
前のコード知ってますよね?
そこから辿れませんか?
連投しつれい。
0526デフォルトの名無しさん
2015/10/23(金) 16:43:46.01ID:vuxsJR4x俺も昔同じようなこと経験したな。
初心者なりにいろいろ試したけど結局解決せず、
イベントプロシージャを使わない方法に変更したなー
0527デフォルトの名無しさん
2015/10/23(金) 16:47:18.61ID:Fl5byCeAcontrolsをfor eachで舐めて、typename(control)で判断して、TexTboxなら.text、ComboBoxなら .valueを、;かなんかで繋げて返す関数作る。
For each ctl in me.Controls
if typename(ctl)="TextBox" then ret=ret&ctl.Text
:
next
なんて具合に。
で、その画面の初期値をセットし終わったらメンバ変数に関数から取得したその文字列持っておく。
保存時、関数呼び出して、メンバ変数に保存されてる文字列と一致しなかったら、変更あり。
イベントに頼りすぎ。
ComboBoxってValueに値入れたらChanged走るだろ。
TextBoxも、Textに値入れたら。
0528デフォルトの名無しさん
2015/10/23(金) 17:05:55.98ID:C4TSXTyDコマンドボタンを押した後の動作は
1 編集フラグを確認する変数を確認
2 編集されている場合は上書き確認のメッセージボックスを表示
3 OKボタンが押されれば各コントロールの値を指定するセルに代入するプロシージャ(登録処理)を呼び出す。
問題は3の登録処理プロシージャ内の
.Cells(参照行, 2).Value = ComboBox_受注者.Value
.Cells(参照行, 3).Value = TextBox_見積番号.Value
.Cells(参照行, 5).Value = ComboBox_受注先.Value
の様に対応するセルに各コントロールの値を渡すコード全てで”ComboBox_受注先_Change”が呼び出され実行されます。
入力されるセルは33箇所あるため33回呼び出しています。
>>526
イベントプロシージャを使わないのも選択の一つですが、原因を知りたいというのが一番です。
>>527
Valueに値をいれているのではなくセルに対応するコントロールのValueを渡しているんです。
(セルと対応するコントロールはそれぞれ対になっています)
なのにChangeイベントプロシージャが呼び出されます。
0529デフォルトの名無しさん
2015/10/23(金) 17:06:50.36ID:6RpU4G8/でもさ、Changeイベントで使う側が納得できるなら
BeforeUpdateイベントでも良くね?
0530デフォルトの名無しさん
2015/10/23(金) 17:08:27.14ID:KQKbFmU6RowSourceに指定されてるセルの内容が変わってもChange走るみたいだからそれじゃね
0531デフォルトの名無しさん
2015/10/23(金) 17:19:50.77ID:C4TSXTyD謎のChangeイベントが発生して何度も呼び出されるComboBoxのRowSourceは作業用のデータ格納用の別シートを参照しているんです。
0532デフォルトの名無しさん
2015/10/23(金) 17:24:25.81ID:Fl5byCeAコンボにセットしてる所が見えないからわからんけど、値で渡せてる?
>>529
Change、発生要因が多すぎ。
取り敢えず内容が変わるか、参照が変わるか、参照先の内容が変わると発生しよる。
0533デフォルトの名無しさん
2015/10/23(金) 17:24:41.12ID:KQKbFmU6じゃあ知らん。自分で確認しろ
関係ないと思われるコードをちょっとずつ削って行って
最終的にこれ以上削ると現象が発生しなくなるとこまで削れ
そのコード見ても原因がわからないようだったらそのコード晒して再度聞いてみ
0534デフォルトの名無しさん
2015/10/23(金) 17:27:05.03ID:6RpU4G8/それだ!
俺も確認した。
>>531
RowSourceで設定しないでClearとAddItemで頑張れば解決なんじゃないの?
0535デフォルトの名無しさん
2015/10/23(金) 19:50:15.39ID:F3Hmui89セルの値を弄るならフォーム要らないし、フォームで弄るならセル要らないし。
0536デフォルトの名無しさん
2015/10/23(金) 20:09:19.74ID:NKqGTZsQ無駄を気にするんだったら編集前の値を保存しておくしかないよ。
0537デフォルトの名無しさん
2015/10/23(金) 20:15:34.06ID:AqPItTe/0538デフォルトの名無しさん
2015/10/23(金) 23:56:25.83ID:gGW/KTGnんじゃ、その
>作業用のデータ格納用の別シート
のセルが、代入先セルを参照しちゃってるとか?
気づかないうちにそうなってしまってる可能性はあるかもしれないよ?
てか、それくらいしか思いつかん。
0539デフォルトの名無しさん
2015/10/24(土) 13:21:06.86ID:X34FC24zSub test()
Sheets.Add after:=ActiveSheet
ActiveSheet.Range("a1").Value = "1"
Sheet1.Range("a1").Value = "2"
End Sub
シートを追加して、追加したシートのA1に1
もともとあったシートのA1に2を代入するマクロについて
実行すると、追加後のシート2がアクティブの状態で終了しているのですがこれはどうしてでしょうか。
素人考えですが、その次の行で、Sheet1.Range("a1").Value = "2"入力している以上、元々あったシート1がアクティブな状態で
終了しないのでしょうか。
0540デフォルトの名無しさん
2015/10/24(土) 13:30:11.03ID:NDQYSDCEそう思わないか?
0541デフォルトの名無しさん
2015/10/24(土) 14:03:12.90ID:YiK6tCta代入とかではアクティブシートは変化しないよ
0542デフォルトの名無しさん
2015/10/24(土) 14:28:38.49ID:tZ2jAKBl0543デフォルトの名無しさん
2015/10/24(土) 15:23:30.40ID:nr5gFTSO処理後にもっかいアクティブにしときゃええんちゃうか
0544デフォルトの名無しさん
2015/10/24(土) 18:32:52.39ID:X34FC24zありがとうございます、代入くらいでは変化しなさそうですね
0545デフォルトの名無しさん
2015/10/24(土) 19:56:10.60ID:fS9+MhVNvbscriptでexcelマクロ動かした時
シートコピーするとコピー後シートが
ActiveSheetにならなくて
意外に思った時がありました
Worksheet.copyで戻り値がBooleanなのも
その時知ったなぁ…
■ このスレッドは過去ログ倉庫に格納されています