Excel VBA 質問スレ Part33
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2013/10/17(木) 22:04:40.64___
___ /____ヽ ____
/____\ | |´・ω・`| | /___ヽ
.l |´・ω・`| ニX二 . ̄ ̄ ̄ 二X二 |´・ω・`| l 俺たちに任せろ
!、 ̄ ̄ ̄ ヽ | | /  ̄ ̄ ̄/
ヽ_/ヽ、 ヽ__) \__/\_/. /_/ ノヽ_/
 ̄  ̄ ̄
前スレ
Excel VBA 質問スレ Part32
http://toro.2ch.net/test/read.cgi/tech/1381151717/
このスレはコード書き込みOKです。
作成依頼もOKですが、作成依頼限定ではありません。
コードが嫌な人はこちらのスレへ
http://toro.2ch.net/test/read.cgi/tech/1381151995/l50
0002デフォルトの名無しさん
2013/10/17(木) 22:11:59.510003デフォルトの名無しさん
2013/10/17(木) 22:15:11.1201 http://pc11.2ch.net/test/read.cgi/tech/1054356121/
02 http://pc11.2ch.net/test/read.cgi/tech/1168308855/
03 http://pc11.2ch.net/test/read.cgi/tech/1180192018/
04 http://pc11.2ch.net/test/read.cgi/tech/1189814602/
05 http://pc11.2ch.net/test/read.cgi/tech/1197448064/
06 http://pc11.2ch.net/test/read.cgi/tech/1205231499/
07 http://pc11.2ch.net/test/read.cgi/tech/1212587819/
08 http://pc11.2ch.net/test/read.cgi/tech/1219673793/
09 http://pc11.2ch.net/test/read.cgi/tech/1228372971/
10 http://pc12.2ch.net/test/read.cgi/tech/1235332603/
11 http://pc12.2ch.net/test/read.cgi/tech/1241885130/
12 http://pc12.2ch.net/test/read.cgi/tech/1247566074/
13 http://pc12.2ch.net/test/read.cgi/tech/1254281104/
14 http://pc12.2ch.net/test/read.cgi/tech/1262748898/
15 http://pc12.2ch.net/test/read.cgi/tech/1271261239/
16 http://hibari.2ch.net/test/read.cgi/tech/1280045912/
17 http://hibari.2ch.net/test/read.cgi/tech/1289182437/
18 http://hibari.2ch.net/test/read.cgi/tech/1298240666/
19 http://hibari.2ch.net/test/read.cgi/tech/1305754555/
20 http://hibari.2ch.net/test/read.cgi/tech/1312435844/
21 http://hibari.2ch.net/test/read.cgi/tech/1316931607/
22 http://toro.2ch.net/test/read.cgi/tech/1322400978/
23 http://toro.2ch.net/test/read.cgi/tech/1327763113/
24 http://toro.2ch.net/test/read.cgi/tech/1334305148/
25 http://toro.2ch.net/test/read.cgi/tech/1341722983/
26 http://toro.2ch.net/test/read.cgi/tech/1345363310/
27 http://toro.2ch.net/test/read.cgi/tech/1353842387/
28 http://toro.2ch.net/test/read.cgi/tech/1359607536/
29 http://toro.2ch.net/test/read.cgi/tech/1364689772/
30 http://toro.2ch.net/test/read.cgi/tech/1370088822/
31 http://toro.2ch.net/test/read.cgi/tech/1376371376/
0004デフォルトの名無しさん
2013/10/17(木) 22:31:44.49と入力したとして、「お」が入力された時だけA1、B1、C1、D1
の入力内容をE1,F1,G1,H1に自動入力する方法はないでしょうか?
D1に「お」が入力された時だけH1に「お」を入力するのはIFでできたんですが、
条件が合った時だけセル位置を指定して自動入力する事はできないのでしょうか?
0005デフォルトの名無しさん
2013/10/17(木) 22:32:56.01今までの資産の問題があるから多分変わらないとは思うけど、
使えるようになってくれればいいね。
0006デフォルトの名無しさん
2013/10/17(木) 22:37:31.53取り敢えず前スレがまだ消化されてるどころの話じゃないのでこっちで聞こうか
前スレ
Excel VBA 質問スレ Part32
http://toro.2ch.net/test/read.cgi/tech/1381151717/
0007デフォルトの名無しさん
2013/10/17(木) 23:31:38.27変わった方がいいの?
0008デフォルトの名無しさん
2013/10/17(木) 23:36:04.76変わって欲しくない人もいっぱいいるとは思うけど、
.Netはかなり便利な機能が沢山あるからね。
0009710
2013/10/18(金) 08:04:26.310010デフォルトの名無しさん
2013/10/19(土) 16:27:30.160011710
2013/10/19(土) 17:33:45.78シートとかセルとかもオブジェクトなので、OOP の方が楽だよ。
とある案件で C++ から Excel 操作してるけど、楽だよ〜。
0012デフォルトの名無しさん
2013/10/19(土) 18:45:25.93確か3DSはC++、PSVITAはC#でコード書くんだっけ?
0013デフォルトの名無しさん
2013/10/21(月) 11:44:25.92Excel VBA 質問スレ Part32
http://toro.2ch.net/test/read.cgi/tech/1381151717/
0014デフォルトの名無しさん
2013/10/29(火) 18:17:55.650015デフォルトの名無しさん
2013/11/03(日) 18:57:18.550016デフォルトの名無しさん
2013/11/05(火) 12:54:43.75この、一見ホモ顔、実はロリコン、実体はレイプ犯みたいな顔は誰
0017デフォルトの名無しさん
2013/11/05(火) 13:39:47.080018デフォルトの名無しさん
2013/11/07(木) 13:15:50.48ありがとう、この人物の性癖広まってるんだ
いつの手配写真だろ
韓国で整形したから同じ顔が沢山いるのかな
0019デフォルトの名無しさん
2013/11/19(火) 19:18:48.76Dim app As New Application
app.Visible = False '無くても「ファイル名.xlsm」は表示しなかった
app.Workbooks.Open Filename:= "D:\ファイル名.xlsm"
act_sh_Name = app.ActiveSheet.Name
act_cel_Name = app.ActiveCell.Address
'act_cel_Name = app.ActiveCell.Address(True, True, xlA1, True)
'シートとセル名を一括で取得できるが利用時を考え別々に取得
app.Quit
必要最小限
0020デフォルトの名無しさん
2013/11/22(金) 13:21:37.360021デフォルトの名無しさん
2013/11/22(金) 13:45:41.81コレってどんな時に使う?
使った事ある人いたら教えて
0022デフォルトの名無しさん
2013/11/22(金) 14:17:06.27http://toro.2ch.net/test/read.cgi/tech/1382015080/21
0023デフォルトの名無しさん
2013/11/22(金) 15:02:23.40意味不明〜ぃ
URL貼るなら、中身を見てからにして下さい
0024デフォルトの名無しさん
2013/11/22(金) 15:43:48.29初めてみるプロパティだからいじってみたけど
オプションの詳細設定にある 時間がかかる操作が発生したときに警告を表示する
の数値設定するだけだな
たしかにその数値がオプションに設定されるし、その設定数以上のセル削除の操作で警告がでた
マクロでセル操作してもその警告は出ないっぽいからあんまり関係ないかも
0025デフォルトの名無しさん
2013/11/22(金) 15:45:28.15誰か>>24のオプションのデフォルト値いくらか教えてくれ
0026デフォルトの名無しさん
2013/11/22(金) 15:49:51.76俺には関係の無い話だった。
002721
2013/11/22(金) 16:11:14.92ありがとう、理解できました。
0028デフォルトの名無しさん
2013/11/22(金) 16:36:59.51検証乙です。
ウチのPC (Win7 Office2010) では
MsgBox Application.LargeOperationCellThousandCount
の実行結果は"33554"だったよ
(""は便宜上書いてるだけで、実際には表示されてません)
0029デフォルトの名無しさん
2013/11/22(金) 17:52:30.30Ans0 = Int(Rnd * 10000)
Ans1 = Mid(Ans0, 1, 1)
Ans2 = Mid(Ans0, 2, 1)
Ans3 = Mid(Ans0, 3, 1)
Ans4 = Mid(Ans0, 4, 1)
For i = 1 To 4
If Ans(i) = 0 Then 'Controls("Ans" & i)でもコンパイルエラーが出る・・・
GoTo P001:
End If
Next
0030デフォルトの名無しさん
2013/11/22(金) 18:23:29.32Controlsはそういう使い方をするもんではない
あれはフォーム内のオブジェクトとかに使う
この場合は変数Ansを素直に配列変数で宣言すれば良いだけの話
Dim Ans(4)
とかいうふうに宣言する
配列要素の数が不定なら動的配列で宣言する
Dim Ans()
としておいて、後から必要に応じて
Redim Ans("配列要素数") とかやる
基本的に配列の大きさを変えると中身が消えるけど、
消したくないときは
Redim Preserve Ans("配列要素数") ってやる
ただし、大きくするのはこれで良いけど、
小さくするときにあふれた要素はどうやったって消えるので注意
0031デフォルトの名無しさん
2013/11/22(金) 20:24:48.16んで、途中で強制的にストップさせたりするのってESCを押せば中止できるけど、エラーになってしまうじゃないですか。
エラーを起こさずに中止させる方法ってあります?
0032デフォルトの名無しさん
2013/11/22(金) 20:50:03.84プログラムで中止するなら、一応、StopとかEndとかいう命令はあるが
普通は実行するコードが無くなったら止まるのでそんな命令書かない
プログラムの外から止めるのなら、それはプログラムにとっては異常事態なんだからエラーでてもしょうがない
つかためしたけど、エラーは出てないっぽいけどな
0033デフォルトの名無しさん
2013/11/22(金) 20:54:04.32Office TANAKA - Excel VBA Tips[Escキーでマクロを停止させない]
http://officetanaka.net/excel/vba/tips/tips60.htm
VBA応用(ESCキーで処理が止まるのをコントロールする。)
http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_090_050.html
ただ、どんな処理をするのか知らんけど、
コードの内容如何によっては
何のアナウンスも出さずにただ処理を止めるだけでは
宜しくない場合ってのも有りうるわけで。
そういう場合、ESCで止めるよりも
コード実行中にパラメータの不備をチェックできるように
コード自体を書いておくほうが良いんじゃねーかなと思う。
0034デフォルトの名無しさん
2013/11/22(金) 21:16:27.53レスありがとです。
確かに強制的に停止させるよりは事前にパラメータの不備に対するチェックを掛けたほうが
本筋でしょうね。
紹介してくれたリンクも後で見てみます。
どもm(_ _)m
0035デフォルトの名無しさん
2013/11/22(金) 21:25:13.85DoEvents
If Sheet1.OptionButton1.Value = True Then
call 途中中止処理
End If
0036デフォルトの名無しさん
2013/11/22(金) 22:48:42.85>>1があっても大して変わらん。
Excel VBA 質問スレ Part32
http://toro.2ch.net/test/read.cgi/tech/1381151995/
0037デフォルトの名無しさん
2013/11/22(金) 23:56:40.27まぁPart31を見てあっちでいいと言うドMな人はあっちのスレに行けばいいんじゃないの?
コードもExcelのアプリケーションに依存しない話も禁止らしいけどね。
0038デフォルトの名無しさん
2013/11/23(土) 00:13:41.59フォルダとかで右クリックしてプロパティ選択してタブで「以前のバージョン」って選択すると出てくるやつ。
そこに格納されてるファイルやフォルダの名前や更新日付が欲しいんですが、
WMIで取得しようとしたけど情報の取得方法がイマイチよく分からなくて・・・
0039デフォルトの名無しさん
2013/11/23(土) 05:57:44.14複数スレが立ってるんだから立てた順に消化すればいい。
テンプレが無くても荒れたわけだし、大して変わらん。
0040デフォルトの名無しさん
2013/11/23(土) 06:23:37.78ネタの質問だな。ググれば数秒で解決。
0041デフォルトの名無しさん
2013/11/23(土) 07:15:02.62ネタなつもりは全くなくて、
ググっても分からないので聞いているんですが・・・
WMIのShadowCopyなどを使えば何となく出来る気がするんですが、
実際に名前やタイムスタンプを取得する方法を、
コード上でどう記述すればいいのか未だに分かりません。
数秒で解決出来たなら教えて頂いても宜しいでしょうか。
004228=30=33
2013/11/23(土) 08:08:36.43あのスレとこっちじゃタイトルが似てるだけで中身が別物だからなぁ…
Part32がほぼ同時に二つたって、
こっちよりの前スレが1000まで行って、向こうは未だ100も行ってないっていう現実が
あの糞テンプレが如何に嫌われてたかを如実に表してる。
さすがに自分の戦略ミスに気付いたのかテンプレ厨も今はおとなしくしてるけど
ほとぼりが冷めたら(たとえばこのスレが落ちるとかしたら)
また暴れだすのは間違いないよ。
それが分かってるから俺は向こうには書き込まない。
もちろん、向こうで書きたい人は勝手に書けば良いけど
テンプレ厨が暴れだしたら結局こっちに帰らざるを得ないと思うよ。
……って言うようなことを書くことを指して
「荒れてる」とか表現するんだろうけど、
こういう議論は>>36とか>>39みたいな馬鹿げた主張が無ければ
わざわざ言う必要が無いことなんだよね。
こっちとしても関わらずに済むので
スレのコンセプトが根本的に違うと言うことを理解して
テンプレ君には向こうで勝手に活動してもらえたらありがたいと思う。
0043デフォルトの名無しさん
2013/11/23(土) 08:24:31.36避難スレかよw
004440
2013/11/23(土) 08:26:50.63続きはこのスレでやりましょう。
Excel VBA 質問スレ Part32
http://toro.2ch.net/test/read.cgi/tech/1381151995/
0045デフォルトの名無しさん
2013/11/23(土) 09:01:59.71そちらのスレに行ったら普通の状態のフォルダやファイルの取得方法と勘違いされている方がおられました。
その辺の方法は流石に聞くのは失礼な部類に含まれると思っています。
私が知りたかったのは>>38でも記述した「以前のバージョン」、つまりシャドウコピー内のファイルやフォルダの情報です。
向こうのスレではその後にVB6で出来る様な事はスレ違いであるとの指摘が有ったので、
引き続きこちらでお世話になりたいと思います。
0046デフォルトの名無しさん
2013/11/23(土) 09:17:57.33アンチテンプレ厨の自演ネタ質問なので降りるわ。
0047デフォルトの名無しさん
2013/11/23(土) 09:36:55.54挙句に見当違いのFSO持ち出したりしてみっともないったらありゃしない
答えられないなら下手な言い訳せずに黙って消えればいいのに
0048デフォルトの名無しさん
2013/11/23(土) 09:43:33.38何の為に必要なの?
0049デフォルトの名無しさん
2013/11/23(土) 09:43:54.19何の為に必要なの?
0050デフォルトの名無しさん
2013/11/23(土) 10:32:05.39サーバ上のフォルダやファイルの更新履歴を欲しいと思っています。
最初はサーバ上のフォルダやファイルを定期的に巡回し、その情報を取得してDBに登録する方法を考えていましたが、
膨大な数があるため、1巡するだけでも12時間以上掛かってしまいます。
それで指定されたファイルやフォルダの情報をシャドウコピー側から
取得出来ればいいなと思い聞いてみました。
0051デフォルトの名無しさん
2013/11/23(土) 10:49:48.08自演乙
0052デフォルトの名無しさん
2013/11/23(土) 10:59:33.23痛々し過ぎて見てられない
0053デフォルトの名無しさん
2013/11/23(土) 11:37:18.230054デフォルトの名無しさん
2013/11/23(土) 12:36:38.98トンチンカンな回答で偉そうにしていた事実は消えない
0055デフォルトの名無しさん
2013/11/23(土) 13:17:41.21スレチ気にするならVBAなんでもスレいけよ
0056デフォルトの名無しさん
2013/11/23(土) 14:20:32.85そんなので一々ギャーギャー言うならあのドMスレに行け。
0057デフォルトの名無しさん
2013/11/23(土) 14:34:44.17シャドウコピー作る例はいっぱい見つかるけど戻すのはほとんど見ないな
かろうじて見つかったのがこれ
social.technet.microsoft.com/Forums/de-DE/57025a40-400d-498d-a163-3c613145d16c/powershell?forum=powershellja
ただ、ファイルのプロパティで出るやつは、シャドウコピーじゃない普通のバックアップも表示してるしどうやってるか知らん
そもそもファイルの更新情報とるのに12時間ってホントにそんなにかかるのか?
プロパティで出てくるのだいぶ遅いし、それで一覧つくるともっとかかる気がするけど
0058デフォルトの名無しさん
2013/11/23(土) 15:41:13.67レスありがとうございます。
シャドウコピーから取得するなら、巡回する必要もないしピンポイントで
対象のフォルダやファイルのバックアップ情報を見にいけば良いと思ったので
余り時間のことは気にしていませんでした。
そのリンク先にもWMIのShadowCopyが書いてあるのですが、
色々調べてみた結果、結局ローカルからサーバの情報を読みに行く際に
VSS登録先のIDやパスワードが必要になるのでこちらの環境上、結局は使えない
みたいです。
別にシャドウコピーを使わなくても今回は大量にある
ファイルやフォルダの履歴がピンポイントで指定して取れれば
それで良いんですが・・・。
0059デフォルトの名無しさん
2013/11/23(土) 18:20:45.18うーん。
ファイル数が多くても履歴をなんとかする方法、
知らなくもないけど、多分テンプレ君が数秒でググって教えてくれるよ。
口だけでなければ。
0060デフォルトの名無しさん
2013/11/23(土) 19:16:49.58テンプレ君は口だけなので当てには出来ません
是非>>59さまのお知恵をお貸しください
0061デフォルトの名無しさん
2013/11/23(土) 19:32:01.65大丈夫。>>40であれだけの事を豪語してるし。
まさかこれで何も無しって事はないだろw
0062デフォルトの名無しさん
2013/11/23(土) 19:42:18.50口だけ君がまた一人増えただけか
0063デフォルトの名無しさん
2013/11/23(土) 19:53:49.10いや、俺はテンプレ君の出方を見るよ。
どうしても駄目でギブアップと言うなら
答えんでもないけどねw
0064デフォルトの名無しさん
2013/11/23(土) 20:04:45.04あいつがギブアップなんてする訳無いじゃん
何事も無かったようにシカトして終わりだよ
大体、あんな屑相手にするより
今実際に困ってる>>38さんにアドバイスしてあげるほうが
よっぽどヤツにダメージ与えられるだろうが。
せめて期限を区切ってそれを過ぎたら回答すると宣言しておくとか
そのぐらいはしてもらわないと
今の時点では君も口だけ君と言わざるを得ない。
第一君の回答が正しいと言う保証も無いわけだし。
0065デフォルトの名無しさん
2013/11/23(土) 20:28:56.03>>60は捨てメアド晒してくれ。先に俺の
考えた方法を送っておこう。
テンプレ君が考えを述べるまで、メールでやり取りすることにしようか。
テンプレ君が考えを述べた後はここでいくらでも俺の考えを晒してくれて構わない。
それならみんな幸せだよんな。
006660=62=64
2013/11/23(土) 21:04:56.72俺の能力では君の答えを聞いてもそれが正しいかどうか判断出来んし。
むしろ>>38さんに教えてあげてくれ。
ただ、こっちやあっちでそういう安い挑発をするより
答えられる質問にはこのスレで淡々と答え続けることの方が
あっちのスレの存在意義を失わせるという意味では遥かに有効だと思うよ。
あぁ、そういえばテンプレ君が俺を騙ってメールする可能性もあるから
君の正当性を証明する手法としてはおそらく不適切だね。
0067デフォルトの名無しさん
2013/11/23(土) 21:13:32.42助かります。実は代替案が思い浮かばなくて非常に困っていました。
少し諦めかけて月曜日に仕事場で何て報告しようか悩んでいた所です。
それと私は>>58ですが>>60ではありません。
宜しくお願いいたします。
[email protected]
0068デフォルトの名無しさん
2013/11/23(土) 21:22:25.84了解した。
それにしても>>60が>>58では無かったとは。
>>66がテンプレ君で成りすましだったら全て帳尻が合うな。
いけずうずうしいと言うかなんというかw
0069デフォルトの名無しさん
2013/11/23(土) 21:47:07.49> >>66がテンプレ君で成りすましだったら全て帳尻が合うな。
会わねーよw
もし俺がテンプレ君だったら自虐的にも程があるだろ。
挙句に誘導してる向こうのスレじゃなくてこっちで答えられたら
ヤツにどんなメリットがあるんだよ。
(ちなみにこういうときに使うなら
「帳尻」じゃなくて「辻褄」のほうが適切だよ)
俺は向こうには書き込まないし、自分が分かる範囲の質問なら
こっちのスレで答えさせてもらってるだけだよ。
一応このスレで俺が今まで書き込んだレスは
>>28,>>30,>>33,>>42,>>47,>>52,>>54,>>60,>>62,>>64
だよ
これは全部俺の書き込みだし、このスレではこれ以外には一切書き込んで無い。
内容を吟味してテンプレ君かどうか判断してくれ。
つうか、仮に成りすましを疑われたところで
特にデメリットも無いわけだけどな。
0070デフォルトの名無しさん
2013/11/23(土) 22:36:41.94メール確認しました。
まさかここまで詳しい説明書き付けてくれて、
しかも一番重要と思える部分を既に作ってくれているとは思いもしませんでした。
家ではその部分は問題なく動いているので、
仕事場の膨大なフォルダやファイルで問題なく使えるか確認させて頂きたいと思います。
私の知識が足らず、よく分からない部分は済みませんが後でメール送付しますので宜しくお願いします。
どうもありがとうございます。
0071デフォルトの名無しさん
2013/11/23(土) 22:57:52.70そうか、信用しよう。
疑って済まんかったな。
>>70
そんな大層なもんじゃないけど、
仕事場でもちゃんと動くことを祈ってるよ。
0072デフォルトの名無しさん
2013/11/24(日) 16:07:20.41もうすぐクリスマスですが
皆さんは一緒に過ごす相手がいますか?
0073デフォルトの名無しさん
2013/11/24(日) 21:22:14.190074デフォルトの名無しさん
2013/11/25(月) 16:21:16.46もうすぐクリスマスですが
クリスマスまでに彼女ができるVBAのコードはありますか?
0075デフォルトの名無しさん
2013/11/25(月) 21:11:46.220076デフォルトの名無しさん
2013/11/25(月) 22:35:38.260077デフォルトの名無しさん
2013/11/29(金) 11:03:07.73MsgBox "Love"
0078デフォルトの名無しさん
2013/11/29(金) 16:52:31.960079デフォルトの名無しさん
2013/11/29(金) 21:18:14.46よく分かんないのがあるんですが
あれって何に使うんですか?
0080デフォルトの名無しさん
2013/11/29(金) 22:10:15.32Vb.Netの方でならそういうのあるのは知ってるけど(ちらっとだけどねw
0081デフォルトの名無しさん
2013/11/30(土) 00:00:45.39例えば、AというクラスとBというクラスがあったとして、
それぞれに同じ数と型の引数、同じ型の戻り値を持った同じ名前のメソッドがあったとします。
コード的にAとBのインスタンスさえ入れ換えてやれば分岐して違うクラスとして
設定しなくても一発で行けるのに・・・
と言う時に、A、B、どちらの型のインスタンスも格納出来るのがインターフェースです。
もっとも、それ用に作らなければなりませんが。
>>80
vbaには継承は有りませんが実装は有る様ですよん。
0082デフォルトの名無しさん
2013/11/30(土) 06:02:14.70クリスマスの夜に僕と君を繋いでくれる
そういうものさ
0083デフォルトの名無しさん
2013/11/30(土) 13:24:33.41.netになったらあんなことやこんなことも
できるようにばなるんだろうな。
いや、よく知らないけど。
0084デフォルトの名無しさん
2013/12/03(火) 11:41:37.13http://kohada.2ch.net/test/read.cgi/prog/1209467166/6
なんですが、forの後のコロンってどういう意味があるんでしょうか?
Sub a()
Dim s, i
For i = 1 To 100: s = s & IIf(i Mod 15 = 0, "FizzBuzz", IIf(i Mod 3 = 0, "Fizz", IIf(i Mod 5 = 0, "Buzz", i))) & vbCrLf: Next
MsgBox s
End Sub
0085デフォルトの名無しさん
2013/12/03(火) 15:21:31.23改行しないで、1行に複数の命令書くときの区切り
0086デフォルトの名無しさん
2013/12/03(火) 15:25:14.02なんと、ありがとうございます
セミコロンにしようよ・・・
0087デフォルトの名無しさん
2013/12/03(火) 16:21:57.89セミコロンには別の意味が割り当てられてる
0088デフォルトの名無しさん
2013/12/03(火) 21:35:40.07へぇ、vbaでも三項演算子って使えるんだ。
vb.net辺りでも使えるけど、iifだと遅いからifの方の三項演算子使うとか色々あるんだけど、
まぁvbaのそれとは別物かも知れんね。
0089デフォルトの名無しさん
2013/12/03(火) 21:49:58.38>>85のいうとおり一行に複数命令を書くときの単なる区切り文字
Cでのセミコロンと大体同じ(なので>>86はセミコロンにしようよと言ってると思う)
0090デフォルトの名無しさん
2013/12/03(火) 21:52:40.760091デフォルトの名無しさん
2013/12/03(火) 22:38:33.25VB.NETでも同様
0092デフォルトの名無しさん
2013/12/04(水) 02:17:02.98イメージとしては下記のようにしたいです。
Sub MYGETPIVOTDATA(ParamArray arr as Variant)
GETPIVOTDATA(データ フィールド, ピボットテーブル,arr(0),arr(1),arr(2),arr(3),・・・arr(ubound(arr,1)))
End Sub
009392
2013/12/04(水) 02:18:48.100094デフォルトの名無しさん
2013/12/04(水) 10:03:51.410095デフォルトの名無しさん
2013/12/04(水) 23:44:34.02役に立つかどうかは分からんけど、この辺のでどうだろうか
http://www.moug.net/tech/exvba/0100045.html
0096デフォルトの名無しさん
2013/12/05(木) 00:06:24.65True Xor True = False
True Xor False = True
False Xor True = True
False Xor False =False
みたいにどちらか片方のみがTrueの場合にTureを、
そうじゃない場合はFalseを返すんだけど、
これの使い道って何か有る?
0097デフォルトの名無しさん
2013/12/05(木) 03:16:55.19加算機とか半加算器とかで使うのかね。
言われてみれば使ったことないかも。
0098デフォルトの名無しさん
2013/12/05(木) 05:31:18.090099デフォルトの名無しさん
2013/12/05(木) 08:05:03.83今取り込んだデータと直前のデータの Xor とって、データの変化点を見るとか。
まあ、VBA ではあまり出番はないわな。
0100デフォルトの名無しさん
2013/12/05(木) 11:29:50.26擬似乱数を自前で作ったり
かな?
0101デフォルトの名無しさん
2013/12/05(木) 11:54:01.45どういう場面だったかは思い出せない
0102デフォルトの名無しさん
2013/12/05(木) 16:40:08.460103デフォルトの名無しさん
2013/12/05(木) 16:48:23.56あ!それだ!
0104デフォルトの名無しさん
2013/12/05(木) 20:12:53.410105デフォルトの名無しさん
2013/12/05(木) 21:19:40.580106デフォルトの名無しさん
2013/12/05(木) 22:04:39.69特定Bitの反転だったらNotとAndでよくない?
0107デフォルトの名無しさん
2013/12/05(木) 23:46:22.83それとXorと比べてみ
0108デフォルトの名無しさん
2013/12/06(金) 00:10:00.420109デフォルトの名無しさん
2013/12/06(金) 07:06:26.46ああ、なるほどね。解った。
0110デフォルトの名無しさん
2013/12/06(金) 09:15:16.890111デフォルトの名無しさん
2013/12/06(金) 13:29:52.61タイムアウト(?)が原因なのか ページの読み込み中 で止まる場合があります
このような場合、どのように回避すればよろしいのでしょうか?
0112デフォルトの名無しさん
2013/12/06(金) 17:32:08.44一定時間経過したら、再読み込み処理、
複数回再読み込みしてダメなら、読み込みエラー処理
0113デフォルトの名無しさん
2013/12/06(金) 22:03:11.45無事動きました、ありがとうございます
0114デフォルトの名無しさん
2013/12/07(土) 08:48:57.29ずらっと並んでいるクラスモジュールを見かけることがあるんですが
この間気になってそことその関数を呼び出している所を
コメントアウトしたら挙動がなんかおかしくなりました。
この内容がまったく書かれていない関数ってどんな意味があるんでしょうか?
0115桃白白 ◆9Jro6YFwm650
2013/12/07(土) 10:02:34.86なにもしないってことじゃない。ヌルオブジェクトみたいな。
0116デフォルトの名無しさん
2013/12/07(土) 13:00:27.72想像しろよ、気になるだろ、なんなら聞いてくれよ
ずらっと並ぶ程沢山あるならなおさら
0117デフォルトの名無しさん
2013/12/07(土) 14:03:31.00コード見てないから分からんけど、
それ、多分ちょっと前にレスがあった
インターフェースだと思うよ。
0118デフォルトの名無しさん
2013/12/07(土) 21:05:07.86アイアイエフ?
アイイフ?
2エフ?
0119デフォルトの名無しさん
2013/12/07(土) 22:14:16.32俺はアイイフと読んでいるけど、多分これには正しい答えはなく、
どれだけ多く世間に浸透しているかが正しいかどうかを決めていると思う。
そんな時はここを参考にするといいかも知れない。
http://shinh.skr.jp/yomikata/
0120デフォルトの名無しさん
2013/12/07(土) 22:26:52.300121デフォルトの名無しさん
2013/12/07(土) 23:34:34.88いやおかしいだろそのリンク先w
0122デフォルトの名無しさん
2013/12/08(日) 00:33:08.88>>117
インターフェースだね。
って言うか前スレで、テーブルの集計を出して欲しいって言われた時
実はそれ使ってコード書いたし。長くなるけど、その時のコードで
説明しようか。
0123デフォルトの名無しさん
2013/12/08(日) 00:37:17.54モジュール:Main
Option Explicit
Private mSheetParameterEntity As ISheetParameterEntity
'メイン処理
Public Sub Main(ByVal targetSheet As Worksheet)
Dim factory As New sheetParameterFactory
On Error GoTo Error_Handler
Application.ScreenUpdating = False
Set mSheetParameterEntity = factory.makeSheetParameter(targetSheet)
Call Initialize
Call TableControl.CopyTable
Call SheetControl.Sort
Call TableControl.ReleaseTable
Call SheetControl.MakeSummary
Call SheetControl.SelectCellTopLeft
GoTo Finaly
0124デフォルトの名無しさん
2013/12/08(日) 00:38:33.25Call MsgBox(Error)
Finaly:
Application.ScreenUpdating = True
End Sub
'初期化処理
Private Sub Initialize()
Call TableControl.SetSheetParameterEntity(mSheetParameterEntity)
Call SheetControl.SetSheetParameterEntity(mSheetParameterEntity)
Call TableControl.ClearOutLine
Call SheetControl.InitializeSheet
End Sub
0125デフォルトの名無しさん
2013/12/08(日) 00:42:50.80Option Explicit
Private Const COPY_CRITERIA_POSITION As String = "B2"
Private mSheetParameterEntity As ISheetParameterEntity
'テーブルパラメタエンティティ格納
Public Sub SetSheetParameterEntity(ByVal value As ISheetParameterEntity)
Set mSheetParameterEntity = value
End Sub
'シート初期化
Public Sub InitializeSheet()
mSheetParameterEntity.GetTargetSheet.Cells.Clear
End Sub
'ソート処理
Public Sub Sort()
Dim sortRange As range
'ソートキーのクリア
mSheetParameterEntity.GetTargetSheet.Sort.SortFields.Clear
'ソートキー追加
For Each sortRange In mSheetParameterEntity.GetTargetSortItem
mSheetParameterEntity.GetTargetSheet.Sort.SortFields.Add Key:=sortRange, _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
Next
0126デフォルトの名無しさん
2013/12/08(日) 00:44:08.11With mSheetParameterEntity.GetTargetSheet.Sort
.SetRange mSheetParameterEntity.GetTargetRange
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub
'集計行の表示
Public Sub MakeSummary()
mSheetParameterEntity.GetTargetRange.Subtotal _
GroupBy:=mSheetParameterEntity.GetGroupColumn, _
Function:=xlSum, _
TotalList:=Array(mSheetParameterEntity.GetTargetSummaryItem), _
Replace:=True, _
PageBreaks:=False, _
SummaryBelowData:=True
End Sub
0127デフォルトの名無しさん
2013/12/08(日) 00:45:26.07Public Function GetSortRange(ByVal targertSheet As Worksheet, _
ByVal originalRange As range, _
ByVal columnOffset As Long) As range
Set GetSortRange = targertSheet.range(Cells(originalRange.Row, _
originalRange.Column + columnOffset), _
Cells(originalRange.Row + originalRange.Rows.Count - 1, _
originalRange.Column + columnOffset))
End Function
'対象シートの左上セル選択
Public Sub SelectCellTopLeft()
mSheetParameterEntity.GetTargetSheet.Cells(1, 1).Select
End Sub
0128デフォルトの名無しさん
2013/12/08(日) 00:47:52.99Option Explicit
Private Const COPY_CRITERIA_POSITION As String = "B2"
Private mSheetParameterEntity As ISheetParameterEntity
'テーブルパラメタエンティティ格納
Public Sub SetSheetParameterEntity(ByVal value As ISheetParameterEntity)
Set mSheetParameterEntity = value
End Sub
'テーブルコピー処理
Public Sub CopyTable()
Sheet1.range(COPY_CRITERIA_POSITION).CurrentRegion.Copy
mSheetParameterEntity.GetTargetSheet.range(COPY_CRITERIA_POSITION).PasteSpecial
Application.CutCopyMode = False
'テーブル範囲格納
Call mSheetParameterEntity.SetTargetRange( _
mSheetParameterEntity.GetTargetSheet.range(COPY_CRITERIA_POSITION).CurrentRegion)
End Sub
'アウトラインの解除
Public Sub ClearOutLine()
mSheetParameterEntity.GetTargetSheet.Cells.ClearOutLine
End Sub
0129デフォルトの名無しさん
2013/12/08(日) 00:49:12.40Public Sub ReleaseTable()
Dim list As ListObject
With mSheetParameterEntity
For Each list In .GetTargetSheet.ListObjects
If list.range.Row = .GetTargetRange.Row And _
list.range.Column = .GetTargetRange.Row And _
list.range.Rows.Count = .GetTargetRange.Rows.Count And _
list.range.Columns.Count = .GetTargetRange.Columns.Count Then
list.Unlist
Exit For
End If
Next
End With
End Sub
0130デフォルトの名無しさん
2013/12/08(日) 00:58:17.49モジュール:ISheetParameterEntity
'対象シート取得
Public Function GetTargetSheet() As Worksheet
End Function
'対象範囲取得
Public Function GetTargetRange() As range
End Function
'対象範囲格納
Public Sub SetTargetRange(ByVal value As range)
End Sub
'対象ソート項目取得
Public Function GetTargetSortItem() As Collection
End Function
'グループ化列取得
Public Function GetGroupColumn() As Integer
End Function
'対象合計項目取得
Public Function GetTargetSummaryItem() As Integer
End Function
0131デフォルトの名無しさん
2013/12/08(日) 01:00:28.87Option Explicit
Implements ISheetParameterEntity
Dim mTargetRange As range
Const SORT_ITEM1 As Long = 0
Const SORT_ITEM2 As Long = 1
Const GROUP_COLUMN As Integer = 2
Const SUMMARY_ITEM As Integer = 3
'対象シート取得
Public Function ISheetParameterEntity_GetTargetSheet() As Worksheet
Set ISheetParameterEntity_GetTargetSheet = Sheet2
End Function
'対象範囲取得
Public Function ISheetParameterEntity_GetTargetRange() As range
Set ISheetParameterEntity_GetTargetRange = mTargetRange
End Function
'対象範囲格納
Public Sub ISheetParameterEntity_SetTargetRange(ByVal value As range)
Set mTargetRange = value
End Sub
0132デフォルトの名無しさん
2013/12/08(日) 01:01:16.16Public Function ISheetParameterEntity_GetTargetSortItem() As Collection
Dim sortItemCollecton As New Collection
Dim sortRange As range
Set sortRange = SheetControl.GetSortRange(Sheet2, mTargetRange, SORT_ITEM1)
Call sortItemCollecton.Add(sortRange)
Set sortRange = SheetControl.GetSortRange(Sheet2, mTargetRange, SORT_ITEM2)
Call sortItemCollecton.Add(sortRange)
Set ISheetParameterEntity_GetTargetSortItem = sortItemCollecton
End Function
'グループ化列取得
Public Function ISheetParameterEntity_GetGroupColumn() As Integer
ISheetParameterEntity_GetGroupColumn = GROUP_COLUMN
End Function
'対象合計項目取得
Public Function ISheetParameterEntity_GetTargetSummaryItem() As Integer
ISheetParameterEntity_GetTargetSummaryItem = SUMMARY_ITEM
End Function
0133デフォルトの名無しさん
2013/12/08(日) 01:03:07.08Option Explicit
Implements ISheetParameterEntity
Dim mTargetRange As range
Const SORT_ITEM1 As Long = 3
Const SORT_ITEM2 As Long = 0
Const GROUP_COLUMN As Integer = 4
Const SUMMARY_ITEM As Integer = 3
'対象シート取得
Public Function ISheetParameterEntity_GetTargetSheet() As Worksheet
Set ISheetParameterEntity_GetTargetSheet = Sheet3
End Function
'対象範囲取得
Public Function ISheetParameterEntity_GetTargetRange() As range
Set ISheetParameterEntity_GetTargetRange = mTargetRange
End Function
'対象範囲格納
Public Sub ISheetParameterEntity_SetTargetRange(ByVal value As range)
Set mTargetRange = value
End Sub
0134デフォルトの名無しさん
2013/12/08(日) 01:03:56.94Public Function ISheetParameterEntity_GetTargetSortItem() As Collection
Dim sortItemCollecton As New Collection
Dim sortRange As range
Set sortRange = SheetControl.GetSortRange(Sheet3, mTargetRange, SORT_ITEM1)
Call sortItemCollecton.Add(sortRange)
Set sortRange = SheetControl.GetSortRange(Sheet3, mTargetRange, SORT_ITEM2)
Call sortItemCollecton.Add(sortRange)
Set ISheetParameterEntity_GetTargetSortItem = sortItemCollecton
End Function
'グループ化列取得
Public Function ISheetParameterEntity_GetGroupColumn() As Integer
ISheetParameterEntity_GetGroupColumn = GROUP_COLUMN
End Function
'対象合計項目
Public Function ISheetParameterEntity_GetTargetSummaryItem() As Integer
ISheetParameterEntity_GetTargetSummaryItem = SUMMARY_ITEM
End Function
0135デフォルトの名無しさん
2013/12/08(日) 01:06:09.64'対象範囲格納
Public Sub ISheetParameterEntity_SetTargetRange(ByVal value As range)
Set mTargetRange = value
End Sub
'対象ソート項目取得
Public Function ISheetParameterEntity_GetTargetSortItem() As Collection
Dim sortItemCollecton As New Collection
Dim sortRange As range
Set sortRange = SheetControl.GetSortRange(Sheet3, mTargetRange, SORT_ITEM1)
Call sortItemCollecton.Add(sortRange)
Set sortRange = SheetControl.GetSortRange(Sheet3, mTargetRange, SORT_ITEM2)
Call sortItemCollecton.Add(sortRange)
Set ISheetParameterEntity_GetTargetSortItem = sortItemCollecton
End Function
'グループ化列取得
Public Function ISheetParameterEntity_GetGroupColumn() As Integer
ISheetParameterEntity_GetGroupColumn = GROUP_COLUMN
End Function
'対象合計項目
Public Function ISheetParameterEntity_GetTargetSummaryItem() As Integer
ISheetParameterEntity_GetTargetSummaryItem = SUMMARY_ITEM
End Function
0136デフォルトの名無しさん
2013/12/08(日) 01:15:14.00モジュール:SheetParameterFactory
'シートパラメタエンティティ作成クラス
Public Function makeSheetParameter(ByVal targetSheet As Worksheet) As ISheetParameterEntity
Dim instance As ISheetParameterEntity
Select Case targetSheet.Name
Case Sheet2.Name
Dim sht2Para As Sheet2ParameterEntity
Set sht2Para = New Sheet2ParameterEntity
Set instance = sht2Para
Case Sheet3.Name
Dim sht3Para As Sheet3ParameterEntity
Set sht3Para = New Sheet3ParameterEntity
Set instance = sht3Para
Case Else
Set instance = Nothing
End Select
Set makeSheetParameter = instance
End Function
0137デフォルトの名無しさん
2013/12/08(日) 01:36:17.38が、>>130の部分がインターフェースで
、
>>123でそのインターフェースの型を用意して、>>136でSheet2ParameterEntityか、Sheet3ParameterEntityの
どちらかを生成して>>123で用意した型に設定しています。
後は生成される二つのクラスの中以外は差異なくコードが走るため、
クラスの違いによる分岐は有りません。
この様に違うクラスで生成したものを同じクラスの型で扱えるようにする
仕組みが、中に何も書かれていない関数の正体です。
0138デフォルトの名無しさん
2013/12/08(日) 01:39:18.23ごめんなさいもう二度としません。
0139デフォルトの名無しさん
2013/12/08(日) 07:58:29.03へー、面白いな、これ。
「Width」って「うぃどぅす」って呼ぶのが一般的なんだ。
今までずーっと「ワイズ」だと思ってた。
0140デフォルトの名無しさん
2013/12/08(日) 08:27:53.85「Vba、インターフェース、ストラテジーパターン」あたりで
ググれと言えば一発で分かることだろ。
どうしても長いコード書きたかったら前
桃臼が晒してたコード書き場があったから
そこを使え。
どこだったかは忘れたけど。
0141デフォルトの名無しさん
2013/12/08(日) 09:52:33.48京都人「うぃどす」
0142デフォルトの名無しさん
2013/12/08(日) 10:19:44.06いばらきと
いばらぎで僅差なんだね。
本当はどっち?
0143デフォルトの名無しさん
2013/12/08(日) 11:10:35.20ちばらき
0144デフォルトの名無しさん
2013/12/08(日) 11:30:50.96なぜか合ってるのか不安になる音です
0145デフォルトの名無しさん
2013/12/08(日) 12:26:13.530146デフォルトの名無しさん
2013/12/08(日) 12:42:17.43キュートなお声ですよね
0147デフォルトの名無しさん
2013/12/08(日) 15:06:03.17最初のAAAからして読み方の
西恋ケ窪とかどこだよ。
IEnumerableって何なんだよ。
0148デフォルトの名無しさん
2013/12/08(日) 15:34:26.830149デフォルトの名無しさん
2013/12/08(日) 18:05:50.91Javaもやっている私の同僚はインデント階層切替わりの単位で変数宣言をします。
関数内のどこで変数宣言しても特に動きが変わらないのは知っていますが、
同僚に言わせるとその方が分かり易いし、いずれObject指向言語に手を付けるなら、
そっちの方に慣れておいた方がいいと言います。
そう言うものなんでしょうか?
0150デフォルトの名無しさん
2013/12/08(日) 19:32:44.84>関数内のどこで変数宣言しても特に動きが変わらない
VBAではそうでも、Javaではそうではない
言語に合わせて宣言するべきで、VBAではプロシジャの先頭での宣言が薦められてたはず
まあ、どこで宣言しても良いんだが、ルールを決めてそれを守る方が大事
先頭で宣言したり使う直前に宣言したり、混在させるのが最悪
0151デフォルトの名無しさん
2013/12/08(日) 20:55:04.75vbaはやっぱり頭で合わせるもんだと思う。
無理してjavaなんぞに合わせなくても
object指向ので作る時にそうすればいいじゃない。
0152デフォルトの名無しさん
2013/12/08(日) 21:01:29.51冗談で言ってるのかと思ったら
本当でビビったw
0153デフォルトの名無しさん
2013/12/08(日) 21:07:26.86DimとPrivateの違いって何なの?
0154デフォルトの名無しさん
2013/12/08(日) 21:37:29.33モジュールレベルで宣言したときのスコープ(参照できる範囲)が違う
と思ったけど、モジュールレベルで使うとDimと同じスコープか
プロシジャレベルで使えるかどうかの違いだけで同じだな
VBではPublicかPrivate書いたらDimを省略できる出来るだけだったと記憶してるが
VBAではそうじゃないっぽいな
0155デフォルトの名無しさん
2013/12/09(月) 20:52:31.18Dimは遠い昔の、それこそVBじゃない頃、
N-Basicとかで配列をDim(dimension)で
宣言してた頃の名残りで盲腸みたいなもんだから、
出来ればPrivateで宣言した方がいいと、個人的には思う。
コメントをアポストロフィで付けないで、REMで書く様なもん。
0156デフォルトの名無しさん
2013/12/10(火) 01:13:10.320157デフォルトの名無しさん
2013/12/10(火) 01:51:33.240158デフォルトの名無しさん
2013/12/10(火) 02:05:44.25引用符(コーテーションマーク、クォーテーションマーク)は、前と後の一対で使うもの
0159デフォルトの名無しさん
2013/12/10(火) 02:09:15.25日本語ではあまり使われない
(中国語や韓国語では普通に使われるらしい)
0160デフォルトの名無しさん
2013/12/10(火) 02:38:21.76もともともコメント記号としてどっちの意図で使われたのかはわからんしなぁ
俺もこの文脈なら'はアポストロフィって言うんだが、ヘルプみると
>コメントを入力するには、先頭にクォーテーション (') を入力するか、Rem ステートメントで指定します。
とか
>コメント行は、先頭にクォーテーション (') または Rem ステートメントのいずれかと、
とか書いてあるから、あれはクォーテーションと呼ぶのが正しいのかもしれん
0161デフォルトの名無しさん
2013/12/10(火) 03:14:25.20英語的な解釈をするなら、アポストロフィはコメント行の先頭に使っていい記号ではない
本来はクォーテーションで前後を囲ったであろう物を、8bit時代のMS-BASICのリソース的な制約から
後半を省略可能にしたと見るのが妥当
0162デフォルトの名無しさん
2013/12/10(火) 04:19:23.00そのJIS企画の当該ページのリンクが貼られたらこの話は終わりにしよう。
それまでは存分に語らい合いましょう!
ってExcel VBAスレじゃないですか。
おわり。
0163デフォルトの名無しさん
2013/12/10(火) 04:33:44.43お前のキーボードはjIS規格配列なのか?
VBAはいつからJIS規格になったんだ
違う規格の定義をあてはめて議論の余地がないとか笑わせる
0164デフォルトの名無しさん
2013/12/10(火) 04:42:38.53これは確かにと言わざるを得ない。
これで結論はもう出たということか。
VBAのオフィシャルドキュメントで、
コメントには何を使うと記載されているのか?
で、この話に執着する者達が終着できそうだ。
公式文書のリンクが貼られたらこの話は終わりにしよう。
それまでは存分に語らい合いましょう!
って略
0165桃白白 ◆9Jro6YFwm650
2013/12/10(火) 05:26:36.90語らうには語り合うという意味があるから合うを付ける必要ないんじゃないかな。
語らいましょう、または、語り合いましょうでいいと思うんだよね。
0166デフォルトの名無しさん
2013/12/10(火) 05:33:56.97うっせーばーか
いいと思うんだよねってなんだよ
いいんだよって言い切れないのかよ
もっと自信もてよボケカス
早くVBAの公式文書のリンク持ってこいや
0167桃白白 ◆9Jro6YFwm650
2013/12/10(火) 05:38:24.57/ つ⊂ \ 怖いー
0168デフォルトの名無しさん
2013/12/10(火) 05:57:51.45\ U /
/ ̄ ̄ ヽ,
/ ', / _/\/\/\/|_
\ ノ//, {0} /¨`ヽ {0} ,ミヽ / \ /
\ / く l ヽ._.ノ ', ゝ \ < バーカ! >
/ /⌒ リ `ー'′ ' ⌒\ \ / \
(  ̄ ̄⌒ ⌒ ̄ _)  ̄|/\/\/\/ ̄
` ̄ ̄`ヽ /´ ̄
| |
−−− ‐ ノ |
/ ノ −−−−
/ ∠_
−− | f\ ノ  ̄`丶.
| | ヽ__ノー─-- 、_ ) − _
. | | / /
| | ,' /
/ / ノ | ,' \
/ / | / \
/_ノ / ,ノ 〈 \
( 〈 ヽ.__ \ \
ヽ._> \__)
0169デフォルトの名無しさん
2013/12/10(火) 19:53:40.33「'」に変わりはないんだろうし。
0170デフォルトの名無しさん
2013/12/13(金) 00:23:21.08それに音程付けてボーカロイドみたいにすることってできますか?
0171デフォルトの名無しさん
2013/12/13(金) 05:55:28.560172デフォルトの名無しさん
2013/12/15(日) 07:52:32.98可能
0173デフォルトの名無しさん
2013/12/15(日) 20:26:43.18マクロが使用できないか、全てのマクロが無能になっている可能性があります、と出ます
どうすれば多変量解析を実行できるでしょうか?
0174デフォルトの名無しさん
2013/12/15(日) 20:39:43.00excel2007以降なら信頼できる場所に置いてあるのかいないのかなどなど情報を一切書かず
0175デフォルトの名無しさん
2013/12/15(日) 20:45:23.66他のブックのVBAでも同じ状態?
ググって見つかった下記などは試してみたのかな
http://answers.microsoft.com/ja-jp/office/forum/office_2007-excel/%E7%AA%81%E7%84%B6%E3%83%9E%E3%82%AF%E3%83%AD/b9379ad8-40f6-4415-b490-3090a900a8a0?msgId=122645e7-040b-400b-8f7e-77bddfa6e101
0176デフォルトの名無しさん
2013/12/17(火) 22:47:10.17同じ質問になると思いますが
日付で今日より1年前のデータで、最古のデータ行を拾いたいのです
WorksheetFunction.Matchで照合の型を-1で、降順に並び替えれば
うまくいきますが、データは昇順の状態で
一年前の最古のデータ行を拾う方法ありますか?
昇順のままで照合の型を-1だと当然失敗します
(最新のデータを拾ってしまいます)
いろいろ調べたのですが、いい方法がみつかりませんでした
どなたかいい方法ありませんか?
0177デフォルトの名無しさん
2013/12/17(火) 23:20:52.18マルチ
どちらかを質問終了するべし
0178176
2013/12/19(木) 01:49:09.750179デフォルトの名無しさん
2013/12/19(木) 18:30:09.13作りたいのですが、
たとえば1つ目のtextの1行目をA-1に 2行目の記述をB-1に …
と6行を6列のに読み込み、さらにファイル名(文字列)を7列目のG-1に読み込み、
2つ目のtextの1行目をA-2に、2行目の記述をB-2に …
と読み込ませることはできませんでしょうか?
0180デフォルトの名無しさん
2013/12/19(木) 19:30:34.700181デフォルトの名無しさん
2013/12/19(木) 19:40:28.240182デフォルトの名無しさん
2013/12/19(木) 19:52:46.930183デフォルトの名無しさん
2013/12/19(木) 21:54:28.52とりあえず書いてみたけど、やっつけなのでエラー処理とかは書いてません
以下のマクロを書いたブックと同じフォルダに"text"フォルダを作って
その中に読み込ませたいテキストファイルを入れてください。
マクロを実行すると、マクロと同じフォルダに"test.xlsx"というファイルが作成されます。
既に"test.xlsx"が存在する場合、上書きするか聞いてきます。
"text"フォルダ内には不要なファイルは入れないでください。
Option Explicit
Sub test()
Dim f As Object
Dim w As Workbook
Dim t As Workbook
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Set w = Workbooks.Add
With w.Sheets(1)
For Each f In fso.GetFolder(ThisWorkbook.Path & "\text").Files
Set t = Workbooks.Open(f)
t.Sheets(1).UsedRange.Copy
If .Cells(1, 1) = "" Then
.Cells(1, 1).PasteSpecial Transpose:=True
Else
.Cells(.Rows.Count, 1).End(xlUp).Offset(1).PasteSpecial Transpose:=True
End If
t.Close
Next f
End With
w.Close SaveChanges:=True, Filename:=ThisWorkbook.Path & "\test.xlsx"
End Sub
0184183
2013/12/19(木) 22:08:35.180185183
2013/12/19(木) 22:22:52.58t.Close
の行の前に
.Cells(.Rows.Count, 1).End(xlUp).End(xlToRight).Offset(, 1) = t.Name
ってのを一行入れてください。
0186デフォルトの名無しさん
2013/12/20(金) 09:18:25.34あなたは救世主です!
本当にたすかりました。
0187デフォルトの名無しさん
2013/12/20(金) 16:20:17.72いつ切り捨てするのかよくわかりませんでした。
計算は1度計算したのをさらにかけたり割ったりします。
ここで、
最初にかけ算→小数点切り捨て→かけ算
なのか
かけ算→かけ算→割り算など全部した後いっきに切り捨てた方が良いのか
前者でやっていたんですがこの2つだと当然答えも違ってきますよね
普通どっちが正解なんですか?
0188デフォルトの名無しさん
2013/12/20(金) 18:55:18.13http://toro.2ch.net/test/read.cgi/tech/1381151995/236
0189デフォルトの名無しさん
2013/12/20(金) 22:31:06.750190デフォルトの名無しさん
2013/12/21(土) 23:30:15.40スレ立て自体がマルチなんだからしゃーない
0191デフォルトの名無しさん
2013/12/22(日) 06:22:28.690192デフォルトの名無しさん
2013/12/30(月) 19:22:49.48来年もお力をお借りするかもしれませんが宜しくお願いいたします
机周りの掃除が終りましたので帰ります
皆様良いお年を!@22歳OL
0193デフォルトの名無しさん
2013/12/31(火) 00:00:44.710194デフォルトの名無しさん
2014/01/01(水) 11:34:15.700195デフォルトの名無しさん
2014/01/03(金) 13:54:51.990196デフォルトの名無しさん
2014/01/03(金) 22:44:38.740197デフォルトの名無しさん
2014/01/04(土) 02:37:30.74ピラフ知らない?
0198デフォルトの名無しさん
2014/01/04(土) 05:04:21.8723歳OL
0199デフォルトの名無しさん
2014/01/14(火) 15:36:02.26適当に1〜100までとか1〜20までとかの数字から無作為に実数の数字を抽出
するのはどうしたらいいのでしょうか。
0200デフォルトの名無しさん
2014/01/14(火) 16:31:22.93VBA 乱数 とかでググるといいと思うよ
0201デフォルトの名無しさん
2014/01/14(火) 18:59:00.73Rnd でどう?
0202デフォルトの名無しさん
2014/01/16(木) 02:21:35.14らんだまいずもわすれずにね
0203デフォルトの名無しさん
2014/01/17(金) 15:26:54.710204デフォルトの名無しさん
2014/01/19(日) 02:44:28.45同じファイルにある他のマクロはちゃんと起動するのですが、
同じファイルにある、とあるマクロを実行しようと
ユーザーフォームの実行(▲を右90度傾けたボタン)を押しても
うんともすんともいいません。
エラーも出ません。
何が原因だと思いますか?
0205デフォルトの名無しさん
2014/01/19(日) 03:11:26.69一瞬で計算が終わって、動いてるのに気付いてないだけの可能性
0206デフォルトの名無しさん
2014/01/19(日) 09:29:19.72具体的なコードを貼らないと、なんとも言えん。
具体的なコードを晒すのが嫌なら、自力でなんとかするか諦めよう。
というか、コード全部は晒さないにしても、ステップ実行とかして
どの関数やステートメントで想定外の動作が起きてるか調べて
もうちょっと詳しい状況書けば、憶測も少しは煮詰まるかもだけどな。
そもそもデバッグ出来ないってのはVBA使えないのと同義だからね。
不都合が起こったところでお手上げでいいなら、コード書くだけは
パソコンで文字入力できる全ての人に可能な行為だからな。
0207204
2014/01/19(日) 19:45:55.40すみません。正解です。
最初のfornextの、終了回の変数名の打ち間違いで、
どうやら0回ループになっていたようです。
>>206
すみませんでした。
0208デフォルトの名無しさん
2014/01/19(日) 22:34:06.31「プログラムは決して思った通りには動かない。書いた通りに動くだけだ。」
0209デフォルトの名無しさん
2014/01/21(火) 10:55:48.330210デフォルトの名無しさん
2014/01/23(木) 04:13:29.39この場合どのようにPDFファイルのmediaboxを参照すれば良いか教えてください。
0211デフォルトの名無しさん
2014/01/23(木) 04:17:34.570212デフォルトの名無しさん
2014/01/23(木) 19:06:40.970213デフォルトの名無しさん
2014/01/23(木) 20:00:12.850214デフォルトの名無しさん
2014/01/23(木) 21:15:12.64なんて言うと、例のキチガイがまたうるさそうだけど
0215デフォルトの名無しさん
2014/01/23(木) 21:32:49.29「VBA pdf」でググれば情報が見つかる
0216デフォルトの名無しさん
2014/01/25(土) 18:18:15.20(1)特定の文字列を持つセルを詮索する。
(2)(1)で検索したセルの2セル下までの行から、特定の文字列を持つセルを検索する。
(※2セルは結合されているセルがある)
ということをしたいです。
(1)で取得したセルの行や列番号を+するなりして、Findかけてやれば(2)はいいのかなぁ、と思い、
Range(Cells(......),Cells(......)).Find()〜とかやっているのですが、うまくいきません。
どう指定して検索をかけてやればでしょうか?
0217デフォルトの名無しさん
2014/01/25(土) 18:23:51.19Resize使えよとは思うが、それでもできなくはないと思うが
動かんっていうコード張れ
0218デフォルトの名無しさん
2014/01/25(土) 18:34:03.11セルの結合は使うなよ
Excelは表計算だけではなくワープロ的な機能も多くて
自由度が高いけど、その自由度の高さで不適切なデータの作り方をして
不適切なデータ形式によって自分の首を絞めるバカが多すぎる
0219デフォルトの名無しさん
2014/01/25(土) 18:47:48.99素早い反応ありがとうございます。
こんな感じです。
Dim cell_a As Range
Dim cell_b As Range
Set cell_a = Worksheets("Sheet1").Range("B:B").Find(What:="target1")
Set cell_b = Worksheets("Sheet1").Range(Cells(cell_a.Row + 1, 1), Cells(cell_a.Row + 2, 1)).EntireRow.Find(What:="target2")
セルの結合に関しては、そういう風なフォーマットになっているものからデータ取り出せ、って言うことなので、自分にはどうしようもないです……
0220デフォルトの名無しさん
2014/01/25(土) 19:33:28.55どうしようもないってことはないはずだけどね
会社とかでも、改善の提案提言はできるんだからさ
単にそれをしないで、頭を使わずサルのように与えられたモノをそのまま使うことに慣れきっちゃってるだけで
そんで、本題はおそらく
Set cell_b = Worksheets("Sheet1").Range(Cells(cell_a.Row + 1, 1), Cells(cell_a.Row + 2, 1)).EntireRow.Find(What:="target2")
↓
Set cell_b = cell_a.MergeArea.Cells(1).EntireRow.Offset(1).Resize(2).Find(What:="target2")
ってことじゃないかな?
シート見てないから憶測でしかコード書けないけど、これでダメだってならシートうpね
漏らしちゃまずいデータは、"target1"みたいに適当な語句に置き換えていいからさ
0221デフォルトの名無しさん
2014/01/25(土) 20:06:06.50うぉぉぉ……
無事に動きました
どうもありがとうございます
フォーマットについては掛け合って見ます
0222デフォルトの名無しさん
2014/01/25(土) 22:39:14.10Do While 特定のセル.Value <> ""
で特定のセルが空白だったら終了する、という処理をしようとしています。
この特定のセルが使用中とは別シートのセルだった時の記述を教えて下さい。
データを転記&計算してデータ用のシートの中身がこれ以上ない場合に止める、ということをやりたいのですが
0223デフォルトの名無しさん
2014/01/25(土) 22:53:52.87Do While 別のシート.特定のセル.Value <> ""
0224デフォルトの名無しさん
2014/01/25(土) 22:58:19.12Set cell_b = cell_a.EntireRow.Offset(1).Resize(2).Find(What:="target2")
じゃないのか
というか>>219のコードでも動いてるっぽいけど
target1が(横方向の)結合セルの場合もあるのか?
だったら>>220のコードでもダメだと思うが
0225デフォルトの名無しさん
2014/01/25(土) 23:12:51.30素早いご回答ありがとうございます。
更にご質問いたしますが、特定のセル(別シート)をアクティブセルと同一座標から選びたいという時はどうすればいいでしょうか
処理を繰り返した時のアクティブセルがたまたま成績表シートC3なら、
にちゃん太郎シートC3(たまたま決まった座標)が空白の時に処理を止めるという具合です
相対参照を使うのかな?とは思うのですが……
0226デフォルトの名無しさん
2014/01/25(土) 23:59:30.440227デフォルトの名無しさん
2014/01/26(日) 00:19:28.82データシートの設計
名前 性別 国語 算数 理科 社会
愛 女 80 60 75 90
誠
0228222
2014/01/26(日) 00:28:45.75データシートの状態
出席番号 名前 性別 国語 算数 理科 社会
1 愛 女 80 60 75 90
2 誠 男 50 72 68 85
(以下何人も続くと思って下さい)
表示用シートは
出席番号 名前 性別 国語 算数 理科 社会 合計点 平均点
1
だけ入力してある状態で、
名前をデータ用から引っ張る→性別を(中略)→平均点を出す→次の行に移る→上の数字に1足した数字を入力→以下繰り返し
上記の操作を生徒のデータを全員分入力できたら(名前が空白セルになったら)終わりたいわけです
わかるでしょうか?
Do Whileさえうまく行けば入力自体はうまくいくことは確認済みです。
なお、上記のはやりたいことを単純化して一例で出したので、コピペしろとかそういうのはなしにしてくださいw
0229デフォルトの名無しさん
2014/01/26(日) 00:38:45.97別のシート.Cells(特定のセル.Row(), 特定のセル.Column()).Value
0230デフォルトの名無しさん
2014/01/26(日) 00:39:26.010231デフォルトの名無しさん
2014/01/26(日) 00:41:39.97であればワークシート関数=average(,) =sum()
で
データシートの右端に加えればいいじゃない
表示用の見た目に書式を変えればいいじゃない
0233デフォルトの名無しさん
2014/01/26(日) 05:40:30.51君にはまだ早いみたいだから無理するな
0234デフォルトの名無しさん
2014/01/27(月) 20:41:31.77フォルダ内にある.CSVファイルの行数を一つずつ取得して、それを別のブック(開いていない)のC10とC12のセルに結果を貼り付けて
そのブックを新しい名前で特定のフォルダ内に保存したいです(保存ファイル名は行数を取得したファイルの名前&_assにしたい)
それをフォルダ内にある.csvファイル全てに連続して処理をさせたいのですが、さすがに3000ファイルもあるとこれをしないと詰みそうです
途中までの作業はぐぐって何とかやってきましたが、ちょっとどんづまってます
よろしくお願いします
0235デフォルトの名無しさん
2014/01/27(月) 21:20:37.26Excelマクロ4.0を使えばブックは開かなくても済むかもね。
あと、CSVの行数取得はここに載ってた。
http://www.moug.net/tech/exvba/0060083.html
0236デフォルトの名無しさん
2014/01/27(月) 21:20:39.30ここで質問するような形式のレスではないし、論外だと思います
0237デフォルトの名無しさん
2014/01/27(月) 22:17:46.82kannsuu1 = Worksheets("Sheet1").Cells(i, 1)
kannsuu2 = Worksheets("Sheet1").Cells(i + 1, 1)
Do Until kannsuu1 <> kannsuu2
i = i + 1
kannsuu1 = Worksheets("Sheet1").Cells(i, 1)
kannsuu2 = Worksheets("Sheet1").Cells(i + 1, 1)
Loop
上記のようであれば完走するのですが i = i + 1 の下2行を削除すると動かなくなってしまいます
マクロの動きとしては Do Until でkannsuu1,2を呼び出すだけではダメで、必要であるごとにkannsuu1 =
などと一度呼びだしてiの値を反映させなければいけないのでしょうか?
多分ものすごく馬鹿なことを聞いてるのだと思いますが、さしつかえなければヒントだけでもご教示ください
0238デフォルトの名無しさん
2014/01/27(月) 23:07:45.25そのプログラムが正しいとすると、kannsuu1もkannsuu2も関数じゃなくて変数
名前をkannsuuにしても関数にはならない
0239デフォルトの名無しさん
2014/01/28(火) 01:37:20.21>>238の言うとおり、kannsuu1やkannsuu2はセルの値を入れる「変数」。
変数っていうのはプログラマの意図に反して勝手に中身の値が変わられると困る
(そもそもある値を一時的に保持しておく目的で変数というものが存在する)ので、
プログラム的に指示がない限り、勝手に中身が書き換わることは普通はない。
なのでそのコードは、A列のi行目と(i+1)行目のセルの値が一致する箇所を発見するまで
A列を上から下へ走査するという目的のコードであるなら、
間違いではない(最善ではないかも知れない)。
むしろ6、7行目を消そうとする理由が知りたい。
0240デフォルトの名無しさん
2014/01/28(火) 01:54:30.04i = 1
k1 = 0
k2 = 0
while k1 = k2
..k1 = cells(i+0,1)
..k2 = cells(i+1,1)
..i + 1
loop
または
i = 1
while cells(i+0,1) = cells(i+1,1)
..i + 1
loop
debug.print cells(i+0,1), cells(i+1,1)
0241デフォルトの名無しさん
2014/02/04(火) 21:02:33.55配列の数を取得するにはどうすればいいんでしょうか
UBoundって入力しても補完で出てこないし、
オブジェクトブラウザーで調べてみても存在していないんですが
0242デフォルトの名無しさん
2014/02/04(火) 21:53:17.23HELP参照するか、ググルと沢山有る
0243デフォルトの名無しさん
2014/02/04(火) 22:49:10.29ググり力を鍛えなければなぁ
0244デフォルトの名無しさん
2014/02/05(水) 01:40:01.47でも、やっぱ俺の環境にはUBoundねーぞ
UCaseはあんのにどういうこっちゃ
0245デフォルトの名無しさん
2014/02/05(水) 03:55:50.64オブジェクトブラウザにもみつからない
でも普通に使えるしヘルプはF1で参照できる
WordやACCESSでも同じだったから、VBEの問題かもね
0246デフォルトの名無しさん
2014/02/05(水) 05:28:39.22けど気にせず入力しちゃえば普通に使える
0247デフォルトの名無しさん
2014/02/05(水) 20:25:50.87補完出ないとかありえなくないですかw?
0248デフォルトの名無しさん
2014/02/05(水) 20:37:29.17Javaでいうリスナーを動的に設定するには何かいい方法ありますか?
text_ChangeAfter みたいなところに記述するのは、
数が増えると大変なので
エクセルテーブルにコンポーネントとそれに対する処理方法を記載しておいて、
例えば、郵便番号textには郵便番号処理(4桁目に-を挿入)をやらせるとかしたいです
0249デフォルトの名無しさん
2014/02/05(水) 20:37:50.41まだ他にもあるんかな
0250デフォルトの名無しさん
2014/02/05(水) 20:57:01.65>>248
Excelでコードを半自動生成すると捗る。
Private Sub TextBox5_Change(): Call 処理8(TextBox5): End Sub
Private Sub TextBox6_Change(): Call 処理3(TextBox6): End Sub
0251デフォルトの名無しさん
2014/02/05(水) 21:16:07.29大変興味深いです
でも、それはやっぱり
TextBox5_Changeメソッドに記述するという方法になってしまいますか?
0252デフォルトの名無しさん
2014/02/05(水) 22:30:17.57(テキスト入力→ボタンを押す→検索される)
Sub ボタン1_Click()
On Error GoTo エラー処理 '検索文字が見つからなかったときはエラー処理へジャンプ
Cells.Find(What:=TextBox1.Value, LookAt:=xlPart).Activate'シート全体を対象に検索
TextBox1.Value = "" 'テキストボックスの入力文字を消去
Exit Sub '検索文字が発見できた場合はここで終了
エラー処理:
MsgBox "見つかりませんでした"
TextBox1.Value = ""
End Sub
この場合、同じ文字列が複数有る場合、2つめ以降が検索できません。
2つめ以降を検索できるようにするにはどうすれば良いでしょうか?
0253デフォルトの名無しさん
2014/02/05(水) 22:38:15.96「WithEventsを使用してコントロールのイベントを受け取って、
別オブジェクトのActionPerformedメソッド?を呼び出す」
クラスを作りまくる方法もある
0254デフォルトの名無しさん
2014/02/05(水) 23:04:34.06ありがとうございます
まさにそれらしい記事を発見いたしました
http://ateitexe.com/excelvba-control-change-event/
家にexcelがないのですが、会社で試してみたいと思います
それと、textboxのプロパティで郵便番号ならIMEを半角数字限定
住所なら全角ひらがなとか設定できたと思いますが
それをテンプレートとして保存するような機能はありますでしょうか?
プロパティのこことここを直して〜だと設定ミスが出るので、
テンプレから反映できたらなぁと
これもテーブルに定義してもいいのですが
0255デフォルトの名無しさん
2014/02/06(木) 00:21:03.25>Cells.Find(What:=TextBox1.Value, LookAt:=xlPart).Activate
どの位置から検索するかを引数に与えることができたはずだから、
変数を用意して位置情報を扱うように改造すれば、連続して検索出来るよ
その際、検索処理をWhile Loop内にするのが一般的だと思う
0256デフォルトの名無しさん
2014/02/06(木) 00:23:20.25VBAスレだから、その、作ればいいと思うよ
0257デフォルトの名無しさん
2014/02/06(木) 01:01:49.69すくなくとも、ヘルプにはUBound「関数」とかいてあるわけですが
入力補完はしないくせに、uboundと書くとちゃんとUBoundにしてくれるんだな
0258デフォルトの名無しさん
2014/02/06(木) 01:30:45.07msdnにもUBound Functionて書いてあるよ
http://msdn.microsoft.com/en-us/library/gg278658(v=office.14).aspx
0259デフォルトの名無しさん
2014/02/06(木) 01:31:48.95http://msdn.microsoft.com/en-us/library/gg278658%28v=office.14%29.aspx
0260デフォルトの名無しさん
2014/02/08(土) 01:24:05.94variantとかめっちゃ便利やった
0261デフォルトの名無しさん
2014/02/08(土) 01:36:34.71オブジェクト指向言語のいいとこ取りはしてるってこと
0262デフォルトの名無しさん
2014/02/09(日) 02:17:26.39継承出にないよりは出来た方が良いって話なら当然のことだけど
出来ないなら出来ないなりに使いこなせる奴が、「言語を使ってる」奴だ
0263デフォルトの名無しさん
2014/02/09(日) 05:10:14.13昔のアセンブラなんかは掛算や割算も自前でロジックを組まなければならない時も
あったけど、今そんなの嫌でしょ?
例えば配列の中の値をソートしたいとして、それが出来るメソッドが最初から有ったとき、
わざわざ自前で作る必要はないよね?
そのロジックの仕組みを知ってて使うのと、知らないで使うのも違うけど、
そのロジックの仕組みを知ってても、そう言った便利機能を使えるのと使えないのではやっぱり違うよ。
0264デフォルトの名無しさん
2014/02/09(日) 10:56:14.31> 継承とかできないとかクソとか言ってる奴
と
> 出来ないなら出来ないなりに使いこなせる奴
は、別に排他じゃないだろ。
バカなの?
0265デフォルトの名無しさん
2014/02/09(日) 10:58:13.72組込機能頼りってのも、良いことばかりではないけどね
例えば
数値の1〜3と、英大文字のA〜Cと、英小文字のa〜cをソートした場合、Excelの並べ替えだと
「1,2,3,a,A,b,B,c,C」だが、
「1,2,3,A,B,C,a,b,c」にしたい場合や
「A,B,C,a,b,c,1,2,3」にしたい場合や
「1,2,3,a,b,c,A,B,C」にしたい場合とかもある
また数値だと
「7,8,9,40,50,60,100,200,300」だが、文字列数字だと
「100,200,300,40,50,60,7,8,9」になるので、文字列でも数値への変換無しに、
数値と同じ並べ替えをしたい場合や、逆に数値を文字列数字の順にしたい場合もある
便利なモノほど利用者をバカにすると言われてるわけで、
もちろん便利じゃないものを使いこなせる能力を持った上で、
便利なものを有効活用して工数を減らすのは良いが
便利なものに頼りきりになってしまうのも、問題と言えば問題だな
0266デフォルトの名無しさん
2014/02/09(日) 13:59:41.61大体は同意だけど、
>便利なモノほど利用者をバカにすると言われてるわけで、
これは少し違うと思う。
便利なものが有った場合、今度はそれをいかに有効活用するかということと、
自分で考えて作った方がいいかの選択肢が出てくる。
上のような例の場合、本来の項目を変えずに別項目を作って、
そこに前0で埋めたり、大文字変換した値を用意してソートすれば事足りる。
それもダメだというならそう言うLinqとラムダ式で組めばいい。
視点が変わるのと、出来ることが増えることによって夢がひろがりんぐになるわけだ。
0267デフォルトの名無しさん
2014/02/09(日) 14:13:43.520268デフォルトの名無しさん
2014/02/09(日) 19:53:17.21理解しろ
0269デフォルトの名無しさん
2014/02/10(月) 00:39:22.03そう思うんなら中間言語使って頭鍛えなよ。
そんなのの成り立ち一々全部理解しなきゃいけないなら
VBAでだってまともに組めないよ。
0270デフォルトの名無しさん
2014/02/10(月) 10:47:10.65便利なものが人をバカにするんじゃなくて
便利なものに頼りきる人はもともとバカだっただけ
0271デフォルトの名無しさん
2014/02/10(月) 15:31:20.21それはExcelのソートのインターフェースが糞なだけ。
まともな言語ならラムダ式とかで比較を書ける。
クイックソートとかをいちいち真面目に実装するのは面倒だろ。
0272デフォルトの名無しさん
2014/02/10(月) 17:52:51.320273デフォルトの名無しさん
2014/02/10(月) 21:17:25.11Javaってラムダ式あったっけ?
0274デフォルトの名無しさん
2014/02/10(月) 22:12:34.15Java8で導入とか何とか。
0275デフォルトの名無しさん
2014/02/10(月) 22:59:24.35Basicと言う観点から見れば仕様が固まるなんてことはないよ。
時代に合わせてる常に仕様は変わる。
VBAがたまたまVB6.0辺りの仕様で停滞してるだけ。
もっと前のN-Basic辺りは
Console 0,25,0,1とかおまじないのようにみんな付けてたけど、
VBAから入った人にしてみれば何のこっちゃってことになる。
0276デフォルトの名無しさん
2014/02/11(火) 08:44:06.430277デフォルトの名無しさん
2014/02/11(火) 10:11:19.84古いシステムでも修正なしで動くように新しい機能をわざと使わないことならある
0278デフォルトの名無しさん
2014/02/11(火) 11:13:16.08もうバージョン違いに悩まないで良くなるのかなあ。
0279デフォルトの名無しさん
2014/02/11(火) 12:02:07.37これからもどんどん新機能が追加されてくに決まってる
0280デフォルトの名無しさん
2014/02/11(火) 14:29:28.140281デフォルトの名無しさん
2014/02/11(火) 23:00:10.06空欄のセルだけ非表示にできるようにはどうマクロを組めばよいのでしょうか。
数式が入っていなければ非表示にできるようには組めるのですが、
見た目上は空欄でもセルには数式が入力されているため上手くできません…。
どうかご教授ください。
0282デフォルトの名無しさん
2014/02/11(火) 23:05:27.59セルの非表示ってどうやってやってるの?
0283デフォルトの名無しさん
2014/02/11(火) 23:41:26.34セルではなく行の非表示でした。
例えばa1からa10に入力がない場合ですが、
If [Counta(a1:a10)] < 11 Then
Range("a1:a10").SpecialCells(xlCellTypeBlanks).EntireRow.Hidden = True
End If
で処理をしています。
ですがこれだと関数で空欄になっていてもセルには数式が入っているので、
非表示にはならないので困っています。
0284デフォルトの名無しさん
2014/02/12(水) 07:33:54.19ちょっと思い出せないけどxlCellTypeBlanks以外に何かなかったっけ?
ないなら判定を自分で作ればいいかと
0285デフォルトの名無しさん
2014/02/12(水) 10:47:06.240286デフォルトの名無しさん
2014/02/12(水) 12:30:57.75For Each c In Range("a1:a10")
If c.Text = "" Then Rows(c.Row).Hidden = True
Next
0287デフォルトの名無しさん
2014/02/12(水) 14:37:20.000288デフォルトの名無しさん
2014/02/12(水) 14:40:01.25それだと1個でも空白セルがあったら非表示になるんじゃ
0289デフォルトの名無しさん
2014/02/12(水) 16:22:45.01For Each でA1:A10内の各セルを一個ずつ選んで
そのセルのテキストが""だったらセルの行全部を削除する
これは>>283の要求どおりの動作だと思う
0290289
2014/02/12(水) 16:25:01.52削除じゃなく非表示だった
0291デフォルトの名無しさん
2014/02/12(水) 17:49:50.09ああ、行単位でコントロールするのか
If [Counta(a1:a10)] < 11 Then しか見てなかったわ
0292デフォルトの名無しさん
2014/02/12(水) 19:19:18.291行も消さない場合のがよっぽど多くないと、このロジックだとむしろナノ秒単位で遅くなるだろ
0293283
2014/02/12(水) 19:43:37.89このマクロで思った通りの処理をしてくれました、ありがとうございます。
ですが思ったよりも処理に時間がかかってしまうようです...。
レスを下さった方々ありがとうございます!
0294デフォルトの名無しさん
2014/02/12(水) 19:47:46.74まとめて処理すればいいよ
もらったコードに手を加えちゃダメってわけじゃないんでしょ?
0295デフォルトの名無しさん
2014/02/12(水) 19:56:10.39えっ調べるのはA列だけでいいの?だとしたら>>283のコードはなんだったのか…
遅いと感じるならScreenUpdatingを入れればたぶん一瞬で終わるよ
0296283
2014/02/12(水) 20:26:25.50レスくださった方のものを参考にさせていただいて自分で再度考えてみます。
ご迷惑おかけしました、ROMに戻ります。
0297デフォルトの名無しさん
2014/02/14(金) 03:55:36.59ウェブの某サイトに自動ログインするマクロを作っています。
IDとパスワードはうまく入力させることができたのですが、
ログインができません。
ログインボタンが次のようなソースコードのサイトに
ログインするにはどうしたら良いでしょうか?
<input type="hidden" name="SsLoginPage" value="/members/" id="hidden1">
<input type="hidden" value=" ログイン " id="submit1" name="submit1">
<input type="image" src="../../ssl_img/login/btn_login.gif" alt="ログイン" tabindex="300" id=image1 name=image1>
0298デフォルトの名無しさん
2014/02/14(金) 19:01:26.24スレ違い
0299デフォルトの名無しさん
2014/02/14(金) 21:24:22.54できてるところまでソース貼って
0300デフォルトの名無しさん
2014/02/14(金) 22:46:45.67サイトは伏せさせてもらっていいでしょうか? ネットで調べて無理矢理作ったので洗練されてません。
Sub 自動ログイン()
Dim obj As Object
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = True
objIE.Navigate "https://《ログインしたいサイト》"
Do Until objIE.Busy = False
Do Until objIE.ReadyState = 4
Do Until objIE.Busy = False
DoEvents
Loop
Loop
Loop
CreateObject("WScript.Shell").AppActivate "《ログインしたいサイトのタイトル》"
Set objU = objIE.document.getElementsByName("SsLogonUser")
If objU.Length = 0 Then
MsgBox "ログインページが変わった?"
WScript.Quit
End If
objU(0).Value = "《ID番号はここ》"
Set objU = Nothing
objIE.document.getElementsByName("SsLogonPassword").Item(0).Value = "《パスワードはここ》"
Set objU = Nothing
'このあと、ログインできるようにしたいのですが…
End Sub
0301デフォルトの名無しさん
2014/02/15(土) 11:58:56.47ExcelシートにユーザフォームでDTPickerを貼り付けて、日付をこのカレンダーで
選択すると、フォームがある位置の陰になっているセルにこっそり日付格納して
マクロでその日付を使うように作成しました。
ところがこのカレンダーが動く人と動かない人がいて困っています。
(クリックしてもユーザフォームが固定された状態でカレンダーが表示されない)
環境はExcel2010で作成および表示
拡張子は会社の方針で互換重視のxls(関連会社とのファイル共有などのため)
どうもExcel2000でファイルを開くと動くというのも確認されていて、意味不明です。
インスコされている環境も社内標準環境なので、ランタイムが異なるなど無いはず
なんですが…
解決策の心当たりがあればよろしくお願いします。
0302デフォルトの名無しさん
2014/02/15(土) 13:34:19.94ここにアクセスがインストールされてないとどうたらとか
アクセスが無くてもVBランタイムが入ってれば動くけど
それをエクセルで使うのはライセンス違反がどうたらとか色々書いてある
http://www.h3.dion.ne.jp/~sakatsu/Excel_Tips06.htm
0303デフォルトの名無しさん
2014/02/15(土) NY:AN:NY.ANhttp://kojikoji75.hatenablog.com/entry/2013/08/17/175328
の Date and Time Picker Control を使っているのでライセンス等は大丈夫なはずです
よく見るとAxtiveXコントロールとあるので
http://www.ilovex.co.jp/blog/system/cat820/excelactivex.html
と同じ罠に引っかかってるかもです(症状が良く似ている印象)
とりあえず月曜会社で試してみますが、これで解決しなかったら本格的に分からないw
0304302
2014/02/15(土) 14:44:20.37その Date and Time Picker Control てのは2007から実装されたんでしょ?
それだと>>301で言ってた「2000で動く」ってのはおかしくない?
0305301
2014/02/15(土) 15:10:33.32言われてみると確かにおかしいですね
でも2kで「動いた」って目の前で見せられたので…
昨日発覚したばかりなので、月曜改めて周囲の状況も含め確認してきます。
0306デフォルトの名無しさん
2014/02/15(土) 17:36:08.310307デフォルトの名無しさん
2014/02/17(月) 21:49:42.74Sub 総計計算_送料()
Dim 行番号 As Currency
Dim 工場直送送料 As Currency
Dim 受注生産送料 As Currency
Dim 送料合計 As Currency
行番号 = 14
送料合計 = 0
工場直送送料 = 500
受注生産送料 = 800
Do Until Cells(行番号, 4) = ""
If Cells(行番号, 6) = "工場直送" Then
送料合計 = 送料合計 + 工場直送送料
ElseIf Cells(行番号, 6) = "受注生産" Then
送料合計 = 送料合計 + 受注生産送料
0308デフォルトの名無しさん
2014/02/17(月) 21:54:21.14例えば
送料合計 = 送料合計 + 工場直送送料は
0 = 0 + 500
と、工場直送送料は「500」として計算されると思うのですが
Do Until Cells(行番号, 4) や If Cells(行番号, 6)といった式の場合
なぜいきなり(14 , 4)セルや(14 , 6)セルといったセルに飛ばずに、
ちゃんと一行目のセルから計算されるのかわかりません。
本当に初心者でアホな質問だと思うのですが、答えて欲しいです。
0309デフォルトの名無しさん
2014/02/17(月) 22:18:32.410310デフォルトの名無しさん
2014/02/17(月) 22:26:13.83ステップ実行で1行ごとに各変数の値を確認してみたら?
0311デフォルトの名無しさん
2014/02/18(火) 03:36:11.850312デフォルトの名無しさん
2014/02/18(火) 07:28:15.080313デフォルトの名無しさん
2014/02/18(火) 11:22:50.430314デフォルトの名無しさん
2014/02/18(火) 14:32:12.07IntegerじゃないぞLong使えよ
0316デフォルトの名無しさん
2014/02/19(水) 12:30:10.58残念ながらわかりません
ごめんなさい
0317デフォルトの名無しさん
2014/02/19(水) 13:51:27.51ログインボタンのクリックは
objIE.document.all.btn01.Click
みたいに書く
ページ内にクリックできる場所が複数ある時はボタン番号を適切に変える
「戻る」「入力内容をクリア」「IDをクッキーに保存」とか色々と並んでる場合があるからね
ていうか検索ぐらいしろよ
「VBA IE操作 クリック」みたいなキーワードでサンプルがいくらでも出てくるぞ
0318デフォルトの名無しさん
2014/02/19(水) 21:09:16.21上記を代入したいんですがうまくいきません。
n1は任意の変数です。Vlookupのところではねられます。
Worksheets("データシート").Cells(n1, 6).Formula = "=IfError(Hyperlink(VLookup(Cells(" & n1 & ", 5), $Q$:$R$10, 2, True)), "")"
考えてやってみましたがこれではダメっぽいです。
ご教授いただけると助かります。
0319デフォルトの名無しさん
2014/02/19(水) 21:49:24.13Worksheets("データシート").Cells(n1, 6).Formula = "=IfError(Hyperlink(VLookup(Cells(" & n1 & ", 5), $Q$:$R$10, 2, True)), """")"
とりあえずこんな感じ?
0321デフォルトの名無しさん
2014/02/19(水) 21:58:31.80Worksheets("データシート").Cells(n1, 6).Formula = "=IfError(Hyperlink(VLookup(Cells(" & n1 & ", 5), $Q$2:$R$10, 2, True)), """")"
0322デフォルトの名無しさん
2014/02/20(木) 00:46:24.24それで番号をひと通り押してみたんですけど
どれもダメでした
>>297のソースコードでもボタン形式でいいのでしょうか?
>>316
丁寧にありがとうございます
0323デフォルトの名無しさん
2014/02/20(木) 01:24:13.28よくわからんけどinputタグにname=image1って書いてあるからクリックするのもimage1と違う?
0324デフォルトの名無しさん
2014/02/20(木) 01:55:37.89>>323
すげえええええええ
objIE.document.all.image1.Click
であっさり通りました
ありがとうございます
0325デフォルトの名無しさん
2014/02/20(木) 07:29:20.69解決してよかったね
でもスレチなんだから今後は余所に行ってやってね
0326デフォルトの名無しさん
2014/02/20(木) 09:03:39.96このスレでは問題ない
そういうことが気になるなら君が他所へ行きたまえ
0327デフォルトの名無しさん
2014/02/20(木) 10:28:54.40ですよね
0328デフォルトの名無しさん
2014/02/20(木) 19:00:31.77いるのですが、文字列、数値、計算式などが入っている普通のファイルなら
期待通り動くのですが、EXCELは多機能ですので、普段全く使ったことが無い
ような機能とか設定がシートやセルなどに追加されていると、自作プログラム
が予期しない動きをするのではないかと思っています。
そのテストの為には、自分でEXCELファイルにいろんな加工を行えば良いわけですが、
自分でも知らないような機能は使うことができません。例えばデータベースとか
テーブルとか、グラフ、フィルターなどなど、まだまだ沢山あります。
そこで質問なのですが、そういうEXCELの機能がてんこ盛りみたいにいろいろ
組み込まれているような何か良いテスト用のファイルって、どこかにありませんか?
0329デフォルトの名無しさん
2014/02/20(木) 19:21:36.25""が余計にいるとは知りませんでした。
おかげさまで解決・・・となればよかったんですが
なぜかVookupのあとがCellsだとうまく読み出ししてくれません。
ちゃんと =IFERROR(HYPERLINK(VLOOKUP(Cells(20, 5), $Q$2:$R$10, 2, TRUE)), "")とセルには入っています。
手動でCells(20,5)をE20にすると思った通りの動きになるんですが、なんででしょう?
0330デフォルトの名無しさん
2014/02/20(木) 21:17:27.35ワークシートでは
Cellsが使えないからエラーになるんじゃないか?
0331デフォルトの名無しさん
2014/02/20(木) 21:20:43.09そもそもワークシート関数にCellsなんて無いから
0332デフォルトの名無しさん
2014/02/21(金) 04:14:19.51ワークシート上の数式にCellsは使えないけど、
VBAでは使えるからコード中でCells(20,5)を指定させる事なら出来た。
ただし、絶対参照になっちゃったけど。
Worksheets("データシート").Cells(n1, 6).Formula = "=IfError(Hyperlink(VLookup(" & Cells(20, 5).Address & ", $Q$2:$R$10, 2, True)), """")"
相対参照で書きたければFormulaではなくFormulaR1C1を使えば良いと思う。
0333デフォルトの名無しさん
2014/02/21(金) 07:35:53.62あなたにプログラムを依頼した人にもらえばよいと思います
0334デフォルトの名無しさん
2014/02/22(土) 01:34:21.73シートAのA1に名前A1とつけたとき
$A$1 = 名前A1なのかな?
=A1の相対参照で行列の挿入して参照がずれる
アンチパターンの整理ができてないわ
0335デフォルトの名無しさん
2014/02/23(日) 15:56:19.01Do Until 親 = 20 '20回ループ
Do Until 子 = 10 '10回ループ
'子くり返し処理内容
子 = 子 + 1
Loop
'親くり返し処理内容
親 = 親 + 1
Loop
このようにネストさせる事は可能なのでしょうか?
とりあえず作ってみたら動きませんでしたが出来ると説明されている解説サイトもあるようで
一体どうやって書けば良いのでしょうか?
0336デフォルトの名無しさん
2014/02/23(日) 16:27:41.93親の二回目のループで 子 の内容どうなってる?
0337デフォルトの名無しさん
2014/02/23(日) 16:31:18.920338335
2014/02/23(日) 16:32:17.71親の計算結果の数値を子に渡して詳細分析を10パターン行うと言ったないようですが
これってプロシージャをわければ解決でしょうか? そんな気がしてきました。
0340デフォルトの名無しさん
2014/02/23(日) 16:52:35.73ごたくはいいから >>336 を確認しろよ
0341デフォルトの名無しさん
2014/02/23(日) 17:15:19.70わからないならコードを削らず貼ろう
0342デフォルトの名無しさん
2014/02/23(日) 17:45:19.18>>341
チェックしたところ子のループ処理が終了したところでVBAの実行が終了いるようで、、 やはりネストは無理か??
0343デフォルトの名無しさん
2014/02/23(日) 17:53:58.08ネスト自体はできるよね。
コード見直したがいいっすよ。
Dim Parent As Long
Parent = 0
Do Until Parent = 20
Dim Child As Long
Child = 0
Do Until Child = 10
Debug.Print Parent & " " & Child
Child = Child + 1
Loop
Parent = Parent + 1
Loop
0344デフォルトの名無しさん
2014/02/23(日) 17:54:51.09>>340
>>341
なるほど!!親処理1回ごとに子の変数を初期値に戻さないと子の処理がすべてスルーされているわけですね、修正するとばっちり動きました。
超初歩的な間違いでした。。どうもありがとうございました!
0345デフォルトの名無しさん
2014/02/23(日) 17:56:18.66ありがとうございますm(_ _)m
0346デフォルトの名無しさん
2014/02/23(日) 18:03:05.91VBA は変数の初期値が決まってるからいいんだけど、こんなケースもあるから明示的に設定した方がいいよ。
あと、今回の場合なら For 〜 Next 使った方がいいと思う。
0347デフォルトの名無しさん
2014/02/23(日) 18:29:53.38どうしてですか?
0348335
2014/02/23(日) 18:33:31.050349デフォルトの名無しさん
2014/02/23(日) 19:26:51.74どこを質問してるんだよ...
0350デフォルトの名無しさん
2014/02/23(日) 21:43:02.28すみません
後半部分についてです
0351デフォルトの名無しさん
2014/02/23(日) 21:54:19.10実行時でないと判らないってんなら Do Unti
の方でないとダメだろうけど判ってんなら
For Nextの方が良いに決まってるl
0352デフォルトの名無しさん
2014/02/23(日) 21:57:31.13今回みたいな初期化漏れや Parent = Parent + 1 の入れ忘れがなくなるから。
0353デフォルトの名無しさん
2014/02/23(日) 22:04:00.80ありがとうございます
ヒューマンエラーを低減させるためにFor〜Nextの方が良い、ということだったのですね
ちょっと深読みしすぎていたようです
0354デフォルトの名無しさん
2014/02/24(月) 20:49:02.56複数のインスタンスでExcelが起動していて、それぞれのインスタンスに
未保存の新規ブックがひとつずつ開いています。
これらのブックは未保存のまま、すべてのブックのオブジェクトを取得する方法は
あるのでしょうか?
VBAでできるに越したことはないのですが、別の方法でもOKです。
よろしくお願いします。
0355デフォルトの名無しさん
2014/02/25(火) 07:33:56.81インスタンスを生成したあと
コレクションに格納しておいて
ループでコレクションの中身を取得するようにしとけば?
0356デフォルトの名無しさん
2014/02/25(火) 09:28:04.02vbaの参照設定で一度フォームを使ったら
Microsoft Forms 2.0 Object Library
のチェックを外すこと出来なくなるん?
フォーム使ったら自動でチェックが入るけど、いらなくなったんで
フォームを解放してついでに参照設定のチェックをoffにしようとしたら
「使用中のコントロールまたは参照を削除することはできません。」
って出るんだけど
0357デフォルトの名無しさん
2014/02/25(火) 11:01:09.75エクセル2000だけどおなじ症状が出てる
0358デフォルトの名無しさん
2014/02/25(火) 15:26:49.432007で試したけど、保存して開き直したら消えてる
0359356
2014/02/25(火) 17:00:57.86ってか、参照設定を解除するのを教えてもらったんで、それで消しましたた^^;
Sub testRef()
Dim Ref As Object
For Each Ref In ThisWorkbook.VBProject.References
Debug.Print Ref.Name
If Ref.Name = "MSForms" Then
ThisWorkbook.VBProject.References.Remove Ref
End If
Next Ref
End Sub
0360デフォルトの名無しさん
2014/02/26(水) 13:49:18.84ttp://www.forest.impress.co.jp/docs/news/20140226_636988.html
0361デフォルトの名無しさん
2014/02/27(木) 13:32:25.19www.hatinosu.net/camp/archives/okinawa/
www.hatinosu.net/camp/archives/1200/
こういうページが複数あります (下のURL)
これをExcelの表にまとめてしたいと思っています
場所1 料金1 期間1 関連1 備考1
場所2 料金2 期間2 関連2 備考2
場所3 料金3 期間3 関連3 備考3
場所4 料金4 期間4 関連4 備考4
htmlで表を取り込む方法はわかったのですが
まとめてやる場合はマクロが必要なのでしょうか
参考になるサイトなどありましたらご教示ください
0362デフォルトの名無しさん
2014/02/27(木) 14:21:41.96ホームページに書いてある内容から必要な部分だけ取り出す方法は色々あるけどVBAを使った方が楽だと思う
ただ、人間の目で必要な部分を探すのは簡単だけど、それをコンピューターに自動でやらせるのはものすごく大変
参考サイトを見た程度でできるような物じゃない
手順としては
(1) URLの一覧を作る
(2) HTMLを読み込む
(3) タグとテキストを解析して必要な情報を取り出す
(4) 取り出したデータをシートに並べる
どれも専門的な知識が必要なんで、どこまでわかっているのか細かく確認しながらじゃないと教えるのも大変
0363デフォルトの名無しさん
2014/02/27(木) 14:24:27.05ホームページから情報を取り出してワークシートにコピーする例
http://www.happy2-island.com/excelsmile/smile03/capter00721.shtml
0364デフォルトの名無しさん
2014/02/28(金) 00:02:45.20という処理はどのようにすればよいでしょうか。
検索結果のページタイトル一覧は
ol#rso > li > div > h3.r > a……(結果毎にli繰り返し)となっていたので、
「ol id="rso"内の、一つ目のh3 class="r"をクリックする」という処理が
できればと思うのです。
i'mfeelingluckyに渡して取得していたのですが、一部直接飛べないものがあり、
このような処理をしたいと思いました。
0365デフォルトの名無しさん
2014/02/28(金) 00:27:30.76クリックしなきゃいけないの?
aタグのURLをブラウザに直接渡せばいいじゃん
まあGoogleの場合はちょっと文字列の加工が必要だけど
0366デフォルトの名無しさん
2014/02/28(金) 23:51:48.43デバックしてみると、アプリケーションまたはオブジェクト定義のエラーですと言われWith Cells(Rows.Count, 1).End(x1Up).Offset(1)の部分が黄色く反転しています。
どのように修正するとよいのでしょうか?また、今、シートは中1、中2、中3という名前のシートがあります。
ユーザーフォームで学年を中1を選択した場合には中1のシートに入力(中2、中3も同様に)する場合どのように修正すればよいか教えていただきませんか?
0367デフォルトの名無しさん
2014/02/28(金) 23:55:12.51Private Sub cmd終了_Click()
Unload Me
End Sub
Private Sub cmd登録_Click()
Dim RowNum As Long
With Cells(Rows.Count, 1).End(x1Up).Offset(1)
.Value = Text生年月日.Value
.Offset(, 1).Vulue = schoolyears.Value
.Offset(, 2).Vulue = Text氏名.Value
.Offset(, 3).Vulue = Textフリガナ.Value
.Offset(, 4).Vulue = Text中学.Value
.Offset(, 5).Vulue = Text郵便番号.Value
.Offset(, 6).Vulue = Text住所.Value
.Offset(, 7).Vulue = Text自宅tel.Value
.Offset(, 8).Vulue = Text生徒携帯.Value
.Offset(, 9).Vulue = Text生徒アドレス.Value
.Offset(, 10).Vulue = Text保護者氏名.Value
.Offset(, 11).Vulue = relations.Value
.Offset(, 12).Vulue = Text保護者携帯.Value
.Offset(, 13).Vulue = Text緊急連絡先.Value
.Offset(, 14).Vulue = Textメールアドレス.Value
.Offset(, 15).Vulue = Text備考ス.Value
End With
End Sub
0368デフォルトの名無しさん
2014/02/28(金) 23:56:00.50End Sub
Private Sub UserForm_Initialize()
schoolyears.AddItem "中1"
schoolyears.AddItem "中2"
schoolyears.AddItem "中3"
relations.AddItem "父"
relations.AddItem "母"
relations.AddItem "その他"
End Sub
0369デフォルトの名無しさん
2014/03/01(土) 01:27:58.58○ XlUp
× X1Up
0370デフォルトの名無しさん
2014/03/01(土) 01:37:04.380371デフォルトの名無しさん
2014/03/01(土) 01:56:54.39○ Value
× Vulue
0372デフォルトの名無しさん
2014/03/01(土) 01:58:05.73「備考ス」?
0374sage
2014/03/01(土) 02:28:01.51ありがとうございます。初歩以前のミスしてしまいました。
>>370
すいません。
>>371
間違ったものをコピペしてしまったのが原因です(泣)ありがとうございます。
>>372
オブジェクト名確かに変ですね。備考に直しました。ありがとうございます。
0375デフォルトの名無しさん
2014/03/01(土) 02:32:30.20代わりに(?)フォローしていただきありがとうございます。
0376デフォルトの名無しさん
2014/03/01(土) 14:57:19.03レスありがとうございます。
現状、i’mfeelinglucky検索で取得ページ移動、表示されているページタイトルとURL取得、
としていたので、VBAもあまり慣れていないため、
クリック動作さえ加えれば問題なくなるかと思ったのですが、難しいものでしょうか。。。
0377デフォルトの名無しさん
2014/03/01(土) 16:44:08.18レスありがとうございます。
現状、i’mfeelinglucky検索で取得ページ移動、表示されているページタイトルとURL取得、
としていたので、VBAもあまり慣れていないため、
クリック動作さえ加えれば問題なくなるかと思ったのですが、難しいものでしょうか。。。
0378デフォルトの名無しさん
2014/03/01(土) 21:17:15.14変換する方法ありますか?出来ればブックの全シートを一気に。
0379デフォルトの名無しさん
2014/03/01(土) 21:30:56.910380デフォルトの名無しさん
2014/03/01(土) 22:05:09.76getElementById('rso').getElementsByTagName('a')[0].click
みたいなことVBAでできないのでしょうか。
それを聞いてるんだよと言うのならスマン。
0381デフォルトの名無しさん
2014/03/01(土) 22:58:29.98できるよ
0382デフォルトの名無しさん
2014/03/02(日) 18:09:03.96Workbooks("1.xls").Sheets("Sheet1").Range("a1":"z1").Value = Workbooks("2.xls").Worksheets("Sheet1").Range("a1":"z1").Value
このように書くと数値が極端な桁のマイナスになっていたりエラー値に変化しているセルが発生するのですが
元の数値のセルは =c1 =c2 ・・・といったような単純なセル参照の羅列で数値は小数点入りの正数で計算式やらセルの特殊指定は
一切はいってないので何故化ける箇所が発生するのか謎なのですが 原因は何なのでしょうか?
上記のコマンドに xlPasteValues 値を貼り付けの指定を追加するにはどう書けばいいのでしょうか?
0383382 半分自己解決しました
2014/03/02(日) 18:54:41.58よく見直してみますと元セルの セルの書式設定- 表示形式- 数値 の箇所が
http://homepage3.nifty.com/gakuyu/excel/syosiki2_fig03.gif
小数点ありの負の数値で選ばれていました。
これが原因のようですお騒がせしました
全部が負の数値になっていたらすぐわかるのですがほとんどは正数のままで
所々負の数値に置き換わっているのは謎です
0384デフォルトの名無しさん
2014/03/03(月) 07:39:32.84値の貼り付けでいいならVariant変数に入れてから貼り付けるのが簡単でいいと思う。
たとえば382の例なら
Dim v As Variant
v = Workbooks("2.xls").Worksheets("Sheet1").Range("a1":"z1")
Workbooks("1.xls").Sheets("Sheet1").Range("a1":"z1") = v
こんな感じ
こっちのほうが普通にコピーするより実行速度も速いらしい
ただし、コピーできるのは値のみ、書式とか数式とかは引き継がれない
0386384
2014/03/03(月) 22:19:34.69今更だけど、>>382の式はおかしいよ
ブック1("1.xls")からブック2("2.xls")にコピーするなら
「イコールの右」から「イコールの左」に代入するんだから
Workbooks("2.xls").Sheets("Sheet1").Range("a1":"z1").Value = Workbooks("1.xls").sheets("Sheet1").Range("a1":"z1").Value
だよ
(>>382は式の右と左が逆)
0387デフォルトの名無しさん
2014/03/03(月) 23:57:40.67それって>>382と同じだよ
0388384
2014/03/04(火) 00:20:39.61Variantに入れると速いってOfficeTANAKAに書いてあったけど
0389デフォルトの名無しさん
2014/03/04(火) 07:29:55.480391デフォルトの名無しさん
2014/03/04(火) 08:25:07.77どこのページよ
URL 晒して
0392デフォルトの名無しさん
2014/03/04(火) 12:53:57.87うん、それを皮肉ったつもりなんだけどわからなかった?
0393デフォルトの名無しさん
2014/03/04(火) 20:15:07.96うん、それを分かってて茶化したつもりなんだけどわからなかった?
0394デフォルトの名無しさん
2014/03/04(火) 21:51:23.58うん、さすがにそれは無理がありすぎてわからなかった
0395デフォルトの名無しさん
2014/03/04(火) 22:07:20.57修行が足りない
0396デフォルトの名無しさん
2014/03/05(水) 00:20:10.55そう同じ
だから速くはならん
0397デフォルトの名無しさん
2014/03/10(月) 00:13:33.22現在VBAで別名で保存した場合1回数十秒 LAN経由で開くと応答無しになるのでそれぞれのローカルへコピーして開くと又数十秒かかり
数台へ配布するのになんだかんだ数分ぐらい時間がかかっています。
閲覧側は見れれば何でも良いです。(Excelブック形式だと尚良い)
0398デフォルトの名無しさん
2014/03/10(月) 00:35:31.08不可能
大量のデータをLAN越しに同時に閲覧したい場合はAccessを使うのが普通
0399デフォルトの名無しさん
2014/03/10(月) 00:39:25.86数式がてんこ盛り盛りならVBAで全部コピーして値だけ張り付けて別名保存する、ぐらいかな
処理にどのくらいの時間がかかるかは知らんけど
数式がほとんどなくてデータだけで重いのなら画像に出力してPDF化かな
0400397
2014/03/10(月) 00:55:43.48>>399
無理っぽいのですね。ありがとうございます。
データてんこ盛りなのでアクセスやSQLなのでしょうかねぇ 使った事ありませんが、、
0401デフォルトの名無しさん
2014/03/10(月) 01:18:59.92ほんとにそのサイズでやり取りする必要があるのか良く考えた方がいいんじゃね
0402デフォルトの名無しさん
2014/03/10(月) 06:46:54.06ブックの共有じゃダメなの?
そもそも Excel で 100MB って言うのも色々危険な香りがするが...
0403デフォルトの名無しさん
2014/03/10(月) 06:57:20.42文字データだけならCSVで吐いて
閲覧者がブックを開いたら取り込むとかはどうよ
セル書式は予め設定しておいて、不足なら自動書式で
グラフも置いてあるなら範囲を名前定義にして取り込み時に名前定義をちょろっと修正すればいい
>>402
>LAN経由で開くと応答無しになる
に該当するんじゃないの?しないの?
0404デフォルトの名無しさん
2014/03/10(月) 07:46:59.95> に該当するんじゃないの?しないの?
共有ブックはもう少し賢いけど、正直 100MB クラスのブックを共有で使ったこと無いから試してみてくれとしか言いようがない。
共有特有のトラブルもあるし。
0405デフォルトの名無しさん
2014/03/10(月) 22:22:30.840406デフォルトの名無しさん
2014/03/10(月) 22:31:12.02せめてシートごとに分割したほうがいいと思うが
変な規定でもあるんだろう
0407デフォルトの名無しさん
2014/03/10(月) 22:42:00.56それを瞬間的に閲覧するようにできるExcelVBAって万能だな
0408デフォルトの名無しさん
2014/03/11(火) 10:45:11.04100Mbpsで理論値maxでも100MBをコピーするのに10秒程度かかる。
実効値20Mbps位だったらその5倍かかるわけで、100MBのコピーに2,30秒かかる環境があってもおかしくない。
0409デフォルトの名無しさん
2014/03/11(火) 20:16:20.38細かいことだけど100Mbpsなら8秒じゃないの?
0410デフォルトの名無しさん
2014/03/11(火) 21:30:20.38実測してみるとわかるけど、固定IPで他のネット機器をすべて切り離して回線が独占できる状態を作ってやっても
オーバーヘッドがあるから最高でも表示の8割〜9割ぐらいの速度になる
実用に使ってる環境だともっと遅くなる
0411デフォルトの名無しさん
2014/03/11(火) 21:44:28.36細かい事をいうなら
ネットワーク回線を流れてるのはデータだけじゃない
実データの1バイトが8ビットの情報として流れているとは限らない
0412デフォルトの名無しさん
2014/03/11(火) 21:47:49.120413デフォルトの名無しさん
2014/03/11(火) 22:23:55.060414デフォルトの名無しさん
2014/03/11(火) 22:41:58.20ファイル転送の理論値マックスは回線上の理論値マックスからいろんな層のオーバーヘッド分下がるのが当然
0415デフォルトの名無しさん
2014/03/15(土) 18:19:11.62ID:wdy6oLTCVBAの命令だけを書いた空のブックと、
分析したいデータが書かれたブックを分離して運用することは可能なのでしょうか?
現状データの書かれたブックが数十に同一処理をさすためにそれぞれにVBAを記述していますが
処理方法を変更する場合全ブックの同じVBAコードを書き換えていて手間がかかっています。
ならば空のVBAだけを書いたブックを1つ動かしておけば済むのではと思ったのですが
ここにいらっしゃるプロの方はどうされているのでしょうか?
0416415
2014/03/15(土) 18:22:17.82ID:wdy6oLTC又、空のブックで運用ができるのであればよく使う命令を個別にモジュール化して連携やネストさせるような運用方法も可能なのでしょうか?
これができるとなるとデータの書かれているシートにVBAを書くのは大量のブックを処理する場合は非合理的かと思いましたがどうでしょうか?
0417デフォルトの名無しさん
2014/03/15(土) 18:34:24.97ID:IpiW3W82> 分離して運用することは可能なのでしょうか?
可能
Excel アドイン 作成 とかでググると幸せになれるかも
0419デフォルトの名無しさん
2014/03/17(月) 04:12:41.18ID:NI0yZz+J少し仕様の変更が出てきてしまったため、再度作成か手直しをしていただきたいのですが
お願いできますでしょうか。
以下のマクロで月初から月末の所を、月初から翌月の3日までにしたいのです。
どうか宜しくお願い致します。
0420デフォルトの名無しさん
2014/03/17(月) 04:15:10.22ID:NI0yZz+JDim firstDay As Date
Dim lastDay As Date
Dim targetDay As Date
On Error GoTo Error_Handler
With ThisWorkbook
'月初日を取得
firstDay = .Sheets("1日").Range("B1").Value
'月末日を取得
lastDay = DateSerial(Year(firstDay), Month(firstDay) + 1, 0)
0421デフォルトの名無しさん
2014/03/17(月) 04:18:35.64ID:NI0yZz+J'先にシート名とシート色を設定してしまう。
'.Sheets(Sheet1.Name).Name = Format(.Sheets(Sheet1.Name).Range("B1").Value, "m月d日")
If Not .Sheets("祝日").Cells.Find(firstDay, LookAt:=xlWhole) Is Nothing Or _
Weekday(firstDay) = vbSunday Then
.Sheets("1日").Tab.ColorIndex = 3
End If
0422デフォルトの名無しさん
2014/03/17(月) 13:25:21.94ID:vj1XNX0yこれコードの一部分だけだよね?
月末日を保持しているであろう変数"lastDay"をどこで使うのか分からないけど、
(ここに貼られている範囲では月末日を取得してるだけでそれを使用していない)
lastDay = DateSerial(Year(firstDay), Month(firstDay) + 1, 0)
を
lastDay = DateSerial(Year(firstDay), Month(firstDay) + 1, 3)
に変更するだけで翌月3日までにはなる。
ただし、それをどのように利用するのかはこのコード以外の部分に書いてあるので
単純にこれだけでそのコード全体が正常に(あなたの意図した通りに)動くかどうかは分からない。
0423デフォルトの名無しさん
2014/03/17(月) 22:24:00.94ID:iQzGYjkhやる気のないやつに解釈垂れても意味ないぞ。
そんな解釈より動くコードしか興味ないからコード書けって言ってるんだから。
0424デフォルトの名無しさん
2014/03/17(月) 23:26:36.86ID:vj1XNX0yいや、別にどんな相手でも良いっすよ
こっちが好き勝手に書いてるだけだし。
ところで、垂れるのは解釈じゃなくて講釈ですね。
0425デフォルトの名無しさん
2014/03/18(火) 00:01:33.11ID:YCsGrVX8昨日はなぜかエラーが出たあと、バイさるになったまま書き込みができなくなり
続きのコードを貼る事が出来ませんでした。
このあとの続きのコードは、シート名の指定と日祝の色指定のコードになっているのですが
シート名を1日、2日、3日、となるように指定しているため、これだと翌月の3日分が重複してしまうためか
422さんの仰るMonth(firstDay) + 1, 3では、エラーになってしまい上手くいきませんでした。
要は、月初から翌月の3日までのシートを作りたく、その際、日祝を赤字にし
尚且つ各シートのB1セルに○月○日と表示したものを作りたいのですが
何か上手くいく方法はありますでしょうか。
よろしくお願い致します。
0426422
2014/03/18(火) 00:51:31.95ID:Riw4xitAシート名に月も入れるとか翌月の3日分のシート名に翌月って付け加えるとか、
やりようはそれなりに有るんでないかい?
その程度の修正は元のコードさえ曝せば
このスレの人達なら簡単に出来るだろうけど、
肝心のコードが無けりゃ誰にもどうにもなんないよね。
ちなみに俺は寝るんで今日はもう出来ないです。
0427デフォルトの名無しさん
2014/03/18(火) 01:11:58.51ID:YCsGrVX8早速のレスありがとうございます!
修正でも新規に作成でも、作っていただけるのなら
どちらでも大変嬉しいのですが、一応続きのコードを晒しておきますので
お時間のある時に、どうか宜しくお願い致します!
因みにシート名は、1日、2日、3日、、、としたいため
翌月3日分は「翌月」と付け加える方向でお願いしたいと思います。
0428デフォルトの名無しさん
2014/03/18(火) 01:13:33.38ID:YCsGrVX8'シート名、シート色の設定を行う。
For targetDay = lastDay To firstDay + 1 Step -1
.Sheets("1日").Copy After:=Sheets("1日")
.ActiveSheet.Tab.ColorIndex = xlNone
.ActiveSheet.Range("B1").Value = targetDay
.ActiveSheet.Name = Format(ActiveSheet.Range("B1").Value, "d日")
If Not .Sheets("祝日").Cells.Find(targetDay, LookAt:=xlWhole) Is Nothing Or _
Weekday(targetDay) = vbSunday Then
.ActiveSheet.Tab.ColorIndex = 3
End If
Next
End With
Exit Sub
Error_Handler:
'例外時はエラー内容を表示する。
MsgBox Error
End Sub
0429422
2014/03/18(火) 08:56:33.08ID:Riw4xitAこんな事言っちゃなんだけど、>>419-421の時点で薄々感じてたとおり
やっぱり糞コードだったw(気を悪くしたらゴメンネ)
いろいろ突っ込みどころ満載なんだけど、とりあえずこのままやるんだったら
例えば>>428の
.ActiveSheet.Name = Format(ActiveSheet.Range("B1").Value, "d日")
を
If Month(targetDay) = Month(firstDay) Then
.ActiveSheet.Name = Format(ActiveSheet.Range("B1").Value, "d日")
Else
.ActiveSheet.Name = "翌月" & Format(ActiveSheet.Range("B1").Value, "d日")
End If
に変更するととりあえず動くよ。
根本的にコード全体を書き直したほうが尚更良いとは思うけど、
そういうのは俺みたいなアマチュアじゃなくて
お金を払って誰かきちんとしたプロに頼むような話になるんじゃないかな。
0430デフォルトの名無しさん
2014/03/24(月) 00:24:00.84ID:mInA5lgN両者に違いはあるのでしょうか?また、どれを試しても停止しない場合の対応策ってあるんですか?
0431デフォルトの名無しさん
2014/03/24(月) 12:27:01.03ID:KuNBiX6yぐぐったらこんなん出てきた
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1149563081
まぁ、なんで動作が違うのかは読んでも分からんかったけど。
あと、ESCとかで停まんないときは
おいらはしょうがないからタスクマネージャからエクセルごと停止させてる
0432デフォルトの名無しさん
2014/03/29(土) 16:33:15.72ID:e3FYqT1Nその後、中間データを諸々の処理に使う。
今は、VBAで中間データを計算させている。中間データはワークシート関数で計算させることもできる。
今のように中間データはVBAで計算させるのがいいのか、
それとも中間データはワークシート上で計算させVBAで計算結果を読み込んでその後の処理を行うのがよいのか?
0433デフォルトの名無しさん
2014/03/29(土) 19:49:34.25ID:OpDSuCZSブックの動作の軽さを求めるならVBAで処理して
セルには値だけを入れるほうが良いけど、
セルに数式を入れてあればどういう処理をしているのか目で見て確認できる。
これはVBAが分からない人を相手にする時には結構重要なことで
俺も勤務先で自分で使うブックはVBA使いまくりだけど
マクロ知らない上司に提出するものは出来る限りマクロを使わずに処理してる。
というか「マクロ使ったものは何をやってるか分からないから信用できない」
といわれて提出できない。
0434432
2014/03/29(土) 21:33:41.21ID:e3FYqT1Nこのブックは私だけが使うものです。重視したいのはマクロが高速であるかどうかということ。
VBAの高速化に関するウェブページを読むと、
コーディングの方法によりマクロ終了までの時間が大きく変わり、
又、worksheetFunctionは比較的高速であるとの情報もありました。
そこで、下手にVBAで全部処理させるよりもワークシート関数で計算できるところはワークシートで処理させるほうが
今より早くなるのかなと思ったわけです(VBAは独学のためあまり自信がないのです)。
ちなみに、生データは1日に1行ずつ増えます。処理は毎日実行します(会社休日は実行しない)。
0435433
2014/03/29(土) 23:51:13.09ID:OpDSuCZSあぁ、どっちみちVBA自体は使う前提で、
VBAのコード中でワークシート関数を使うかべきかどうかって話だったのね
そんなの好きにしたら良いじゃん
ワークシート関数使った場合と使わない場合を両方試して
速いほう使ったらいいんじゃないの
0436デフォルトの名無しさん
2014/03/30(日) 00:25:58.15ID:v4CA15kT必要なデータだけ持ってきて計算にのみ使ったほうが良いんじゃないかい
ま、1万行くらいなら大丈夫ではあるんだろうけど
0437デフォルトの名無しさん
2014/03/30(日) 00:31:57.51ID:4kZGo4f6VBA使うか、ワークシート関数でゴリゴリやるか、どっちかが早いかって話なんじゃ?
全部再計算させて、中間結果必要ないなら、多分VBAでやった方が早くできると思うけど
それなりにVBAがちゃんと使えるなら、って前提だが
まあ今時のスペックなら1万×5ぐらいならワークシートでも気にするほどではないと思うが
0438432
2014/03/30(日) 01:17:55.49ID:hXPzlqPDレスありがとうございます。どちらにしてもVBAは使います。
今VBAで行っている計算の一部をワークシート関数で置き換えるべきかを検討中なのです。
VBA高速化関連のページは一通り目を通して以前に比べれば格段に早くなったのですが、
それでも数時間かかる処理もあって更なる高速化を目指しているところなのです。
一概には言えないようなので時間を測定してみます。
データの持ち方についてもいい方法を模索しています。ありがとうございました。
0439デフォルトの名無しさん
2014/03/31(月) 00:10:35.50ID:ymkB1Ks5Formula1:="=IF(A2="""",A2,INDIRECT(A2))"
A2の部分をを cells(1,2)という形で指定できないでしょうか?
やりたいことはプログラムのループでA2を
B2,B3と変えたりしたいのです、アドバイスお願いします
0440デフォルトの名無しさん
2014/03/31(月) 00:57:57.69ID:+/Q0rb5yB2、B3・・・としたいなら
For b = 2 to 9
(略) Formula1:="=IF(A2="""",A2,B" & b & ")"
Next
みたいにすればB2〜B9になる
本筋とは関係ないけどIFでA2が""の時A2を返すのってなんか無駄っぽい
0441デフォルトの名無しさん
2014/03/31(月) 01:05:38.55ID:ymkB1Ks5アドバイス頂き有難うございます。
もうひとつ質問させて頂きたいのですが、
Bという位置が不定の位置なので変数で値を決めたいのですが可能でしょうか?
お手数をおかけして申し訳ございません。
0442デフォルトの名無しさん
2014/03/31(月) 01:15:24.40ID:+/Q0rb5y文字列型の変数に入れて
Retsu = "B"
こうする
(略) Formula1:="=IF(A2="""",A2," Retsu & b & ")"
B列以外だとbって変数名は不適切かな
0443デフォルトの名無しさん
2014/03/31(月) 01:22:00.80ID:ymkB1Ks5何度もアドバイス頂き有難うございます。
夜遅いのにご返事有難うございました。
今、エクセルを試す環境がないので明日試してみます。
また、質問があったら相談させて頂きます。
0444デフォルトの名無しさん
2014/03/31(月) 01:55:50.99ID:nFhjZp0H処理に数時間もかかるの?
それなら、変わらない部分をメモ化すれば?
1日に1行ずつ増えるんでしょ?
前日までの行が変わらないなら、
その結果をファイルに書いておけばよい
出来れば、毎回する同じ計算を避ける(メモ化)
0445デフォルトの名無しさん
2014/03/31(月) 15:01:50.77ID:Ial2Eqswいや、そういうことするより、まず何にどれだけ時間がかかってるか計測するのが先。
0446デフォルトの名無しさん
2014/03/31(月) 16:48:16.50ID:3GCmwtHUBMPの画像を作るにはどうしたらいいでしょうか?プログラミングの技術が
ないと不可能でしょうか?
0447デフォルトの名無しさん
2014/03/31(月) 17:05:56.79ID:r3mdI7xZ(それがvbaで出来るかどうかは知らんけど)当然
>プログラミングの技術がないと不可能
じゃないの?
0448デフォルトの名無しさん
2014/03/31(月) 18:23:52.03ID:L50LbWDs自分には敷居が高そうなので諦めます。すみません
0449デフォルトの名無しさん
2014/03/31(月) 18:28:43.68ID:8V+7Or/W0450デフォルトの名無しさん
2014/03/31(月) 18:31:32.29ID:Ial2Eqsw「セルに数字」じゃなくて実際に色を付けて、セルの幅と高さを1:1に保って小さくして、枠線を消して
クリップボードにコピーして、BMPで書き出せば?
0451デフォルトの名無しさん
2014/03/31(月) 20:37:19.25ID:S+MvAbw+あれVBAからつかえんの?
0452デフォルトの名無しさん
2014/04/01(火) 01:26:03.72ID:5tQShRLT上記のような便利機能が他にも紹介されてるサイトってないですか
0453デフォルトの名無しさん
2014/04/02(水) 00:30:48.39ID:+8s/QgvhElseIf (data > 0) Then
ElseIf (data < 0) Then
Else
End If
数値か文字として渡されるdataの判定を上記のようにしたんですけど、
冗長なのでSelect Caseにしたいです。どうしたら良いですか?
0454デフォルトの名無しさん
2014/04/02(水) 00:53:09.51ID:9+cif8YOSgn
0455デフォルトの名無しさん
2014/04/02(水) 01:25:50.89ID:+8s/Qgvhおお、ありがとうございました!
0456デフォルトの名無しさん
2014/04/05(土) 19:04:50.32ID:zCQPlUhYここのセミナーってどうなの?
ステマとかじゃなく純粋に気になった
ttp://sugoikaizen.com/
0457デフォルトの名無しさん
2014/04/05(土) 19:07:13.30ID:Crk62Mwaすごくおすすめだよ
行っておいでw
0458デフォルトの名無しさん
2014/04/05(土) 20:05:46.77ID:eYN2DOjDいる方は、何をお使いになってますか?
VBEで以下の不満があり、関数のアウトライン機能がないこと、列挙体変数をTabで選択せずそのまま入力するとその入力された変数名に変更されてしまうなどがあり、困ってます
0459デフォルトの名無しさん
2014/04/20(日) 20:06:57.56ID:FLwMWrjy「インデックスが有効範囲にありません」というエラーがでてしまって困っています。
Sub チェック()
Const Target As String = "C:\Users\user\Desktop\格納\"
Dim tmp() As String
tmp = Split("Scr14", "Scr16")
For i = 1 To 2
If Dir(Target & tmp(i) & ".txt") <> "" Then '←エラーの出る場所(tmp部分)
Else
MsgBox tmp(i) & vbCrLf & "が存在しません"
End If
Next
MsgBox "確認できました"
End Sub
Dirに配列を使ってチェックするのは無理なのでしょうか?ご教授願います。
0460デフォルトの名無しさん
2014/04/20(日) 20:12:33.50ID:I6Nwishv配列のアクセスに関するエラーだからDirは関係ないかな
Split("Scr14", "Scr16")は、Split("Scr14,Scr16", ",")の間違いだとして、
tmpは
tmp(0) = "Scr14"
tmp(1) = "Scr16"
こうなってる
なんで、ループは0 To 1にしなきゃいけない
0461デフォルトの名無しさん
2014/04/20(日) 20:26:26.65ID:FLwMWrjy回答ありがとうございます。
配列に関しても理解が足りてなかったようです。
単純に文字の配列を作りたいだけなので、
Dim tmp() As String = {"Scr14", "Scr16"}
のようにしたいのですが、 = のところで、コンパイルエラーが出てしまいます。(修正候補:ステートメントの最後)
どのように修正したら良いでしょうか。
0462デフォルトの名無しさん
2014/04/20(日) 20:36:06.91ID:kzevG+UGVBAではVBみたいな書き方はできない
Dim tmp
tmp = Array("Scr14", "Scr16")
0463デフォルトの名無しさん
2014/04/20(日) 20:36:17.19ID:I6NwishvVBAでは変数は宣言時に初期化できないので、これで
Dim tmp(1) As String
tmp(0) = "Scr14"
tmp(1) = "Scr16"
Variantでよければ
Dim tmp
tmp = Array("Scr14", "Scr16")
0465デフォルトの名無しさん
2014/04/23(水) 11:33:23.29ID:/2+x+Vgopowershellで実行したいのは以下のコードです。
$drive = Get-WmiObject -Class Win32_LogicalDisk | where-object {$_.deviceid -eq 'Y:'};$drive.providername
txtファイルに出力してから取り込めばうまくいくことは分かるのですが、できればtxtファイルを経由せず、直接取り込みたいです。
直接取り込む方法があれば、ご教示いただけないでしょうか。
0466デフォルトの名無しさん
2014/04/23(水) 11:50:34.55ID:HGvdUff0のサイトで見ただけなんでそれが出来るのかどうかは知らないけど
結果をクリップボードに送り込めるなら、後はそのデータをapiを使うなりDataObjectオブジェクトを使うなりで
クリップボードから取り出せる
0467デフォルトの名無しさん
2014/04/23(水) 12:31:02.08ID:ZM+hJQprほい
PowerShellの出力をワートシートのA列に取り込むサンプル
' OpenProcess
Declare PtrSafe Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Const SYNCHRONIZE = &H100000
' WaitForSingleObject
Declare PtrSafe Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Const WAIT_OBJECT_0 = &H0
' CloseHandle
Declare PtrSafe Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Sub sample2()
Dim hProcess As Long, lret As Long
lret = Shell("powershell ""Get-WmiObject -Class Win32_LogicalDisk|Clip""", vbHide)
hProcess = OpenProcess(SYNCHRONIZE, 0, lret)
Do Until WaitForSingleObject(hProcess, 100) = WAIT_OBJECT_0
DoEvents
Loop
lret = CloseHandle(hProcess)
Cells(1, 1).Select
ActiveSheet.Paste
End Sub
0468465
2014/04/23(水) 15:48:54.72ID:05nonx0d>>467
返信ありがとうございます。
>>467
試したのですが、ネットワークドライブのリモート名に日本語が含まれている場合は?に化けてしまい、うまく回らない状況です。
(含まれていない場合はうまくいったのですが)
0469デフォルトの名無しさん
2014/04/23(水) 18:28:55.92ID:ZM+hJQprShell("powershell ""$OutputEncoding = [console]::OutputEncoding;ほげほげ
0470465
2014/04/25(金) 00:24:01.06ID:dAeKMCVg返信ありがとうございます。
>>467
Declareのところだけ既に同名の宣言をしてあったのでそれを活かす形式にし(何故かPtrSafeがうまくいかなかった)、
$OutputEncoding =〜も使わせていただいたところ、
今のところ問題なく回っています。
皆さんご協力ありがとうございました。
助かりました。
0471デフォルトの名無しさん
2014/04/25(金) 00:48:38.11ID:97MfQF5yPtrSafeは64bit環境
0472デフォルトの名無しさん
2014/04/25(金) 19:43:27.59ID:IKtZUAxCシート名「uriae」の
F2に入っている関数をF列の下へ向かってオートフィル
で関数をコピーしていくVBAをお願いします。
関数のコピーは、同じシートのA列に文字が入力されているので
A列の文字が入力されている最終行までコピーしたいと思います。
0473デフォルトの名無しさん
2014/04/26(土) 01:31:25.36ID:w0bO41GVここは質問スレであって作ってくれる場所じゃないから
まずは自分でどうやろうとしたかを書いてみればいいと思うんだ
0474デフォルトの名無しさん
2014/04/28(月) 01:08:06.58ID:Z51g+zsH0475デフォルトの名無しさん
2014/05/05(月) 00:35:51.93ID:UkI77+Fd<やりたいこと>
・セルに商品NOを入力して、そのセルがロストフォーカスしたタイミングで、
入力された商品NOで別シートの商品表から、商品名をもってきたい。
<困っていること>
"Worksheet_Change"イベントを使用して、ロストフォーカスのイベントを
拾うことはできたが、ロストフォーカス前に選択されていたセルの内容を
拾えない。
(ActiveCell.Valueで取得しようとしたが、ロストフォーカス後に選択された
セルの内容を取得してしまう。)
もしよい方法があれば、ご教授いただけませんでしょうか。
0476デフォルトの名無しさん
2014/05/05(月) 01:55:30.65ID:uFaF33P2SelectionChangeイベントで、カーソルが動くたびにセルの座標をいちいち独自の履歴に溜めていく
だけど普通は商品NOが確定すると同時にChangeイベントで商品名をセットするもんだよ
ワンテンポ遅らせる理由がわからない
初心者ならなおさらセオリー通りにやった方がいい
さらに言えば、商品名をセットする程度の処理ならVBAを使うまでもなくVLOOKUPとかで可能だし
0477デフォルトの名無しさん
2014/05/05(月) 04:35:04.82ID:UkI77+Fdvlookupなんていう関数あったんですね・・・
これで解決できそうです!
ありがとうございました!
0478デフォルトの名無しさん
2014/05/05(月) 18:42:40.78ID:AK1zskjWSheet1のA列から下へ取得したい先のURLが入力されていて、クエリでデータを取得し、新しいシートA1に貼り付けする。
Sheet1のA列のセルが空白になれば処理を終了する。
VBAでクエリを実行する事が出来る所までは出来たのですが、上記の様にしたいのですが知識が乏しく躓いています。
今、出来ているのは下記になります。
Sub クエリ抽出 ()
With ActiveSheet.QueryTables.Add(Connection:= _
"url;取得データがあるURL", _
Destination:=Range("A1"))
.WebSelectionType = xlSpecifiedTables
.WebFormatting = xlWebFormattingNone
.WebTables = "1"
.Refresh BackgroundQuery:=False
End With
End Sub
宜しくお願いします。
0479デフォルトの名無しさん
2014/05/11(日) 20:01:24.57ID:0QNYDm24参照元のないセルにデータ(数式ではない)を入力したときに循環参照のエラーが出てしまうんだけど、EXCEL 2010にはそういうバグがありますか?
参照先のセルを見てもさっぱり原因がわからなくて困ってます。
周辺のセルはオートフィルで埋めてるので数式は大差ないのに、ある一つのセルだけどうしてもエラーになってしまいます。
0480デフォルトの名無しさん
2014/05/11(日) 20:34:18.27ID:9n+Ded1dExcel総合相談所 113
http://toro.2ch.net/test/read.cgi/bsoft/1398901813/l50
ってのがあるけど
0481デフォルトの名無しさん
2014/05/11(日) 20:39:46.70ID:0QNYDm24ありがとうございます。そちらで質問させていただきます。
0482デフォルトの名無しさん
2014/05/11(日) 21:08:18.06ID:valH51XCフォルダに画像がたくさんあります。
これをWord文書の1ページに1枚貼り付けたいです。
貼り付け方は左上に合わすだけでいいのでたぶんそんなに設定はしなくていいんじゃないかな。
貼り付け方も行内でも四角でもどちらでも変わらないと思うし。
でも今後の発展のため仮に画面の中央のどまんなかにあわせ、挿入方法は「四角」だとどうなるでしょう?
幅・高さは、どちらかが外周に接するところまでひきのばし/縮めるとします。縦横比はオリジナルと同じにして。
ExcelVBAからでもCreateObject("Word.Application")みたい感じでWordを操ることができると思うのでお願いいたします。
0483デフォルトの名無しさん
2014/05/11(日) 21:09:51.81ID:valH51XCExcelのセルにあらかじめ書き込んでるとしましょう。
0484デフォルトの名無しさん
2014/05/12(月) 01:23:50.26ID:DXQGbXMrVBAの講習を受講して思ったが、簡単な実務に生かすために、短時間で習得するための方法。
これあってますか?
★マクロを組んで、マクロで処理できない条件処理の構文を追加することを覚えることが、
一番楽で簡単なエクセル処理には向いてますか?
それとも、すべて手打ちすることを覚えるほうが、かなり有用ですか?
状況
簡単なマクロ等の自動処理がしたい。
スキルは、VBAの勉強は講習で30時間ほど。まったく身につかなかった。
関数等は普通に使える。
0485デフォルトの名無しさん
2014/05/12(月) 11:17:08.22ID:tYXPKjS8実務に活かす事が目的なら今の仕事を自動化するにはどうればいいかを考えれば良いと思う
>すべて手打ちすることを覚えるほうが
ってのが何を言ってるのかわかんないけど。
0486デフォルトの名無しさん
2014/05/12(月) 13:02:48.27ID:OiSoC7y/0487デフォルトの名無しさん
2014/05/12(月) 22:03:47.06ID:1mlAXgHL要は「簡単なマクロ等の〜」簡単がどこまでかでしょう。
最初はきちんと教えてもらった方がいい。
観念的だが、ゼロ→1は難しく1→2は比較来容易
0488デフォルトの名無しさん
2014/05/13(火) 02:43:20.87ID:/l0lTNTz30時間も講習うけてまったく身につかなかった人だぞ
うける講習まちがってるか、絶望的に向いてない人かどっちかだ
0489デフォルトの名無しさん
2014/05/13(火) 11:32:08.29ID:VmzA9yq/マクロの自動記録をして
自動記録では処理が出来ない条件分岐等をVBAで追加するという方法が、
エクセルでの処理の自動化には有効ですか?
それとも、自動記録に頼らず、
全てVBAで記述することを覚えたほうが良いでしょうか?
ということだと思う。
俺なりの回答としては、自動記録を使おうが使うまいが
VBAの基本的な知識はどっちみち必要だし是非覚えるべき。
VBAで出来て自動記録で出来ないことはたくさん有るけど
自動記録で出来てVBAで出来ないことはない。
もちろん、自動記録で出来ることならVBA使わずにやったって構わないし、
自動記録で記録したほうがコード手書きするより早い場合もある。
でも、VBAを知ってないと
やりたい作業を自動記録でやるのとVBAでやるのと
どっちが楽かとか判断できない。
0490デフォルトの名無しさん
2014/05/13(火) 12:55:48.39ID:V6Rb20LOだからマクロの記憶はベースとなるものではなく、Excelオブジェクトの操作方法を調べる時ぐらいしか使わない
0491デフォルトの名無しさん
2014/05/13(火) 16:35:43.02ID:JkOdWH0gRange("D11").Select
Selection.End(xlDown).Columns("H").Select
ActiveCell.FormulaR1C1 = "1"
End Sub
(H列,Dの最終行)に1を入れたいんですが(K列,Dの最終行)になってしまいます。
どうすればいいんでしょうか。
0492デフォルトの名無しさん
2014/05/13(火) 16:49:49.69ID:VmzA9yq/ってところが問題
これだとSelectionが"D11"で、.End(xlDown)がそこからの最終行(つまりD列の最終行)となるんだけど、
次の.Columns("H").Selectはそこを1列目(A列)として右に8列目(H列)
(つまりD列の7列右でK列)を選択している。
解決方法はまぁとりあえず.Columns("E").Select とか .Columns(5).Selectにしたり、
列の指定と行の指定を別々にやったり色々ある
0493デフォルトの名無しさん
2014/05/13(火) 18:00:38.46ID:JkOdWH0g0494デフォルトの名無しさん
2014/05/13(火) 18:51:25.04ID:r+9o8GUq行と列の二次元だけれど、配列は1次元とします。(順番はどうでもいい。セル範囲のセル数が要素数となる。)
0495デフォルトの名無しさん
2014/05/13(火) 18:52:46.12ID:r+9o8GUq0496デフォルトの名無しさん
2014/05/13(火) 19:01:16.72ID:VmzA9yq/列と行を別々に指定する。
つまり、列はH列で決まってるわけだから
Cells(Selection.End(xlDown).Row, "H").Select
とかでいいじゃん。
Selection.End(xlDown).Row
で、Selection(つまり"D11")から下に探した行を取得して、それを指定
列はそのまま"H"でH列を指定
ということ
0497デフォルトの名無しさん
2014/05/13(火) 19:08:16.70ID:JkOdWH0gありがとうございます
0498487
2014/05/13(火) 21:08:23.50ID:wn45zDPAすまん、30分と間違えた
0499デフォルトの名無しさん
2014/05/13(火) 21:32:17.40ID:ph3+WM+5まぁ手書きで
0500デフォルトの名無しさん
2014/05/14(水) 15:02:32.44ID:CuHF+7gT検索してみたら、同じ様な事をしたい人が居たのですが、解決には至っていませんでした。
どうか、宜しくお願いします。
0501デフォルトの名無しさん
2014/05/14(水) 17:08:56.86ID:ZCY9UWx+実行するたびにシートが増えるが、そこはどうにかしろ。
Sub foo()
Dim r As Range
Dim sheet As Worksheet
For Each r In Range("A1").CurrentRegion
Set sheet = Worksheets.Add
クエリ抽出 sheet, r.Value
Next
End Sub
Sub クエリ抽出(ByRef sheet As Worksheet, ByVal url As String)
With sheet.QueryTables.Add(Connection:= _
"url;" & url, _
Destination:=sheet.Range("A1"))
.WebSelectionType = xlSpecifiedTables
.WebFormatting = xlWebFormattingNone
.WebTables = "1"
.Refresh BackgroundQuery:=False
End With
End Sub
0503デフォルトの名無しさん
2014/05/17(土) 08:01:53.07ID:nXU1UeAN普通のはUBoundでいけるけど、2次元だと詰んでる。
0504デフォルトの名無しさん
2014/05/17(土) 08:07:13.92ID:bGHl19aa0505デフォルトの名無しさん
2014/05/17(土) 08:10:05.17ID:q+MS9gLN0506500
2014/05/17(土) 09:11:27.80ID:kSvc6BWF実際に動作を確認しました。
シートが一枚一枚、増えるのはこちらの希望通りで、問題ありません。
期待していた通りになってくれました。大変助かりました。
重々、お礼申し上げます。ありがとうございました。
0507デフォルトの名無しさん
2014/05/17(土) 18:55:01.51ID:nXU1UeAN2次元配列の要素数を動的にして
あとでReDimで変更するにはどうしたらいいですか?
2つのうち両方とも変更したいです。
0508デフォルトの名無しさん
2014/05/17(土) 19:03:56.16ID:q+MS9gLNそんなもん自分でやってみりゃいいじゃん
なんでもかんでも聞くなよ
Sub test()
Dim a()
ReDim a(3, 3)
ReDim a(5, 5)
End Sub
さあ、どうなった?
0509デフォルトの名無しさん
2014/05/17(土) 19:54:30.60ID:nXU1UeANあれ、できるじゃないか。
おかしいな。
2次元動的配列は、最終の2次元目のみ要素数を変更できると書いてあったのに。
0510デフォルトの名無しさん
2014/05/17(土) 19:57:07.95ID:nXU1UeANSub test2()
Dim a() As String
ReDim a(3, 3)
ReDim Preserve a(5, 5)
End Sub
0511デフォルトの名無しさん
2014/05/17(土) 20:48:25.73ID:q+MS9gLNヘルプぐらい読め
ていうかまず一番にヘルプを読め
ヘルプでわからなかったらググれ
それでもわからなかったら人に聞け
0512デフォルトの名無しさん
2014/05/17(土) 21:35:47.99ID:nXU1UeAN詰んでる。
0513デフォルトの名無しさん
2014/05/17(土) 21:43:18.79ID:E1N9nGHaPreserve付きのRedimは次元数は変更できず、最後の次元の要素数のみ変更できる
0514デフォルトの名無しさん
2014/05/17(土) 22:28:57.78ID:q+MS9gLNExcelが入っててヘルプが入ってないわけないだろ
0515デフォルトの名無しさん
2014/05/17(土) 22:40:38.76ID:bGHl19aaRedimステートメント
http://msdn.microsoft.com/ja-jp/library/w8k3cys2.aspx
0516デフォルトの名無しさん
2014/05/17(土) 22:42:59.11ID:bGHl19aa0517デフォルトの名無しさん
2014/05/17(土) 23:06:02.53ID:q+MS9gLNhttp://msdn.microsoft.com/en-us/library/gg251578%28v=office.15%29.aspx
探し方が悪い気もするんだけど、ようわからん
0518デフォルトの名無しさん
2014/05/18(日) 11:25:50.87ID:f0QDfVejわかりやすいと思ってしまう俺はド素人なんだろうな。
0519デフォルトの名無しさん
2014/05/18(日) 11:52:19.34ID:rUx0aG1K想定外の動作をしてバグか仕様か自分の勘違いかわからない時は、結局はmsdnやヘルプを確認するしかない時もある
もちろん公式文書にも間違いはあるので注意が必要だけど、>>510みたいにヘルプにちゃんと書いてあることを
あたかも大発見みたいに書かれると萎える
0520デフォルトの名無しさん
2014/05/18(日) 16:00:29.34ID:1/it3LsY英語力の問題では?
0521デフォルトの名無しさん
2014/05/18(日) 16:47:32.55ID:0bx4PTQ0ヘルプやMSDNがわかりやすいと思ったら、だれもそんな解説書かないだろ
ヘルプみてわけわからんなら解説探せばいいけど、公式情報みるのは最低限必要
0522デフォルトの名無しさん
2014/05/18(日) 21:22:16.26ID:UBuQU1Du0523デフォルトの名無しさん
2014/05/18(日) 22:00:39.47ID:H/JD4vj2人間が訳したのは英語版の重要なところを
こっそりスッ飛ばしてる場合があるから要注意だ。
0524デフォルトの名無しさん
2014/05/21(水) 22:23:52.70ID:BFHFMym8ここに書いて手っ取り早く解答得るのがベスト。
0525デフォルトの名無しさん
2014/05/22(木) 17:38:55.74ID:OR1KcKew0526デフォルトの名無しさん
2014/05/22(木) 18:09:40.63ID:jxaWow300527デフォルトの名無しさん
2014/05/24(土) 10:53:14.15ID:eu02DRrY名前をつけて保存、で複数シートを1つのPDFに保存するコードを書きましたが
なぜか動く動きません。
Sheets(Array("Sheet1", "Sheet2", "Sheet3")).Select
Sheets("Sheet1").Activate
ActiveSheet.ExportAsFixedFormat type:=xlTypePDF,
Filename:= "C:\Sheet123.pdf", Quality:=xlQualityStandard, IncludeDocProperties:=True, _
IgnorePrintAreas:=False, OpenAfterPublish:=True
Arrayで最初に選択したシートのみが出力されてしまいます。
2行目の Sheets("Sheet1").Activate を削除しても結果は変わらずでした。
マクロで記録しても、上記と同様のコードが記録されます。
しかしこの記録されたマクロを実行すると、やはり最初に選択したシートしかPDF出力されません。
何が足りないのでしょうか?
0528527
2014/05/24(土) 10:56:45.70ID:eu02DRrYウィンドウを複数開いてたのが原因でした
0529デフォルトの名無しさん
2014/05/25(日) 22:23:52.52ID:8sEJJ/Xn0530デフォルトの名無しさん
2014/05/25(日) 22:24:17.44ID:8sEJJ/Xn道→未知・・
0531デフォルトの名無しさん
2014/05/26(月) 10:24:59.73ID:xBqIirxp成功はしないけど
0532デフォルトの名無しさん
2014/05/26(月) 12:13:08.87ID:ptXAqcmg後から来る人に追い越される
0533デフォルトの名無しさん
2014/05/26(月) 12:26:24.18ID:dlApJPlMその計算に必要なリソースが確保できるなら可能
0534デフォルトの名無しさん
2014/05/26(月) 15:34:56.33ID:EGdbrytd0535デフォルトの名無しさん
2014/05/26(月) 19:57:34.24ID:dlApJPlM挑戦出来るかどうかと聞いてるから、そこは問題にならない
0536デフォルトの名無しさん
2014/05/26(月) 20:30:26.14ID:9XuuTI4Khttp://it.impressbm.co.jp/articles/-/10453
D-Wave はコンピュータではないらしい。
計算を高速化する独自の数式や手法を発見すれば現在のExcelでも可能?
0537デフォルトの名無しさん
2014/05/26(月) 20:39:03.08ID:JsbqvBWY手に入るだけの台数の高速なPC(数千・数万台とか)とExcelで並列処理させればできるか?
VBAが何所まで並列処理にむいているかはやったことが無いのでわからんが。
0538デフォルトの名無しさん
2014/05/26(月) 20:51:31.05ID:LCv9Wl+AVBA は 64KB 壁があったりして棘の道だと思うが君ならきっとやれる。
0539デフォルトの名無しさん
2014/05/26(月) 23:11:20.50ID:Ed2uGBCoこれってもう古いの?
どこ探してもよくわからない
おすすめの本ってある?
0540デフォルトの名無しさん
2014/05/26(月) 23:43:24.09ID:7NSDbYse質問の意味が良くわからない
何を自動化したいのか
「オートメーション」という言葉を何か勘違いして受け取っているようにも見える
0541デフォルトの名無しさん
2014/05/26(月) 23:47:12.46ID:Js6v2rIN0542デフォルトの名無しさん
2014/05/27(火) 11:36:41.29ID:CQuE4vUSほかのプログラム言語覚えるとなにかいいことありますか?
VBAじゃ出来ないことある?
0543デフォルトの名無しさん
2014/05/27(火) 12:10:21.53ID:pK8lgo+nもちろんVBAにできないことはたくさんあるけど、他の言語にもそれぞれ苦手な分野があるんで
自分のやりたいことがVBAじゃ大変だとわかってから、その作業に最適な言語を探した方が無駄が少ないかもね
0544デフォルトの名無しさん
2014/05/27(火) 12:29:28.96ID:CQuE4vUSそうですかぁ
目的はっきりしないうちに、
ほかの言語覚えるのも大変ですよね・・
VBAの限界がみえるまではVBAだけで行きます!
0545デフォルトの名無しさん
2014/05/27(火) 12:39:03.97ID:JkwAmhtqJAVAとかCとかだと求人が多いけどVBAじゃ求人が少ないから
つぶしが利かない
0546デフォルトの名無しさん
2014/05/27(火) 12:44:54.08ID:CQuE4vUSなるほど、
仕事じゃなく個人で使うだけならVBAで十分かな?
足りなくなったら、DLL?とかほかの言語で作って、
VBAで呼び出せばいいか・・
0547デフォルトの名無しさん
2014/05/27(火) 13:18:47.16ID:1WWRQ+ydグラフとか後でくっつければ良いだけだし
sheet1、使い方の説明とか入力用
sheet2、出力用テンプレート
sheet3以降、出力先
って感じで作れば、使い方とか後で訊かれる事も少ない
インターフェイスの設計とか悩まなくて済むのはメリット
0548539
2014/05/27(火) 21:24:50.12ID:ynAF/lreExcelに数値を入れてCADでそれに沿った図面を作成したいのです。
OLE自体をあまり理解してないのですが、
アプリケーション自体が公開しているメソッド(CADでもソフトによって違う)
を使用するということでしょうか
0549デフォルトの名無しさん
2014/05/28(水) 06:25:58.57ID:am2JQYojOLEオートメーションって言葉は古いな。間違ってはないが
VBAの命令としてはそのCADソフトのオブジェクトを生成するCreatObjectって言う命令だけ
それ以外は普通のEXCEL VBAの入門書でだいたい事足りるかと
あとはそのCADソフト側で用意されてるメソッドなり何なりを操作する
それはそのCADソフト側の問題なんでそっちに聞いてください
0550デフォルトの名無しさん
2014/05/28(水) 09:41:47.76ID:BSb9yGb4VC++だったけど
CAD側の文字コードに注意してやらないと、文字化けとか大変な事になる予感
使い方としては、549の言ってる通りでいけると思うけど、
Excelで数値入れるのが果たして使いやすいかというと、
実はそうでもなかったりしがちになるので、
必要な要件はきっちり洗い出す必要あると思うよ
0551デフォルトの名無しさん
2014/05/28(水) 11:36:19.19ID:tvrcqpPe0552デフォルトの名無しさん
2014/05/28(水) 11:42:23.21ID:mspF09G90553デフォルトの名無しさん
2014/05/28(水) 11:52:24.90ID:tvrcqpPe0554デフォルトの名無しさん
2014/05/28(水) 16:09:51.90ID:PxoSlPb7Application.ScreenUpdating で 抑えられたが
それでもタスクバーがちらついて困っていた。
タスクバーのちらつきは Application.ShowWindowsInTaskbar
で抑えられるのが分かった。
ShowWindowsInTaskbar って昔からありましたっけ?
0555デフォルトの名無しさん
2014/05/28(水) 18:00:58.65ID:pq9FJS3g> ShowWindowsInTaskbar って昔からありましたっけ?
なんでググらないの?
0556デフォルトの名無しさん
2014/05/28(水) 19:31:12.32ID:tvrcqpPeその中にあるセルで
(1) 空白なら除外する
(2) 同じ値があれば1つを残して他は除外する
の操作をしたあと
各セルの値をString型の配列変数として入れたいんです。
そのためにはどういうコードを書けばよいでしょうか?
さあ、書きなさい。
0557デフォルトの名無しさん
2014/05/28(水) 19:51:40.59ID:6RxarYIUVBA以外の言語とデータをやり取りするにはどうすれば良い?
0558デフォルトの名無しさん
2014/05/28(水) 20:35:31.75ID:aALl0WxcVariant型はExcelやVBAだけで使える型じゃなくてWindowsシステム全体で定義されてるんで
たいていの言語でそのまま扱うことができる
0559539
2014/05/28(水) 21:11:33.80ID:tkho5s2n詳しい解答ありがとうございました。
非常に分かりやすかったです。
描くのは直線だけでなるものなので業務の時間を短縮できるのかなと。
あとはCADソフト側の命令の仕方ですね、頑張って探してみます。
ありがとうございました。
0560デフォルトの名無しさん
2014/05/28(水) 23:52:38.39ID:am2JQYojあるセル範囲を選択してて
その中にあるセルで
(1) 空白なら除外する
(2) 同じ値があれば1つを残して他は除外する
の操作をしたあと
各セルの値をString型の配列変数として入れる
こういうコードを書けばよいよ
要件定義が甘いが、どこがわからんかわからん
0561デフォルトの名無しさん
2014/05/29(木) 00:20:40.78ID:pIxlUzsMDictionary使うのはどう?
Existで調べて、無かったらAdd
これを繰り返して最後にString型の配列変数に入れる
0562デフォルトの名無しさん
2014/05/29(木) 00:22:14.59ID:pIxlUzsM× Exist
○ Exists
0563デフォルトの名無しさん
2014/05/29(木) 08:48:17.68ID:/DaeRAwKDoEvents
Sleep (100)
Loop Until flag = True
な無限ループをイベント監視用にユーザーフォームで走らせているんですが,
フォームのタイトルバーを捕まれるとループが止められてしまいます。
ループ用にvbModelessなフォームをHiddenで隠して回しても,
他のフォームのタイトルを捕まれると止まってしまいます。
タイトルを捕まれてもマクロが止まらなくなる方法ってありますか?
0564デフォルトの名無しさん
2014/05/29(木) 12:02:11.02ID:Amp5ddSEありがとうございます。
あなたはこのスレにときどき登場するDistionary厨のかたですね?
これを機会にDisctionaryの使い方を理解してマスターしようと思うのですが
いいサイトか本はないでしょうか?
0565デフォルトの名無しさん
2014/05/29(木) 14:29:26.90ID:sq7Ykhg/残念ながらExcelVBAはマルチスレッドに対応しておりません
というか、止められると言っても、終了してしまうのではなく中断するだけだろ?
タイトルバーを掴んでいる間さえも中断しちゃまずいって、いったい何を監視しているやら?
それに、ユーザーフォームの移動なんて、そう頻繁に行うことでも、長時間行うことでも無いじゃん
それとも、自分が使う物ではなく他人が使う物で、タイトルバーを掴んだままにすることで
意図的に監視を一時停止出来ちゃうと困るとかなのかな?
だとすれば、パス掛けたところで簡単に破れて、ソース弄れば監視の無効化も、もっと簡単に
一時停止できるようにすることも可能なVBAでそういうものを作ること自体が不適切
それに、タートルバーを掴んでいる間、つまりExcelの操作をしていない間も監視が必要って事は、
監視対象はExcel上のものではないんだよね?
だとすると、その辺に別の対処法の突破口があるかもしれないな
0566デフォルトの名無しさん
2014/05/29(木) 15:11:02.01ID:dLhscPPSSleepを消せば少し改善されると思う
空のループはDoEventsだけで十分
0567デフォルトの名無しさん
2014/05/29(木) 15:20:33.17ID:mJj+KV4g0568563
2014/05/29(木) 17:38:29.96ID:/DaeRAwKやりたいことは測定器からのデータ取得(GPIB)で,2秒に一回のイベントを監視する目的です。
具体的には AD変換完了のイベント発生 -> 測定値の取得コマンド発行 -> 測定値の転送
という流れで,イベントが発生したら2秒以内に「取得コマンドの発行->転送」をしないと
データを取りこぼしてしまいます。
そこで,フォーム(中断イベント発生用ボタンを表示)がじゃまだと画面の脇によける動作をすると
ループが止まって取りこぼすので困っておりました。
その後,WindowsAPIのSetTimer/KillTimerを試しまして,今回の目的(2秒)なら
行けそうな感じで収まりました。
>>566
>>567 のとおり,つかんでいる間は帰ってきてくれないようです。
0569デフォルトの名無しさん
2014/05/29(木) 18:03:06.09ID:mJj+KV4gそれで空ループまわして待つ意味がわからんし、時間制限があるのに変換完了イベントから
取得コマンド発行までの間でDoEventsする必要もわからん
0570デフォルトの名無しさん
2014/05/29(木) 19:47:40.83ID:sq7Ykhg/そういうのは普通、測定器→ローカルデータ、ローカルデータ→Excelって二段構えでやるもんだよ
ユーザーフォームのタイトルバーを掴む意外にも、ループが一時停止される要素はあるし
Excelのエラーで強制終了して再立ち上げするにも、2秒以内じゃまず無理なので取りこぼしが出る
だからまずはデータをローカル(HDD)に保存するってことだけに専念したアプリやスクリプトを走らせて
それが保存するローカルデータをExcelで監視するってのが常套手段
それなら、Excelの監視が止まっている間にイベントが2回発生しようと3回発生しようと
HDDにはその2回なり3回分なりのデータが保存されたままになるから、後からいくらでも読み出し可能
0571デフォルトの名無しさん
2014/05/29(木) 19:57:52.53ID:dLhscPPSリアルタイムで処理する必要があるかどうかは知らんが
リアルタイム性が必要なければファイルにCSV保存して、あとから加工なり分析なりすればええ
0572デフォルトの名無しさん
2014/05/29(木) 21:38:45.66ID:pIxlUzsMDictionaryでググレばいいと思うよ
俺もそうした
0573デフォルトの名無しさん
2014/05/29(木) 22:25:02.22ID:MJP51S+khttp://www.moug.net/tech/exvba/0150128.html
お聞きしたいのは、参照不可となった原因です。あと、参照不可となっていたライブラリのチェックを外すことで今後問題が起きないのか?ということです。
ちなみに、開発環境と実行環境は同一のPC1台のみです。よろしくお願いします。
0574563
2014/05/30(金) 08:43:27.05ID:VsNT1DP0イベント=グローバル変数のビットが立つだけでなので,
単純にループを回し続けてグローバル変数を確認し続ける処理となってます。
また,DoEventsは中断/終了処理のためにフォームのボタンを押す必要があるためです。
>>570,571
CSVを吐かせるのが一番容易ではあるんですが,他者がメンテするときに開発環境等
構築の必要がないVBAのみで完結させたいなというのがありまして。
0575デフォルトの名無しさん
2014/05/30(金) 09:28:42.64ID:ztZ/Ok0F悪い事は言わん、計測器関連はVBAでやるの止めとけ
今はVisualStudio Expressもあるし、無料で環境構築できるんだから、
Excel に拘らない方が良い
どっちかつうと、VB側からExcel吐き出しする方が経験上楽で確実
0576デフォルトの名無しさん
2014/05/30(金) 09:34:30.18ID:tZceHJTB0577デフォルトの名無しさん
2014/05/30(金) 10:03:47.61ID:gm611zV10578デフォルトの名無しさん
2014/05/30(金) 15:23:03.23ID:g1Pwsqem>単純にループを回し続けてグローバル変数を確認
グローバル変数セットするときにイベント起こすなり特定プロシジャ呼ぶなりすれば良い話
ループで変数監視とかどう考えても設計がおかしい
>DoEventsは中断/終了処理のために
変換完了イベントから取得コマンド発行までの間は中断できないようにすれば良いだけ
要求される仕様にもよるけど設計がおかしい
0579デフォルトの名無しさん
2014/05/30(金) 15:38:13.41ID:g1Pwsqem>参照不可となった原因
たとえば参照設定されていたプログラムをアンインストールしたら当然参照不可能になるわな
お前のPCに起こった事がそれだけの情報でわかるわけがないだろう
>今後問題が起きないのか
お前のプログラムが何をどうやってたかわからんのに、わかるわけがないだろう
コンパイルしてみてエラーが無いようなら、一応問題が無いと言えるかもしれんが
ライブラリの中身が変わって参照設定が無くなってたりしたら、そのライブラリに
互換性の問題があったりするかもしれん
0580デフォルトの名無しさん
2014/05/30(金) 15:45:03.61ID:9Pr1vy7p「設計が不適切だから、実現が困難になる」
という、初心者がよくハマる罠ですな
0581デフォルトの名無しさん
2014/05/30(金) 16:06:49.06ID:VsNT1DP0テンプレート作っておいて最終的にcom使って吐き出させるのが確実ですかね。
>>577
すみません,私の勘違いでグローバル変数が変わるのではなく,
ループ中で測定器のステータスを読みに行くコマンドを送り,
ADデータが更新されたかのフラグを自分で立てていました。
0582デフォルトの名無しさん
2014/05/30(金) 21:06:21.63ID:uIjyT6t9現在、シート1にデータの羅列を手入力しています
その後、いくらかの計算を経てシート2に転写しています
このとき、シート1は月日関係なく羅列が続いているのですがシート2は月末ごとに集計したいと考えています
↓へ続く
0583デフォルトの名無しさん
2014/05/30(金) 21:07:57.55ID:uIjyT6t9・シート1
1/1 5
1/10 3
1/25 6
1/31 10
2/3 5
2/20 2
3/2 4
シート2
1/1 5
1/10 3
1/25 6
1/31 10
----------
1月最大 10
1月最少 3
1月計 24
----------
2/3 5
2/20 2
----------
2月最大 5
2月最少 2
2月計 7
----------
3/2 4
こんなイメージです、初めは文字通り転写していたのですがそうするとあとから月末の集計を挟むとずれるのでそのあたりヒントをいただけたらと思います
0584デフォルトの名無しさん
2014/05/30(金) 21:20:31.98ID:9Pr1vy7p因みに最大の反対は最小で、最少の反対は最多な
0585デフォルトの名無しさん
2014/05/30(金) 21:36:10.28ID:e0LBlZuD転写元と転写先の行指定を同一にしないでわける。
(Row1行目をRow2行目に転写)
0586デフォルトの名無しさん
2014/05/30(金) 22:04:39.86ID:FUgryqqJ分かり易いコードだったら
シート1の上から月の変わり目まで値をシート2に代入して、
その間最大と最小と月計を求めておいて、それをシート2に書き込んだら
また次の月を処理してやればいいんだけど、
別にそんなことしなくてもピボットで行けるんじゃないかと思う。
0587デフォルトの名無しさん
2014/05/31(土) 01:24:27.59ID:BIC+yzDE全てのデータをコピーする
次にシート2へ、最大値・最小値・合計を、
後ろの行から追加していくと、
行の数え間違いが減りそう
0588デフォルトの名無しさん
2014/05/31(土) 08:16:56.63ID:Ym0wh1saそのままコピーをしても使えません・・・
互換モードで変換しても、上手く起動してくれません。
どうしたらよいでしょうか?
0589デフォルトの名無しさん
2014/05/31(土) 08:31:34.05ID:hcRtMx6V使えないってのどういう状況?
コピーって、何をどうコピーしたんだ?
それは本当に2003で作ったマクロなのか?
情報が足りなすぎて何とも言えん
エスパーするならセキュリティセンターの設定で行ける気がするが
0590デフォルトの名無しさん
2014/05/31(土) 10:11:58.90ID:0hCJmlYVエスパーすると、
信頼できる場所、拡張子(マクロ有効ブック)、参照設定、PtrSafe
あたりかなあ?
0591デフォルトの名無しさん
2014/05/31(土) 17:06:26.42ID:vfwWW6a6エクセルVBAで効果音を鳴らすにはいかにすればよろしいでしょうか?
また、画像を張ったり、消したりするにはどのようなコードを書き込めばいいものでしょうか?
0592デフォルトの名無しさん
2014/05/31(土) 17:57:42.27ID:Ym0wh1sa既にあるマクロに機能追加してもらいたいんだけど、
スキルがなくて困っています。
0593デフォルトの名無しさん
2014/05/31(土) 18:03:54.56ID:MZZ4d7NBhttp://www13.plala.or.jp/kymats/study/multimedia.html
0594デフォルトの名無しさん
2014/05/31(土) 18:15:17.55ID:xW/2bai/いまいち、理解できないっす。
要するにどういうコードを書き込めばよいのでしょうか?
そして音源はどこにあるのでしょうか?
0595デフォルトの名無しさん
2014/05/31(土) 18:24:22.00ID:6LzyMI+6翌日以降に発覚した瑕疵等は別途見積もり・請求させていたたきます
0596デフォルトの名無しさん
2014/05/31(土) 18:42:36.10ID:ROAafTCnマッチングサイトなんてググればヒットするでしょ
0597デフォルトの名無しさん
2014/05/31(土) 20:08:49.36ID:ENgUpqsfググるという発想はないの?
0598デフォルトの名無しさん
2014/06/01(日) 00:30:52.76ID:1fLVc9/2というエラー?が出て、画像が取り込めず、文字列がだーっと出る画面になるのですが
保存された画像を普通に貼り付けるにはどうすればいいのでしょうか
保存の仕方がわるいのでしょうか?
0599デフォルトの名無しさん
2014/06/01(日) 00:44:57.06ID:J9cZPePTその値段では、誰も引き受けてくれんぞ。30万出せば、金に困っている
連中の誰かは、受けてくれるだろうが。
0600デフォルトの名無しさん
2014/06/01(日) 01:56:31.76ID:4/q6rSuq君は諦めた方がいい
0601デフォルトの名無しさん
2014/06/01(日) 10:15:57.44ID:Vdytlm3J相談料 3000円 (120分以内)なら考えてもいい
0602デフォルトの名無しさん
2014/06/01(日) 10:28:28.23ID:mo4nCN9m120分3000円でいいならもうボランティアでやってやれよw
0603デフォルトの名無しさん
2014/06/01(日) 10:39:07.65ID:m+nDoAYHまず最初にここは Excel VBA質問スレ
この時点でアウト
君が相談すべきスレは、ビジネスSOFT板のExcel総合相談所 113
ちなみに注意としてExcelのバージョンとどういう操作をしたのかくらい書けよ
Excel2007(2010)だとして、挿入→図からファイルを選択すれば良いのをなんでテキストファイルウィザードなんてもんが出てくる?
0604デフォルトの名無しさん
2014/06/01(日) 12:52:54.92ID:QlI1F8zeExcel2010で、ゲーム製作をしてましてVBAで画像が自動的に出たり消えたりと言うプログラミングを
設定しているのですが、画像がうまく開かないで苦心しておりました
0605デフォルトの名無しさん
2014/06/01(日) 14:52:48.34ID:ycdnLEoXExcel2003で動いていた、グラフの書式をコピーするVBAを実行すると、
データまでコピーされてしまうようになり、困っています。
ActiveSheet.ChartObjects("グラフ 1").Activate
ActiveChart.ChartArea.Copy
ActiveSheet.ChartObjects("グラフ 2").Activate
ActiveChart.Paste Type:=xlFormats
ヘルプにはxlPasteFormatsを指定とあるので、修正してみたのですが変わりませんでした。
グラフ選択→コピー→グラフ選択→形式を選択して貼り付けの書式を選択で、
シートに対してPasteSpecialを使えば元の動きになることはわかったのですが、
もともと使っていたPasteは使えなくなったのでしょうか?
それとも使い方がわるいのでしょうか?
0606デフォルトの名無しさん
2014/06/01(日) 15:23:51.99ID:WV5hG6M3VBAでくり返し操作するときは自動保存をOFFにしたいのですが
オプション設定はVBAで操作できるのでしょうか?
0607デフォルトの名無しさん
2014/06/01(日) 17:18:12.48ID:XKcLg8fjApplication.AutoRecover.Enabled = False
0609デフォルトの名無しさん
2014/06/02(月) 18:30:40.65ID:YbWwqAFDチャートオブジェクトの横幅と高さをVBAで変更することはできますが、
グラフオブジェクトの中のグラフ表示範囲(?)を変更する方法がわかりません。
ワークシートに複数のグラフがあり、これらのグラフの横幅を揃えたいのです。
チャートオブジェクトの横幅は揃っているのですが、図中に矢印で示すグラフ表示範囲がずれてしまっています。
手動ではなくVBAで自動的に揃え直したいのですが方法がわかりません。
よろしくお願いします。
http://i.imgur.com/fSS5gf9.png
0610デフォルトの名無しさん
2014/06/02(月) 19:36:28.50ID:Qua9WhFMPlotArea.Width
0611609
2014/06/02(月) 22:43:18.89ID:QcqSJ9d9今試せる環境ではないので明日試してみます。
とりあえずググったところ下のように書いてありました。
厳密に複数グラフの横幅を揃えるのは難しそうですね。
http://www.moug.net/tech/acvba/0020000.html
プロットエリアの位置や大きさは、Top/Left/Height/Widthプロパティで設定しますが、
これらのプロパティで設定する領域は、プロットエリアの書式設定の際に参照される領域よりも大きくなります。
差が出るのは、軸/軸の目盛ラベル/データテーブルの領域分です。
これらを除いた領域の位置、及び大きさはInsideTop/InsideLeft/InsideHeight/InsideWidthプロパティで取得できますが、設定は出来ません。
したがって本来の意味でのプロットエリアの大きさを思い通りに設定するのは、非常に困難であると言えます。
0612デフォルトの名無しさん
2014/06/03(火) 14:14:53.77ID:faYSyeIqPowerPoint2013で利用する「数式」をVBAで操作したいのですが、TextFrameのどこを探してもそれらしきオブジェクトが見当たりません。。。
何かご存知の方、いらっしゃいませんか?
0613デフォルトの名無しさん
2014/06/03(火) 14:42:35.82ID:4NU/ReH80614デフォルトの名無しさん
2014/06/03(火) 15:47:32.33ID:ld0ZW2cT佐賀?何故にそんな局地的…
0615デフォルトの名無しさん
2014/06/03(火) 20:10:38.10ID:FR84HiXrPrinter.FontName = "MSゴシック"
Printer.FontName = 12
Printer.Print "hoge"
Printer.EndDoc
と同じ事をやるにはどうしたら良いですか?
シート上に文字を入力して、普通にプリントするのではダメで
プリンターの内蔵キャラセットで印刷を行うために、
プリンターに直接文字データを送りたいのです。
検索しても、VBAでシート上の印刷を行う方法を解説したものは
いくらでもありますが、テキストデータを送る方法は見あたりません
Excelのバージョンは2000と2002です。
0616デフォルトの名無しさん
2014/06/03(火) 21:31:23.24ID:DdzaYAIYLPT1とかPRNとかにPrint#で出力してやればできるかもしれん
しかし、そのコードはプリンタの内蔵キャラセットで印刷する命令でも何でもないんだが
VBAはアプリケーション操作のための言語であって、ハード制御するもんじゃないし
たとえプリンタと言えど直接ハード制御するべきではないと思うが
まずそのプリンタ(のドライバ)作ってるとこに、VBAで出力できないか問い合わせるのが正解だと思うぞ
0617デフォルトの名無しさん
2014/06/03(火) 21:33:31.35ID:4NU/ReH8プリンターポートの設定は適切に済ませてあるとして、こんなコードでプリンタ内蔵フォントで印刷できると思う
うちに環境がないから確認できないけど
Open "LPT1:" For Output As #1
Print #1, "ABC" & vbCrLf
Close #1
0618デフォルトの名無しさん
2014/06/04(水) 22:06:51.01ID:R9ObohXGPGr
0619デフォルトの名無しさん
2014/06/05(木) 11:47:07.26ID:TEbe8oH8セルのプロパティにIsVisibleみたいなのがあればいいのだけども。
0620デフォルトの名無しさん
2014/06/05(木) 12:00:18.15ID:TEbe8oH80621デフォルトの名無しさん
2014/06/05(木) 12:06:29.37ID:o3+drOXqたとえば配列変数hogeの2次元目の要素数を求めるなら
UBound(hoge,2) - LBound(hoge,2) + 1
0622デフォルトの名無しさん
2014/06/05(木) 12:07:37.43ID:TEbe8oH8ありがとうございますできました
0623デフォルトの名無しさん
2014/06/05(木) 12:11:47.42ID:TEbe8oH8もし重複する値があればそれは1つとしてまとめて
同じ配列変数に再代入するにはどうしますか?(当然要素数は重複分減る)
0624デフォルトの名無しさん
2014/06/05(木) 12:19:10.13ID:TEbe8oH80625デフォルトの名無しさん
2014/06/05(木) 13:21:45.18ID:o3+drOXq>>561
0626デフォルトの名無しさん
2014/06/05(木) 13:44:07.06ID:U+cU1pOhExcelのVBAは低機能なので、よく使う機能でも意外と入っていません
文字列の重複は自力で調べて消すしかありません
別の方法として、ワークシートにデータを全部コピーして、Excelの機能で重複を削除してから配列に戻すこともできます
0627デフォルトの名無しさん
2014/06/05(木) 15:13:50.03ID:AERMy3Ek具体的に言いますと、「あいうえお」という5種類の文字で構成される文が数行あるとして
例
あいうえお → あいう
ああいうえお → ああいう
えお
ああいいう
まず 「あ、い、う」 の文字が5個以上ある行は無視。 「あ、い、う」 の文字が一つも無い行も無視。
これで 「あ、い、う」 の数字が1つ以上、4つ以下含まれる行が絞り込まれます。(上二行のみ)
そこから 「あ、い、う」を引き抜く。
こういったことをするには、どのような関数を使えば良いのでしょうか?ご伝授頂けると助かります。
0628デフォルトの名無しさん
2014/06/05(木) 15:30:07.02ID:o3+drOXqそういうときは正規表現というのを使います。
詳しくはこの辺で
http://officetanaka.net/excel/vba/tips/tips38.htm
0629デフォルトの名無しさん
2014/06/05(木) 15:45:00.27ID:AERMy3Ek有難う御座います。
正規表現というのを学習してみたいと思います。
0630デフォルトの名無しさん
2014/06/05(木) 15:58:24.11ID:U+cU1pOhもちろんできます
条件がいくつもあるって複雑な時はユーザー定義関数を使った方がすっきりできます
Option Explicit
Function あいう$(s$)
Dim i%, aiu$, L%, t$
For i = 1 To Len(s)
t = Mid(s, i, 1)
If InStr("あいう", t) Then aiu = aiu + t 'あいうを抽出
Next
L = Len(aiu)
If 1 <= L And L <= 4 Then あいう = aiu '1以上4以下の時だけ
End Function
0631デフォルトの名無しさん
2014/06/05(木) 16:39:59.43ID:I2VjvGe/UNIX系だと、行区切りの文字列では、sort + uniq が定番
uniqは連続した重複行を、1行にまとめる
そのため、最初にsortする
>>627
正規表現なら、[あ|い|う]{1,4}
[あ or い or う]が、1回以上、4回以下
0632デフォルトの名無しさん
2014/06/05(木) 16:54:30.09ID:AERMy3Ek具体的な用例まで助かります。
他にもいくつか加えたい条件もあるので、>>630をヒントと言いますかベースに自分で定義してみたいと思います。
有難う御座いました。
0633デフォルトの名無しさん
2014/06/05(木) 16:58:50.71ID:U+cU1pOhそれだと"あいおいう"に対応できない
俺の解釈では「あいう」は不連続でも個数さえ合っていれば条件に一致する
0634631
2014/06/05(木) 18:16:58.07ID:I2VjvGe/意外に難しいわい。頭を使わせよるw
0635デフォルトの名無しさん
2014/06/06(金) 00:01:51.20ID:Yt2QH+fKCopyとかPasteを使ってると時々「貼り付けられないよ!」ってエラーが出る
このエラーはactiveSheet.Range("A1").Copyとか書いてたら高確率で出るんだけど
WorkSheet("シート1").Range("A1").Copyって感じでシート名をちゃんと指定してやると
うまく処理される
これってOffiiceの仕様か何かなの?
なんかExcel2003だけでなく2010でも似たような現象が出たんだけど
0636デフォルトの名無しさん
2014/06/06(金) 00:37:42.95ID:nBXq1INXコピー時にエラーがでるのか貼り付け時にエラーがでるのか?
ActiveSheet指定したときに、実際は何が対象になってるか確認してみろよ
実際にコピーされているものが何かも確認してみろよ
0637デフォルトの名無しさん
2014/06/06(金) 02:49:29.53ID:ufTytRJwSub test()
Dim obj As Object
Set obj = New clsName
End Sub
こんな感じで変数名とかクラス名を一般化する方法ってありますか?
0638デフォルトの名無しさん
2014/06/06(金) 05:12:25.67ID:Yt2QH+fKごめんそれで合ってる>貼り付け時にエラーがでる
.Copy後に.Pasteをしてやるとエラーが出るんだ
確認したらActiveSheetで指定しているシート名は「シート1」になってた
なぜか「ActiveSheet」と書くとダメで「WorkSheet("シート1")」と書くと
うまくいくんだよな
0639デフォルトの名無しさん
2014/06/06(金) 06:03:40.15ID:2p7Hju+q未確認だけど
.Copy
DoEvents
.Paste
でうまくいく場合もあるっぽいよ
どうもCopyメソッドはシステムに処理を投げたあと、完了する前に次に進むっぽい
だからクリップボードのアクセスがかち合ってPasteで失敗する
0640デフォルトの名無しさん
2014/06/06(金) 10:38:05.93ID:pY4qYt1Mテキストボックスを多数使うので、クラスとコレクションを使って疑似コントロール配列ししようとしたところ
Private WithEvents TextBoxControl As MSForms.TextBox
の宣言では、BeforeUpdateイベントが使えません。
(他にもAfterUpdate、Enter、Exitイベントが、ユーザーフォームモジュールでは使えるのにクラスでは使えない)
この型でユーザーフォームのテキストボックスを代入することは出来ますし、Changeなどのイベントは取れるのですが
クラス内でBeforeUpdateイベントを取得するには、どうすれば良いですか?
0641デフォルトの名無しさん
2014/06/07(土) 03:36:29.21ID:Jb4BFO2Lそんなもんない
0642デフォルトの名無しさん
2014/06/07(土) 05:13:53.67ID:lWh6G2t5リフレクションのことを言ってるのかな。
なら、残念。クラスや変数には存在しないな。
ただ、関数だったらスレチになるけど、API、Addressof、コールバックあたりでググれば
幸せになれるかもしれないしなれないかもしれない。
0643デフォルトの名無しさん
2014/06/07(土) 05:48:21.20ID:iV9P9+UY今は3つですが今後増える可能性があります。
A個の変数を宣言することができるのでしたら汎用性が高まるのですが可能ですか?
(例:A=5ならArray_1、Array_2、Array_3、Array_4、Array_5の5つを宣言する)
今は2次元の配列を3次元にすることも考えたのですが、
今のコードでは、2次元配列はWorksheetFunction.Max(Array_1)のような
配列を処理できる関数に突っ込まれていたりして2次元を3次元にすると色々問題が出てきそうです。
どのように変数を宣言したらよいのかがわかりません。アドバイスをお願いします。
注)今ある3つの2次元配列サイズは(1 to 50, 1 to 50) as Doubleです。今後変数が増えたとしても、各変数は2次元で50×50で同サイズです。
0644デフォルトの名無しさん
2014/06/07(土) 06:21:36.64ID:lWh6G2t52次元の配列宣言をクラスで行うようにして、
そのクラスを生成したものをコレクションなりディクショナリなりに突っ込んで
使えばいいんじゃないかな。
多分、3つどころか1つで済むとおもうよ。
0645643
2014/06/07(土) 06:39:19.09ID:iV9P9+UYレスありがとうございます。ただ、クラスとかコレクションとかディクショナリとか難易度高いです。レスの内容が理解できません。
クラスについては、メソッドやプロパティをオブジェクトに実装させるための設計図?というぐらいの知識しかありませんし、
ディクショナリは重複のない組み合わせを得るのに何度か使ったことあるぐらいです。
クラス内で配列を宣言?クラス内なら変数Aの数だけ配列を宣言できるということ?
プロシージャ内で宣言するのとどう違う??宣言した変数は引数として渡す?それともPublic変数?
わからないことだらけです。調べてみます。
0646デフォルトの名無しさん
2014/06/07(土) 08:02:44.68ID:DbL3YGfr難しく考えず、配列の配列でいいんじゃないか
Variantの配列作ってそれに突っ込め
0647デフォルトの名無しさん
2014/06/07(土) 08:31:36.91ID:lWh6G2t5調べるならVBAよりVBで調べた方が分かるかも。
面倒臭いならいっそのこと、シートを配列に見たてて使ってしまえば?
普段見てるシートも、シートと言うクラスのインスタンスに過ぎないから、考え方は同じだよ。
0648643
2014/06/07(土) 23:06:01.41ID:iV9P9+UYレスありがとうございます。配列の要素に配列を代入できるのですね。知りませんでした。
Dim testArray as Variant
ReDim testArray (1 to intA)
そしてTestArrayの各要素に(1 to 50, 1 to 50)の2次元配列を無事に代入できることを確認しました。
今のコードには、セルに書出すための2次元配列が大量にあり整理できずに困っていましたが、
配列の配列やコレクションを使ってスッキリできそうな気がしてきました。
短期的には配列の配列で解決できそうです。長期的には>>644を理解しつつトライしてみます。
アドバイスありがとうございました。勉強になりました。
それにしても配列操作する際のVariantの万能感は半端ないですね。
0649デフォルトの名無しさん
2014/06/08(日) 01:07:33.31ID:IWDW3tNj0650デフォルトの名無しさん
2014/06/08(日) 01:16:28.64ID:GjVpljzs0651デフォルトの名無しさん
2014/06/08(日) 10:29:13.59ID:SjxXj1KSむしろ Variant の万能感の方が問題かと
0652デフォルトの名無しさん
2014/06/08(日) 11:40:36.05ID:IWDW3tNjたとえば、ワークシートに巨大な表があって、Integer型の配列にFor Nextで1個ずつコピーなら入るのに
Variant配列に一気に読み込もうとするとメモリ不足で無理とか
0653デフォルトの名無しさん
2014/06/08(日) 12:24:09.79ID:SjxXj1KS具体例よろ
32KB/64KB 制限の話じゃないよね
0654デフォルトの名無しさん
2014/06/08(日) 14:01:22.44ID:AzMImLSv0655デフォルトの名無しさん
2014/06/09(月) 08:28:18.70ID:2ZoqHH1sそれは、ホントに読み込みでエラーなのか?
Integerの配列なら割り当てれるがVariantの配列は割り当てられない
っていうなら、メモリ制限の問題で有りうるだろうが
>パソコンにどんだけリソースがあってもVBAの方で利用できるメモリが制限されてるという
これそのものに間違いがなくても、不適切な例をだすと説得力がなくなるぞ
0657デフォルトの名無しさん
2014/06/09(月) 09:44:16.22ID:2ZoqHH1sオブジェクトブラウザで見ると
BeforeUpdateとかはTextBoxで実装されてなさそう
無理なんじゃないかな
0658デフォルトの名無しさん
2014/06/10(火) 01:36:44.07ID:FAZAoJi30659デフォルトの名無しさん
2014/06/10(火) 02:07:04.29ID:hc4LiDN+0660640
2014/06/10(火) 03:57:59.03ID:ZdnvVnA2そうなんですよ
MSForms.TextBoxには、BeforeUpdateが実装されてないんです
しかし、
Dim tb As MSForms.TextBox
Set tb = UserForm1.TextBox1
は通りますが
Dim tb As TextBox
Set tb = UserForm1.TextBox1
は型不一致でエラーになるように、TextBoxと言ってもいろいろあるようで
MSForms.TextBoxは、どうやらワークシート上に配置するコントロールのTextBoxのことで
ユーザーフォーム上のTextBoxを代入してもエラーにこそなりませんが、本来、適した型では無いようなのです
ワークシート用のTextBoxには元からBeforeUpdateが実装されていないので
ワークシート上のTextBoxでBeforeUpdateを取るのが無理なのは解りますが
ユーザーフォーム用のTextBoxには、間違いなくBeforeUpdateが実装されていて、実際に使えているので
ワークシート用のTextBox型ではなく、ユーザーフォーム用のTextBox型で宣言すれば
機能としては間違いなく実装されている以上、BeforeUpdateも取れるのではないかと思うのですが
その正しい型がどれなのかがわかりません
0661デフォルトの名無しさん
2014/06/10(火) 05:54:47.60ID:DoT4XX20とりあえずオブジェクトブラウザの使い方覚えて
標準的な参照設定の範囲ではTextBoxはMSForms.TextBoxしかないと思うけど
ユーザーフォーム用のTextBoxは MSForms.TextBox
オブジェクトブラウザで見る限り、BeforeUpdateはTextBoxに直接定義されていない
TextBox以外の所で定義されています(おそらくMSForms.Controlからの継承)
本来はMSForms.Controlの変数を用意してそれにTextBoxをセットすれば良いのですが
残念なことにControlはイベントソースとしては公開されてないようです(WithEvents付きで宣言できない)
ということでVBAではできません
素直に違う方法を考えましょう
0662デフォルトの名無しさん
2014/06/10(火) 09:29:36.71ID:DruWYpJa問題の発生するコード(サンプル)を貼り付けておきます。実際のコードはこれとは異なります。
このサンプルコードは正常に動作するのですが、"i mod100"を"i mod 10000"に変更すると問題が出てきます(このときcnt=1となります)。
TestArrayという二次元配列が、Transposeした後には一次元配列になってしまっています。
実際のコードではTranspose後の配列の値を読み出すのですが、TestArrayが二次元配列であるという前提で読みだしていますが、
cnt=1のときだけTranspose後のTestArrayが一次元配列になっているためエラーとなります。
cnt=1のときとそれ以外のときで場合分けすれば問題は解決するのですがスマートではないので躊躇しています。
何か美しい解決方法はないものでしょうか?
'**********************************************************
Sub test()
Dim i As Long, cnt As Long, TestArray As Variant
ReDim TestArray(1 To 3, 1 To 200) '余裕を持って200まで準備
For i = 1 To 10000
If i Mod 100 = 0 Then
cnt = cnt + 1 'カウンター(条件を満たした数)
TestArray(1, cnt) = 1: TestArray(2, cnt) = 2: TestArray(3, cnt) = 3
End If
Next i
ReDim Preserve TestArray(1 To 3, 1 To cnt) '不要なところを捨てる
TestArray = WorksheetFunction.Transpose(TestArray)
End Sub
'**********************************************************
0663デフォルトの名無しさん
2014/06/10(火) 20:29:07.13ID:8dL1hbUsWorkbooks.Open Range("A1").Value & ".xls"
If Range("A2").Value > 0 Then Sheets("sheet1").PrintOut Copies:=Range("A2").Value
AAA.xlsを開き、そのA1に書かれてるBBB(という名の).xlsをA2にある数分だけ印刷したいマクロを組みたいのですが、
上記のだとBBB.xlsのA2を参照しようとしてしまいます。
どうすればAAA.xlsファイルのA2を参照できるでしょうか?
0664デフォルトの名無しさん
2014/06/10(火) 21:30:20.37ID:hc4LiDN+枚数 = Range("A2").Value
Workbooks.Open Range("A1").Value & ".xls"
If 枚数 > 0 Then Sheets("sheet1").PrintOut Copies:=枚数
0665デフォルトの名無しさん
2014/06/10(火) 21:40:11.81ID:UIbglvLXよければ>>663がダメで>>664ならいける理由を
説明願いたい
0666デフォルトの名無しさん
2014/06/10(火) 21:43:02.84ID:QPzsyhTi0667デフォルトの名無しさん
2014/06/10(火) 21:45:17.34ID:UIbglvLXなるほど やっと理解できた
0668663
2014/06/11(水) 21:44:28.79ID:FYp71EYH何度も申し訳ないですが
枚数 = Range("A2").Value
If 枚数 > 0 Then Workbooks.Open Range("A1").Value & ".xls"
If 枚数 > 0 Then Sheets("sheet1").PrintOut Copies:=枚数
Ifの条件を
枚数 = 1〜65535(印刷で設定可能な数)
に変えたいです
具体的な書き方を教えていただけないでしょうか
0669デフォルトの名無しさん
2014/06/11(水) 21:58:07.88ID:FYp71EYHこんなで良いのでしょうか
0670デフォルトの名無しさん
2014/06/11(水) 22:11:11.04ID:GbTJWusP0671デフォルトの名無しさん
2014/06/11(水) 22:17:48.49ID:FYp71EYHそんな簡単なのがあったんですね
そっちにします ありがとうございます
0672デフォルトの名無しさん
2014/06/11(水) 22:19:55.78ID:FYp71EYH初めから0より大きいだったんですね
申し訳なかったです
0673デフォルトの名無しさん
2014/06/12(木) 02:42:30.17ID:efyo1JwZファイル2・・・マクロ2
ファイルを単独で開いている時には、マクロ1とマクロ2は正常に動きます。
ファイルを二つ開いた状態では、マクロ1とマクロ2は正常に動きますがマクロが終わるまでに異常に時間がかかります。
マクロ1にもマクロ2にも、ワークブック名を省略した記述があり(worksheets(1).cells(1,1)のように)、これが原因だと思い"thisworkbook."を付加するなどして修正しました。
しかしマクロ終了までに時間がかかるという問題は解決しないままです。
原因として何が考えられますか?
0674デフォルトの名無しさん
2014/06/12(木) 02:53:44.23ID:Ip/6+VhQリソース不足
0675デフォルトの名無しさん
2014/06/12(木) 19:29:45.18ID:JGtl8L6Jhttp://light.dotup.org/uploda/light.dotup.org28231.png
↑
データはこのような画像の通りにシート3つに分かれて存在しています。
どのようなマクロを組めばいいかお教え願いたいです。
ジャンルごとに変数というものを持たないといけないのでしょうか?
実際は母が使うので、ボタン一つで出来るのだとありがたいのですが・・・
大変面倒な質問ですが、お願いします
0676デフォルトの名無しさん
2014/06/12(木) 19:50:40.35ID:JgOg9e9B0677デフォルトの名無しさん
2014/06/12(木) 20:24:31.20ID:JGtl8L6J一度マスターでジャンルを確認しないといけないので、どうすればいいのかわからないのです
マクロでぽんと出来ると嬉しいのですが
0678デフォルトの名無しさん
2014/06/12(木) 20:50:37.37ID:A1ckDykJ左の黄色のデータを上から処理する
処理内容は、辞書を通し番号で索引してvalueの配列を取り出して、合計値に値を合算して、辞書に戻す
最後に辞書の全部のvalueの配列の内容を、右の赤のところに書き出す
0679デフォルトの名無しさん
2014/06/12(木) 20:58:48.89ID:leNeVPHtピボットで一撃で片付きそうな気もするけど、
マクロで組むならその形式であれば、それらのシートをテーブルに見たてて、
SQLを投げて、レコードセットに取得した値を他のシートに展開するのが
ちまちまロジック組むより手っ取り早いかな。
0680デフォルトの名無しさん
2014/06/12(木) 20:59:14.04ID:JGtl8L6J本当に面倒で申し訳ないのですが、そのプログラムを教えてくださいませんでしょうか
辞書を作る以外で方法はないでしょうか
0681デフォルトの名無しさん
2014/06/12(木) 21:01:22.38ID:A1ckDykJ自分でやる気ゼロかw
辞書作らないなら黄色ところに作業列を追加してジャンルを振ってからピボットか何かで集計するとかじゃね
0682デフォルトの名無しさん
2014/06/12(木) 21:19:47.42ID:leNeVPHtいくつかキーワードも挙がったし。
後は自分で調べるか、コード晒してくれる優しい人を待つか。
ただ、この程度のものであれば自分で調べて組んだ方が早いだろうけどね。
0683デフォルトの名無しさん
2014/06/12(木) 21:23:44.62ID:paP2EzQv0684デフォルトの名無しさん
2014/06/12(木) 21:26:40.23ID:leNeVPHtじゃ、出来るあなたがコード晒してあげたら?
0685デフォルトの名無しさん
2014/06/12(木) 21:26:43.13ID:FQgQ1zJaわざわざ手間かけてバグ作りたいようなマゾはコード書かないでくれマジで
0686デフォルトの名無しさん
2014/06/12(木) 21:27:48.55ID:A1ckDykJ0687デフォルトの名無しさん
2014/06/12(木) 21:29:30.29ID:leNeVPHt0688デフォルトの名無しさん
2014/06/12(木) 21:30:43.58ID:paP2EzQv僕は上から目線じゃないからいいんですよ。偉そうに語ってるくせにできないやつが滑稽なんですw
0689デフォルトの名無しさん
2014/06/12(木) 21:31:25.43ID:FQgQ1zJa0690デフォルトの名無しさん
2014/06/12(木) 21:31:59.17ID:leNeVPHtああそう、まあがんばってね
0691デフォルトの名無しさん
2014/06/12(木) 21:32:31.74ID:A1ckDykJ>偉そうに語ってるくせにできないやつ
すげぇ上からじゃん
0692デフォルトの名無しさん
2014/06/12(木) 21:33:12.72ID:JGtl8L6Jプログラミングのこと良く知らないのに軽い気持ちで質問してすみませんでした
0693デフォルトの名無しさん
2014/06/12(木) 21:35:50.99ID:paP2EzQvできないくせに質問者に偉そうな態度とってるやつを嘲笑ってるだけですよw
僕はそうはなりたくないなあ。反面教師にさせていただきますw
0694デフォルトの名無しさん
2014/06/12(木) 21:37:43.46ID:leNeVPHtババアでも40くらいまでで可愛ければコード組んじゃうかもしれない。
意外にストライクゾーン広いんだ。
0695デフォルトの名無しさん
2014/06/12(木) 21:38:15.19ID:paP2EzQv問題ないと思います。質問するのは自由ですし、僕もできれば協力したいですけど、
実力が及ばず…。
0696デフォルトの名無しさん
2014/06/12(木) 21:38:20.26ID:A1ckDykJもうなってるから心配すんな
0697デフォルトの名無しさん
2014/06/12(木) 21:39:25.92ID:JgOg9e9Bお前この程度で本当に出来ない奴いると思うの?自分が出来ないからそんな事言っちゃうんだろ
0698デフォルトの名無しさん
2014/06/12(木) 21:42:27.75ID:paP2EzQvできるんだったらとっくに作ってると思いますけど。
できると口で言うだけなら僕にもできますよw
でもそういう虚勢を張るのって人としてどうかと思うから、正直にできないって僕は言います。
できるんですね?
0699デフォルトの名無しさん
2014/06/12(木) 21:45:29.20ID:FQgQ1zJa0700デフォルトの名無しさん
2014/06/12(木) 21:56:20.85ID:A1ckDykJ後出しで「実際に解決してください」と言われても自分でやれとしか
0701デフォルトの名無しさん
2014/06/12(木) 21:59:13.12ID:JgOg9e9B悪いが煽りは逆効果だ
これで答えたら他の奴がマネするからな
0702デフォルトの名無しさん
2014/06/12(木) 21:59:30.00ID:paP2EzQvあははw
0703デフォルトの名無しさん
2014/06/12(木) 22:01:34.14ID:paP2EzQvできないんですね。それじゃあ僕と同じですねw
正直にできないって言える分僕の方が大人です。
0704デフォルトの名無しさん
2014/06/12(木) 22:10:30.70ID:yqko6NwnB.xlsの値を参照した後B.xlsを閉じる際に
If Workbooks.Count = 2 Then ActiveWorkbook.Close
これで閉じてるのですが、こっちが普通ってやり方ありませんか?
上記のだとすぐ問題が起きそうで
0705デフォルトの名無しさん
2014/06/12(木) 22:12:05.33ID:JGtl8L6Jhttp://light.dotup.org/uploda/light.dotup.org28231.png
↑
データはこのような画像の通りにシート3つに分かれて存在しています。
どのようなマクロを組めばいいかお教え願いたいです。
ジャンルごとに変数というものを持たないといけないのでしょうか?
実際は母が使うので、ボタン一つで出来るのだとありがたいのですが・・・
大変面倒な質問ですが、お願いします
0706デフォルトの名無しさん
2014/06/12(木) 22:14:44.17ID:JGtl8L6Jこれどうやるんですか?実際に教えてください
0707デフォルトの名無しさん
2014/06/12(木) 22:23:06.96ID:FQgQ1zJathrow SQL
} Catch Values as RecordSet {
RecordSet.extract(Other.Shit)
}
0708デフォルトの名無しさん
2014/06/12(木) 22:24:27.04ID:JGtl8L6Jこのスレにまともにコード描ける人が居ないってのは良く分かりました
なんかわざと荒らしをして煽って邪魔する人も居るし
答え出るまでこのスレ居ますね
0709デフォルトの名無しさん
2014/06/12(木) 22:26:34.93ID:JGtl8L6Jそれが普通です
0710デフォルトの名無しさん
2014/06/12(木) 22:26:53.60ID:A1ckDykJB.xlsを開いた直後にset BookB as ActiveWorkbook みたいな感じで
B.xlsを捕捉しておいて処理後にBookBをCloseするか
エクセルの仕様上、同名のファイルは開けないのでB.xlsのファイル名を保持しておいて
処理後に開いてるブックの中からB.xlsを見つけて閉じるか
0711デフォルトの名無しさん
2014/06/12(木) 22:27:54.98ID:A1ckDykJ0712デフォルトの名無しさん
2014/06/12(木) 22:29:02.22ID:JGtl8L6J日別の購入データの通し番号から、マスターを参照してジャンル分けして、ジャンルごとの合計金額を出したいです。
http://light.dotup.org/uploda/light.dotup.org28231.png
↑
データはこのような画像の通りにシート3つに分かれて存在しています。
どのようなマクロを組めばいいかお教え願いたいです。
ジャンルごとに変数というものを持たないといけないのでしょうか?
実際は母が使うので、ボタン一つで出来るのだとありがたいのですが・・・
大変面倒な質問ですが、お願いします
コードを教えてくださいお願いします
正確なコードが出るまで居座ります
嘘の答えも言い続けます
0713デフォルトの名無しさん
2014/06/12(木) 22:33:24.33ID:JgOg9e9Bお前は黙っとけw>>710が普通
0714デフォルトの名無しさん
2014/06/12(木) 22:35:53.98ID:JGtl8L6J私が馬鹿な人間なのは分かっているし、これが自分のためのものなら諦めるけど
本当に困ってるんですお願いです
0715704
2014/06/12(木) 22:49:20.79ID:yqko6Nwn0716デフォルトの名無しさん
2014/06/12(木) 22:50:33.31ID:JGtl8L6J私の質問のコード教えてくれませんかお願いします
本当に困ってるんです助けると思ってお願いします
0717デフォルトの名無しさん
2014/06/12(木) 22:54:21.41ID:FQgQ1zJa0718デフォルトの名無しさん
2014/06/12(木) 22:58:24.36ID:leNeVPHtSub TotalAmount()
Dim dbCon As ADODB.Connection
Dim strsql As String
Dim dbRes As ADODB.Recordset
Dim Col As Long
Dim Row As Long
Set dbCon = New ADODB.Connection
With dbCon
.Provider = "Microsoft.Jet.OLEDB.4.0"
.Properties("Extended Properties") = "Excel 8.0"
.Open ThisWorkbook.FullName
End With
strsql = "SELECT B.ジャンル ,SUM(A.価格) AS 合計金額 FROM [Sheet1$] A INNER JOIN [Sheet2$] B ON A.通し番号 = B.通し番号 GROUP BY B.ジャンル"
Set dbRes = New ADODB.Recordset
dbRes.CursorLocation = adUseClient
dbRes.Open strsql, dbCon, adOpenDynamic, adLockOptimistic, adCmdText
つづく
0719デフォルトの名無しさん
2014/06/12(木) 23:00:50.52ID:leNeVPHtWith Worksheets("sheet3")
.Cells.ClearContents
For Col = 1 To dbRes.Fields.Count
.Cells(1, Col).Value = dbRes.Fields(Col - 1).Name
Next Col
Row = 1
Do Until dbRes.EOF
Row = Row + 1
For Col = 1 To dbRes.Fields.Count
.Cells(Row, Col).Value = dbRes.Fields(Col - 1).Value
Next Col
dbRes.MoveNext
Loop
End With
dbRes.Close: Set dbRes = Nothing
dbCon.Close: Set dbCon = Nothing
End Sub
こんな感じ。
シート1,2に設定しとけばシート3に書き出すよ。
ただし、Microsoft ActiveX Data Objects 2.8 Libraryの参照設定をきっとくこと。
0720デフォルトの名無しさん
2014/06/12(木) 23:02:10.06ID:JgOg9e9BVLOOKUPとSUMIFで出来るからまじで
1.ジャンル分けしたいデータ4列目にジャンル列追加
2.ジャンル列にVLOOKUPでジャンルを設定
3.合計金額列にSUMIFでジャンル毎の集計値を設定
0721デフォルトの名無しさん
2014/06/12(木) 23:07:09.27ID:JGtl8L6Jユーザー定義型は定義されていませんってでます
> Microsoft ActiveX Data Objects 2.8 Libraryの参照設定をきっとくこと
これはどうしたらできます?
調べても出てきません
だまされてますか?
0722デフォルトの名無しさん
2014/06/12(木) 23:10:35.81ID:leNeVPHtおんぶにだっこだなぁ。
VBEでツール→参照設定でそれを選んでOK押せば参照してくれるから。
0723デフォルトの名無しさん
2014/06/12(木) 23:13:09.28ID:JGtl8L6Jそれにはチェック入ってませんでした
調べたらDAOなんたらってのにチェック入れたらいけるって書いてましたが
チェックいれたらDLLエラーってでました。
もっと簡単に出来る方法ないんでしょうか
もうしにたくなってきました
0724デフォルトの名無しさん
2014/06/12(木) 23:19:00.19ID:leNeVPHtいやだからチェック入れないと。
今回使っているのはDAOじゃなくてADOだから。
0725デフォルトの名無しさん
2014/06/12(木) 23:32:14.62ID:leNeVPHtとりあえずID:paP2EzQvは死んでくれないかな。
0726デフォルトの名無しさん
2014/06/12(木) 23:57:38.17ID:DSeU12c2A.xlsにあるマクロでB.xlsを開くんだったら
開いてからアクティブなブックをオブジェクト変数にセットするより
開くときにオブジェクト変数に直接突っ込んだ方が早くない?
Dim bookB As Workbook
Set bookB = Workbooks.Open(B.xls)
とかやっとけばいっぺんで終わる
0727デフォルトの名無しさん
2014/06/13(金) 00:05:35.25ID:3uExzG0Vうん。そう出来るんなら
外部からアクティブなブック変えられても安全だね。
0728デフォルトの名無しさん
2014/06/13(金) 01:02:52.06ID:mgi5uvuRたいていその時は他のいくつかのマクロにまで同様の被害を出し、困っています。
今のところは、作業ブックとマクロブックは必ず分けて、さらにメモ帳でマクロのプログラムを保存しておいて、もし壊れたらマクロブックは捨てて新しく作り直して対処しています。
ただ、作業ブックで直接マクロを呼び出せれば非常に便利なのでそれを検討しています。
質問は二つです
1)壊れる理由はなんなのでしょうか?
2)普通の作業ブックにマクロを用意すると、上記のように壊れたとき作業ブックごと壊れそうで怖いです。
壊れると思うとためらってしまいます。何か良い対処法はありませんか?
0729デフォルトの名無しさん
2014/06/13(金) 02:05:30.86ID:/KfsTB1Cマクロが壊れるってどういうこと?VBAのソースが書き換わってるの?
別のパソコンでは試した?
0730デフォルトの名無しさん
2014/06/13(金) 02:25:20.51ID:QETwEf+A自分自身マクロが壊れた経験は無いし、知人からも聞いたこと無いけど、
そういう理由ではなくマクロのブックとデータのブックは大抵別にしてるよ。
俺の仕事だと大抵の場合年度ごとにデータは変わるから、
マクロ入りのブックを毎年更新するのは面倒くさい。
マクロを別にしとけばデータブックだけ変えて作業できる。
もちろん、年度の指定はマクロで出来るように作ってある。
まぁ、一回コッキリの作業だったら
マクロ入りのブックにデータも入れ込むのもアリだと思うけど、
そうでなければ別体にしといたほうが作業性は上がるよ。
0731673
2014/06/13(金) 02:25:26.50ID:C2eUWGFh確かに開いているファイルのサイズは小さくないし(ファイル1が8Mバイト、ファイル2が44Mバイト)、
PCもそれほど速いわけでもないけど、やっぱリソース不足なんかな。
Variant型のグローバル変数を使ってるとかも関係しているんだろうか?
リソース不足以外に、ファイルを複数開いている時にマクロが遅い原因はありますか?
0732デフォルトの名無しさん
2014/06/13(金) 04:55:30.41ID:hNNRznvy間違ったデータを処理しているのかも?
0除算、オーバーフロー、型変換の失敗など
またエラーが出たときに、すべてのデータを破棄せず、
中途半端な状態で、ファイルなどに書き込むと、
次回そのファイルを読み込んだら、またエラーが起こる
ログファイルを作って、すべてのデータのIn/Out、
つまり、データを読み込んだ所と、演算後を記録して、
エラーが起こる瞬間をとらえる
0733デフォルトの名無しさん
2014/06/13(金) 07:26:02.30ID:kHczDXdC動作が停止するのでどうなっているかはわかりません
うちの周りではわりとよくあることのようですし、私自身1年で2回壊れています
別のpcでは試していません。windows7,8、office2010で起こります
>>730
別にしておくのは良いことも多いですがボタンのようなものがあればなおいいなとおもいまして。
>>732
後だしで申し訳ないのですが、やらせているのはファイルを開く閉じるコピーペーストのみですので計算をやらせたりはしていません
0734デフォルトの名無しさん
2014/06/13(金) 08:17:22.92ID:LRXbjNk50735デフォルトの名無しさん
2014/06/13(金) 20:38:36.57ID:3uExzG0V以前ファイルサーバーでフォルダ階層深いところに、
EXCELのファイル置いて開いたら壊れることがよくあったよ。
なんかVBエディタでオブジェクトブラウザで見ると、シートの部分が青くなったりしてた。
0736デフォルトの名無しさん
2014/06/14(土) 14:18:26.82ID:Je/qq0DA俺の体感では
システム側の問題でマクロ付きのエクセルファイルが壊れるのは、それ以外のファイルが壊れるのと差はない
マクロでおかしなことやってるか、マクロ関係なくファイル壊れるような環境かのどっちかが疑わしい
>>731
リソースの競合
>>735
パス長の問題で読み書きできないんじゃないのか?
0737デフォルトの名無しさん
2014/06/14(土) 15:36:29.51ID:UnUM1hDEこちらで質問したのですが、
こちらのスレのほうがよかったのですかね?
708です
0738デフォルトの名無しさん
2014/06/14(土) 21:48:17.67ID:ez0d87W9> マクロでおかしなことやってるか、マクロ関係なくファイル壊れるような環境かのどっちかが疑わしい
まじにこんな事言う人始めて見たw
0739デフォルトの名無しさん
2014/06/15(日) 09:58:44.35ID:2EJJf8nrB列に値が入っていない所から同じ処理をさせるようにするにはどうすればよいのでしょうか?
For wRow = 1 To Range("A" & Rows.Count).End(xlUp).Row
・・・
・・
・
Next
A B
1 x x
2 x x
3 x x
4 x ←この列から処理を始めたい
5 x
0740デフォルトの名無しさん
2014/06/15(日) 10:14:00.30ID:QD8jtgNHDim FirstB As Long
FirstB = Range("B1").End(xlDown).Offset(1).Row
For wRow = FirstB …
0741デフォルトの名無しさん
2014/06/15(日) 11:40:26.86ID:2EJJf8nr早々のレスありがとうございます。
上手くいきました!作業効率があがり助かりました!
0742デフォルトの名無しさん
2014/06/15(日) 21:21:01.30ID:2EJJf8nr度々すみません
この処理を仮に6行目からスタートさせるにはどうすればいいのですか?
0743デフォルトの名無しさん
2014/06/15(日) 21:24:01.33ID:QD8jtgNHB1をB6に変えればいいよ。
0744デフォルトの名無しさん
2014/06/15(日) 22:09:31.20ID:2EJJf8nrありがとうございます。初歩的な質問ですみませんでした
0745デフォルトの名無しさん
2014/06/17(火) 03:05:20.46ID:1LOl6xrI候補に出てきません。エクセル2002の仕様ですか?
0746デフォルトの名無しさん
2014/06/17(火) 03:10:24.91ID:1LOl6xrI[_END]の[]で括るのは、どういう意味ですか?
Enum Area
West = 0
East
[_END] = -1
End Enum
0747デフォルトの名無しさん
2014/06/17(火) 03:59:06.43ID:jPdOoXg3セル範囲の名前の定義
0748デフォルトの名無しさん
2014/06/17(火) 10:25:10.56ID:X2vvvV0A0749デフォルトの名無しさん
2014/06/17(火) 10:25:54.01ID:X2vvvV0A0750デフォルトの名無しさん
2014/06/17(火) 10:26:46.03ID:X2vvvV0A0751デフォルトの名無しさん
2014/06/17(火) 10:36:51.26ID:l2MahTzn通常指定できない変数名を使うときに[]でくくると言うVBAのルール
ExcelVBAとして>>747の使い方する時もあるけど、>>746のはそれじゃない
ちなみに_で始めた列挙名は非表示メンバになって、通常の入力補助とかに出てこない
オブジェクトブラウザで 非表示のメンバを表示 にして確認できる
0752デフォルトの名無しさん
2014/06/17(火) 10:41:48.38ID:Yj2sqA8/クラス名そのものではなく
クラス名を型として宣言した変数の後にドットを入力しましょう
それでもダメなら、どこかにコンパイルエラーがあると思うので
メニューの デバッグ > VBAProjectのコンパイル で確認しましょう
>>747
コードエリアで使う場合と、宣言エリアの列挙型で使う場合とでは意味が違うよ
>>746
列挙型では、_ で始まる名前を [ ] で囲むと、入力候補に表示されないメンバを定義できる
これは、_で始まるメンバは非表示メンバになるのと、[ ] で囲むと通常使えない名前を定義できるのとの合わせ技です
>>748
オブジェクト変数をオブジェクト変数に代入するとエラーになります
オブジェクト変数をオブジェクト変数に参照代入すると、参照代入先のオブジェクト変数でも
元のオブジェクト変数が参照しているオブジェクトを参照できるようになります
>>749
可変要素数の配列変数への代入では、元の配列変数のコピーが作成されます
固定要素数の配列変数への代入では、要素数が同じでもエラーになります
0753デフォルトの名無しさん
2014/06/17(火) 12:09:43.40ID:l2MahTznコードエリアとか宣言エリアとか
参照代入とか
微妙な俺様用語使うのやめれ
0755デフォルトの名無しさん
2014/06/17(火) 17:05:41.46ID:HVt3rccc0756デフォルトの名無しさん
2014/06/17(火) 18:58:25.63ID:Oy7I6t4Iこんな方法はどうだろうか?
3x1 の配列でTranspos問題でるなら
ReDim Preserve TestArray(1 To 3, 1 To cnt + 1)
として 3x(cnt+1) の配列でReDimして Transposする
んで読み込む時は 配列の1次元目の最終データ
つまり
TestArray(cnt+1, 1)
TestArray(cnt+1, 2)
TestArray(cnt+1, 3)
は無効データとして無視する
0757デフォルトの名無しさん
2014/06/17(火) 21:32:49.72ID:l2MahTznTransposeの仕様っぽいから、1次元の配列になるのはどうしようもないんじゃない
そもそもWorksheetFunction.Transpose使う必然性がわからん
俺なら配列そのもの変換せずに、読む方で行列入れ替えて読むが
どうしても配列変換したければ自分で配列変換する関数作る
0758デフォルトの名無しさん
2014/06/17(火) 23:57:50.59ID:SruwTgIk勝手にスクロールロックされるという怪現象に長年悩まされてます
これまでは発生頻度が低いから気にしてなかったのですが、
最近バーコードリーダーを接続したPCで頻繁に発生するようになりました
あまりにうざいので、VBAで対抗しようと考えて
まずは Call Application.OnKey("{SCROLLLOCK}", "") としてみたのですがダメでした
何か良い方法ないでしょうか
SCROLLLOCKのON/OFFを判定して、
ONならOFFにする方法なんて無いでしょうか
0759デフォルトの名無しさん
2014/06/18(水) 00:03:23.37ID:EzL2wKEq0760デフォルトの名無しさん
2014/06/18(水) 00:05:05.34ID:0b/GVhNiどうもありがとうございました!
0761デフォルトの名無しさん
2014/06/18(水) 00:47:57.54ID:+FU8wlvZ「勝手にスクロールロック」でぐぐったらこんなん出た。
マウスのチルトホイールが悪さしてたらしい。
http://orbit.cocolog-nifty.com/supportdiary/2009/08/post-2f3e.html
0762662
2014/06/18(水) 07:46:00.29ID:SiDz/mVATransposeの仕様であるなら仕方ないですね。
今はcnt=1かどうかの場合分けで対応しています。
>>756
提案ありがとうございます。なるほど、そのようにしてTransposeで1次元となることを避けることができるのですね。
参考になります。この方法ならコードの修正部分も少なさそうです。
>>757
仰るようにTransposeを使う必然性はありません。
今の知識がありゼロから作り始めるならTransposeは使わずに作ると思います。
昔の名残を活用するために必然性のないTransposeを使う羽目になってしまいました。
時間ができたら全部書き直したい気持ちはあるのですが。。。
0763デフォルトの名無しさん
2014/06/18(水) 08:21:57.79ID:ahd+98VX0764デフォルトの名無しさん
2014/06/18(水) 10:15:27.45ID:fAjoLlg4>>761
PCもキーボードもマウス何回か換えてるし
EXCELも2000から2013にかけて何回か乗り換えてるから
違う原因と思うんですが
0765761
2014/06/18(水) 10:36:30.12ID:+FU8wlvZんじゃこっちはどう?
http://blog.livedoor.jp/sigh_too/archives/51273110.html
ctrl + c と間違えて Fn + c を押しちゃってた人の話
0766デフォルトの名無しさん
2014/06/18(水) 10:39:53.19ID:+FU8wlvZFn + K とかの場合もあるって事で機種によって違うみたいね。
0767デフォルトの名無しさん
2014/06/18(水) 12:31:44.62ID:k5Dh+D1Tここでもそんな相談は見たことないし、検索でもほとんど出てこないので、
何か特別なソフトが原因じゃないのかなあ
一般人が使わないようなアプリが入っているとか、変なマクロが走っているとか
そのパソコンはあなた専用?それとも共用?
0768デフォルトの名無しさん
2014/06/18(水) 12:35:01.13ID:k5Dh+D1Tいつもまったく気付かない?
一度でもスクロールロックされる瞬間を目撃したことはある?
その時、パソコンは使用中か放置中だったか
0769デフォルトの名無しさん
2014/06/18(水) 17:42:06.75ID:fAjoLlg4http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13105571298
http://okwave.jp/qa/q6865033.html
すばやく連続入力して一呼吸おいた後に、次の入力を始めようとして
あれ?と気付くことが多いような気がします
入力中に突然ロックされたことはないと思います
PCは基本的に自分専用です。
発生頻度は1〜2ヶ月に1回くらいでしょうか
バーコードリーダーの場合は接続して間もないですが、
1日に1〜2回は出ていそうです。
PS2接続です。
0770デフォルトの名無しさん
2014/06/18(水) 19:27:12.46ID:x3SERBGR金額計算なんですが、例えばM列に1を入れるとK+Lの合計を0.5倍にして(何も入れないとK+Lの合計)N列に表示するっていう文を作りたいんですが、色々調べてもわかりません
よろしければ教えて下さい!
0771デフォルトの名無しさん
2014/06/18(水) 19:46:58.78ID:EzL2wKEqDim i As Integer
Dim lastrow As Integer
For i = 1 To lastrow
If Cells(i, 13).Value = 1 Then
Cells(i, 14) = (Cells(i, 11) + Cells(i, 12)) * 0.5
Else
Cells(i, 14) = Cells(i, 11) + Cells(i, 12)
End If
Next
0772デフォルトの名無しさん
2014/06/18(水) 19:48:50.42ID:/mM+tAme重複するものは代表1つだけにして
その要素数の数だけ文字列型の配列変数を返り値とする関数を作りたいです。
コードをお願いします。
0773デフォルトの名無しさん
2014/06/18(水) 20:01:04.29ID:ZRwyQinVSelection.Uniquify
0774デフォルトの名無しさん
2014/06/18(水) 20:38:45.97ID:/mM+tAmeこら。そんなのないぞ。
0775デフォルトの名無しさん
2014/06/18(水) 21:22:12.13ID:+FU8wlvZ同じ質問を繰り返している人がいるように思えるのは俺だけ?
Dictionaryとか自前で配列変数作るとかやりようはそれなりにあると思うけど。
0776デフォルトの名無しさん
2014/06/18(水) 23:31:09.78ID:IQKBzqn40777デフォルトの名無しさん
2014/06/19(木) 06:51:10.55ID:Wcq0Jv47へい。
https://friendpaste.com/7AESsKfoWV1tNVQmlhrMgY
0778デフォルトの名無しさん
2014/06/19(木) 07:19:42.28ID:NPfluINM「関数が必要」とか「作って欲しい」って書け
0779デフォルトの名無しさん
2014/06/19(木) 11:17:24.00ID:Oioydr8fこら、VBAで使えないぞ。
本当にVBAの言語用なのか?
0780デフォルトの名無しさん
2014/06/19(木) 11:33:56.90ID:YZPnLqDa停止もエラーも何もなく、ただ無反応
0781デフォルトの名無しさん
2014/06/19(木) 11:39:54.47ID:w+8gDH2bこれはすごい恩知らずwww
間違いなくVBAで使えるぞ。
0782デフォルトの名無しさん
2014/06/19(木) 11:52:02.14ID:w+8gDH2bコードが書いてないからそれだけではなんとも分からないですよ。
あと、使ってるエクセルとOSのバージョンも書いてないし。
とりあえずステップインで実行してみてはどうですか?
0783デフォルトの名無しさん
2014/06/19(木) 11:55:45.95ID:Oioydr8fこら、ウソ言うな。
選択してMainを実行したら「インデックスが有効範囲にないぞ」というエラーが出る。
0784デフォルトの名無しさん
2014/06/19(木) 12:09:33.27ID:w+8gDH2bためしに縦一列に文字だけ(数字は無視される)入れて、
その範囲を選択した状態でマクロ実行してみろよ
0785デフォルトの名無しさん
2014/06/19(木) 12:13:22.03ID:w+8gDH2bちょこっと手直しすると範囲が縦一列じゃなくて
数字も無視しないようになるけど
777さんに対してあまりにも無礼だからこれ以上は教えてやらない。
0786デフォルトの名無しさん
2014/06/19(木) 13:25:10.11ID:Oioydr8fそんなバグだらけじゃ使い物にならないじゃないか。
糞ボロ。ポンコツ。
0787デフォルトの名無しさん
2014/06/19(木) 14:00:13.35ID:w+8gDH2bだからあれはバグじゃなくて仕様
0788デフォルトの名無しさん
2014/06/19(木) 14:00:36.50ID:8jNSzAvz解散
0789デフォルトの名無しさん
2014/06/19(木) 14:26:30.45ID:z2Nts7ioすみませんなぜか再起動したら解決しました
0790デフォルトの名無しさん
2014/06/19(木) 21:26:30.92ID:B42MAC9KSub Test()
On Error Go To ErrorHandler
If hogeError Than
call EndProc
End If
call EndProc
ErrorHandler:
call EndProc
End Sub
Private Sub EndProc()
'インスタンスの破棄とかScreenUpdating =Trueとか
'プログラムの終了
End
End Sub
msdnとかだとEndステートメントはすぐに停止させる時だけ使えとかって書いてあるんだけど、この関数呼べば必ず綺麗に後処理できるから便利〜
と思ってたんだけどやっぱりダメなんすかね?
0791デフォルトの名無しさん
2014/06/19(木) 21:49:00.62ID:zV78lioGEnd使うとUnloadなしでフォームが閉じたりするから、綺麗に後処理できない
だから使うなって言われてる
0792デフォルトの名無しさん
2014/06/19(木) 22:42:28.51ID:B42MAC9Kあ〜なるほど、そっかformのイベントエラーとかでEnd飛ばしちゃうとUnloadとかされないのか
やっぱりエラーは個別にやんなきゃダメっすね、ありがとうございました。
0793デフォルトの名無しさん
2014/06/20(金) 19:07:25.47ID:zU8FIBtEそのメッセージはユーザがコピペできるようにしたいんです。
一番てっとり早い方法はなんでしょう?
0794デフォルトの名無しさん
2014/06/20(金) 19:42:55.71ID:qdXxhrxPメッセージボックスって普通コピー出来るんだが、VBAのはダメなんだっけ?
0795デフォルトの名無しさん
2014/06/20(金) 19:46:15.80ID:zU8FIBtEできないんですよ。
0796デフォルトの名無しさん
2014/06/20(金) 19:47:17.20ID:zU8FIBtE普通コピーできるって、その普通とはどういう環境?
0797デフォルトの名無しさん
2014/06/20(金) 19:49:02.65ID:zU8FIBtE無理やりオボったらちゃんとコピペできてた。
0798デフォルトの名無しさん
2014/06/20(金) 19:50:50.72ID:y3Z+Q6P/0799デフォルトの名無しさん
2014/06/20(金) 19:53:22.06ID:zU8FIBtE0800デフォルトの名無しさん
2014/06/20(金) 19:54:23.75ID:zU8FIBtE0801デフォルトの名無しさん
2014/06/20(金) 20:02:43.06ID:qdXxhrxP0802デフォルトの名無しさん
2014/06/20(金) 20:11:28.85ID:zU8FIBtEそもそもインプットボックスって名のとおりアウトプットじゃないじゃないですか?
だからインプットボックスについてるボタンなどをすべて無効化したい。
0803デフォルトの名無しさん
2014/06/20(金) 20:22:09.60ID:ZokJyX4+0804デフォルトの名無しさん
2014/06/20(金) 20:28:58.52ID:qdXxhrxPこれ以外認めないんだろ?最初からそう聞けばいいのに
0805デフォルトの名無しさん
2014/06/20(金) 22:47:42.81ID:q4j+Bx57全てのボタンを無効化したら閉じることも出来ないじゃん
0806デフォルトの名無しさん
2014/06/20(金) 23:29:37.04ID:NSJkRCsBそんな凝り固まった常識をぶち壊していきたい
0807デフォルトの名無しさん
2014/06/21(土) 00:14:38.91ID:mfmIX+n9編集禁止でも選択とコピーは可能だから
テキストボックスの背景をグレーするとかでMsgBoxと区別つかんようにできるし
0808デフォルトの名無しさん
2014/06/21(土) 00:18:27.48ID:JKn6FGb9下記のコードを使うと置換のタブが開かれた状態で表示されるので、
検索タブが開かれる状態でコードを登録する方法を教えて下さい。
CommandBars.FindControl(ID:=313).Execute
0809デフォルトの名無しさん
2014/06/21(土) 01:00:45.34ID:cHoAUDWh2013の資料が手元にないけど、2007なら
Application.CommandBars.FindControl(ID:=1849).Execute
0810デフォルトの名無しさん
2014/06/21(土) 01:04:01.23ID:mfmIX+n9ちょっと違うけど一応検索
Application.Dialogs(xlDialogFormulaFind).Show
ワークシートがアクティブになってれば
SendKeys("^F")
0811デフォルトの名無しさん
2014/06/21(土) 13:03:36.05ID:BHEAfygD2013でも使えました。ありがとうございます。
0812デフォルトの名無しさん
2014/06/21(土) 13:05:15.05ID:BHEAfygDこんな検索もあるんですね。参考になりました。有難うございます。
0813デフォルトの名無しさん
2014/06/21(土) 14:15:51.51ID:62Gltl9i758です。色々ぐぐって自己解決できたのでコード載せときます
オフにするところの2行の意味がよく分かりませんが
希望の動作ができたから良しとします
Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
Private Declare Function GetKeyboardState Lib "user32" (pbKeyState As Byte) As Long
Private Sub Worksheet_Change(ByVal Target As Range)
Const VK_SCROLL = &H91
Const KEYEVENTF_EXTENDEDKEY = &H1
Const KEYEVENTF_KEYUP = &H2
Dim LockState As Boolean
Dim keys(0 To 255) As Byte
GetKeyboardState keys(0)
LockState = keys(VK_SCROLL)
'オンであれば強制的にオフ
If LockState = True Then
keybd_event VK_SCROLL, &H45, KEYEVENTF_EXTENDEDKEY Or 0, 0
keybd_event VK_SCROLL, &H45, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0
End If
End Sub
0814デフォルトの名無しさん
2014/06/21(土) 15:51:17.12ID:MWnqmoLJはいやいいえになってると、Enter連打であっさりスルーされちゃうので
ぐぐっても「いいえ」に合わせるコードはでてきでも、
フォーカス無しのコードは出てこないし
msgbox("上書きしますか?",vbDefaultButton2+vbYesNo)
上のじゃないけど、ユーザーフォーム使うしかないんでしょうか?
0815デフォルトの名無しさん
2014/06/21(土) 17:20:31.07ID:4JtY8OkT0816デフォルトの名無しさん
2014/06/21(土) 18:03:25.68ID:Qjh9DMWWそりゃ当然だろ?
融通は利かないが、良く使われる用途なら簡素化できるってのが
MsgBoxを初めとする組込ダイアログなわけで
その仕様を外れたら自作になるのは、プログラムとしては当然のこと
MsgBoxではアレが出来ないコレが出来ないではなく、
本来なら全て自前でフォーム作らなければならないメッセージダイアログに置いて
特定の制限内の機能で事足りる場合はMsgBox関数で楽できるって考えるべき
つまりメッセージダイアログは、MsgBox基準ではなく自作基準で考えよう
0817デフォルトの名無しさん
2014/06/21(土) 22:22:34.80ID:A7b0CBz5おれスルーしたい時はESCだわ
0818デフォルトの名無しさん
2014/06/21(土) 23:06:28.70ID:Ipr85krHやはりそうですか…
今のところシートの中のVBA記述だけで作れていて
「シートコピーするだけで使えるマクロだから皆で使ってね」
って売り込みしたいので、ユーザーフォームは出来れば避けたかったのですが
まず開発タブを表示してVBEを開いて…とかだと多分みんな使ってくれない(汗
>>817
ESCやALT+F4は最初から無効みたいで、大丈夫でした
はい・いいえ・キャンセルを表示してフォーカスをキャンセルにして
キャンセル押したら再度Msgbox表示する方法で妥協を考えています。
ここを参考にしました。
http://www.excel.studio-kazu.jp/kw/20050314190246.html
0819デフォルトの名無しさん
2014/06/22(日) 04:00:56.97ID:3PJ9UmquMsgBox関数みたいに、メッセージの内容次第で幅も高さも可変で
いくつかのアイコン表示が出来たり、ボタンの数も種類も変えられたりするように作るなら面倒だけど
メッセージ内容もボタンも固定で、単にEnter連打で消えないようにするだけのものなら
1,2分もあれば作れるじゃん
ここで質問したりレスを読んだりするよりも短い時間で作れるものなのに
そんな簡単なことよりも、>>818の最後に書いてるような弊害を抱える方法で妥協するのは何故?
0820デフォルトの名無しさん
2014/06/22(日) 08:34:28.55ID:icvg/MGoそれを単純に昇順に並べるとき
VBAでわざわざ新シートつくってセルA1〜A100以降にわざわざ入力して
Excelのソート機能をわざわわざVBA呼び出して
そのあとわざわざ配列変数に入れなおすということをしています。
(この間ユーザに画面を見せないようApplication.Screenupdate = Falseにしています)
もっといい方法はありませんか?
やってること自体は単にアルゴリズムでいう「ソート」なので、新シート作ったりしないで、単に配列のソートをしたいだけなのですが。
ついでにExcel本来についている機能を利用するときそのコードがどうなって見れる方法とかありますか?
0821デフォルトの名無しさん
2014/06/22(日) 08:35:41.60ID:icvg/MGo0822デフォルトの名無しさん
2014/06/22(日) 08:50:10.63ID:bqRgXzqb配列のソートなんかいっくらでもサンプルがネットにある。
そうすれば、そのためにApplication.Screenupdate = Falseするのは回避出来る
0823デフォルトの名無しさん
2014/06/22(日) 08:53:16.45ID:E7Bp6E2C0824桃白白 ◆9Jro6YFwm650
2014/06/22(日) 12:08:58.33ID:TaqxR0c4(; ・`д・´)桃白白バブルソート実装しようか?
0825デフォルトの名無しさん
2014/06/22(日) 12:09:12.69ID:HL9MA0On>やってること自体は単にアルゴリズムでいう「ソート」なので、新シート作ったりしないで、単に配列のソートをしたいだけなのですが。
「ソート アルゴリズム」でググれ
ついでにExcel本来についている機能を利用するときそのコードがどうなって見れる方法とかありますか?
「メモリエディタ」でググれ
0826デフォルトの名無しさん
2014/06/22(日) 12:42:39.60ID:LETTRPjp>>819
> なぜそこまでしてフォームを自作することを敬遠するのか意味解らないw
も相当頭悪そう
ちゃんと書かれてるやん
0827デフォルトの名無しさん
2014/06/22(日) 12:46:42.79ID:rb15rihAVBAにはソート機能がないので、ワークシートを使うかソートのプログラムを自分で作るのが定番
誰かが公開したやつをネットからコピペしてもいいし
それ以外には、Windowsのソート機能を使うという方法もあるけど、あんまり一般的じゃないしメリットも少ない
0828デフォルトの名無しさん
2014/06/22(日) 14:14:21.42ID:28X7tRhT0829デフォルトの名無しさん
2014/06/22(日) 14:15:56.96ID:ISsPU5R9PowerShellにもあるのに
0830デフォルトの名無しさん
2014/06/22(日) 16:11:48.02ID:rb15rihAいくらでもある
標準で入ってるのだとvbsとか.netの配列オブジェクトを使えばソートメソッドも付いてくるけど使うのがめんどくさい
0831デフォルトの名無しさん
2014/06/22(日) 16:36:24.01ID:28X7tRhT.Netの配列なんて標準でついてるんだ。
標準ってことはdllファイルとかにしなくても参照設定で普通に使えるってこと?
Ienumelableの実装とかどうなってるの?
0832デフォルトの名無しさん
2014/06/22(日) 18:47:31.78ID:rb15rihACrerateObject以下略だけで使える
実装までは知らんけど、基本的な使い方はvbsの配列オブジェクトと似てる
0833デフォルトの名無しさん
2014/06/22(日) 19:22:55.53ID:jr7Ep/EM細かい話だが前から気になってるんだよ
0834デフォルトの名無しさん
2014/06/22(日) 20:58:53.57ID:rb15rihAあくまでも自己責任で
半角文字のソート程度ならバージョンが違っても動作が変わることは少ないと思うけど、
あえてそこまでして使うメリットもあんまりないと思うんで、気になるならVBAでソートプロシージャを自作しとけ
速度が必要ならワークシート関数使った方がたぶん速い
0835デフォルトの名無しさん
2014/06/22(日) 21:13:25.13ID:ut82qKlb別にユーザーフォーム使ったところで、呼び出しをシートに書いておけば
「シートコピーするだけで使えるマクロだから皆で使ってね」
からは外れない故の慰問だろ?
0836デフォルトの名無しさん
2014/06/22(日) 22:21:27.26ID:LETTRPjp最初はいいとして、途中でユーザーフォームを変更するときは古いユーザーフォームを解放して新しいユーザーフォームをインポートしないとダメでしょ?
そのためには VBE から操作する必要あるし、そもそも最近のバージョンだと VBE 起動するための開発タブが表示されてなかったりしするので、一般ユーザーに説明するのは結構面倒だよ。
0837デフォルトの名無しさん
2014/06/22(日) 22:40:03.01ID:waKqYOf3のアイコンが表示されますが、それを表示させない方法あり
ますか?ファイルを読み込んで、処理して、上書きする
自作プログラムを実行するとtaskbarがチラつくので、
それを防ぎたいのですが。理想的には画面に何の変化も
起こさずに一連の処理をしたいのです。
0838デフォルトの名無しさん
2014/06/22(日) 23:09:10.40ID:jr7Ep/EMメッセージボックスで済む程度のものを変更するとは思えんがな
0839デフォルトの名無しさん
2014/06/22(日) 23:19:27.60ID:qKjZQIgF>>554
0840デフォルトの名無しさん
2014/06/22(日) 23:24:42.52ID:ut82qKlbそこまで求めると、どっちにしろMsgBoxでは事足りないってことになるのでは?
0841デフォルトの名無しさん
2014/06/23(月) 00:05:55.68ID:yjdH9XJrシートをコピーさせるなんて事すらやらさ無いように考えるものじゃないか
0842デフォルトの名無しさん
2014/06/23(月) 00:19:12.81ID:3jaGUV4o凄く不便なんですが
0843デフォルトの名無しさん
2014/06/23(月) 05:40:10.13ID:PqswRIgEひょっとして、日頃から 〜とは思えん とか言いながらプログラム作ってるの? w
そもそもすでに運用してる人はどうすんの?
ちょっと考えればわかるでしょ。
>>840
言ってる意味がわからん。
俺が書いてるのは運用のやり方だよ?
0844デフォルトの名無しさん
2014/06/23(月) 05:44:21.04ID:PqswRIgE> シートをコピーさせるなんて
とか言いながら、アドインの導入はやらさせるんだよね?
ひょっとして、バカなの?
0845デフォルトの名無しさん
2014/06/23(月) 07:19:07.68ID:PhFfpdUE作り手と使い手は同一のPCを使う状況なんだから
アドインの導入は、やらせるんではなく自分でやっておくわけでしょ
だから相手にはその負担は全く掛からない
0846デフォルトの名無しさん
2014/06/23(月) 07:34:03.43ID:PqswRIgE> 作り手と使い手は同一のPCを使う状況なんだから
>>818
> 「シートコピーするだけで使えるマクロだから皆で使ってね」
> って売り込みしたいので、ユーザーフォームは出来れば避けたかったのですが
0847デフォルトの名無しさん
2014/06/23(月) 08:37:13.80ID:nXtrLFsL0848デフォルトの名無しさん
2014/06/23(月) 08:43:58.27ID:hMj0GtJU情報ありがとうございました。こんな便利な機能があったとは。
これでちらつきは防止できそうなのですが、ただ一つ困ったことは、
ユーザーがタスクバーに複数のxlsxファイルのアイコンを表示させて
置きたい場合、ShowWindowsInTaskbarをFalseに出来ません。
自作プログラムの実行前にFalseに設定して、実行後にTrueに
戻すと、プログラム実行中はちらつきませんが、その設定/再設定 自体がちらつきを
発生させてしまいました。
ということで、全く見えない非表示のワークブックを作成することは
出来ないでしょうか?あるいは何か別の良い方法ありませんか?
0849847
2014/06/23(月) 08:45:27.70ID:nXtrLFsL> 「シートコピーするだけで使えるマクロだから皆で使ってね」
> って売り込みしたいので、ユーザーフォームは出来れば避けたかったのですが
これかな
http://blog.livedoor.jp/yorinaga/archives/51924953.html
https://www.moug.net/tech/exvba/0090027.html
0850デフォルトの名無しさん
2014/06/23(月) 08:48:27.84ID:89oxU91p>すでに運用
は?どこにも書いてないだろ?
0851デフォルトの名無しさん
2014/06/23(月) 09:04:17.48ID:j+hyzfi+ついでにフォーカス奪ったりしとけばいいんじゃねぇの
0852デフォルトの名無しさん
2014/06/23(月) 09:25:36.13ID:89oxU91pそれ最後にメッセージボックス必要になるだろw
msgbox "メッセージを読み終わりましたか?"
0853デフォルトの名無しさん
2014/06/23(月) 09:40:06.51ID:erXvHz+Tmsgbox替わりの物をオートシェイプとボタンで作れって話でしょ
0854デフォルトの名無しさん
2014/06/23(月) 10:07:28.30ID:N/NXR7eWメモ帳を開いてそこにメッセージを書くことってできませんか?
ユーザにはコピペしてもらう用途なのでそれが一番いいのですが。
0855デフォルトの名無しさん
2014/06/23(月) 10:37:55.31ID:LmsmhY4Tああ、すまん。
既に運用してるっつーのはなかったな。
まあ、運用途中で ぐらいに読み替えてくれ。
0856デフォルトの名無しさん
2014/06/23(月) 11:18:51.46ID:h9OdHO6eたぶんメモ帳でもできるんだろうけど
エクセルでシート上にメッセージを表示じゃだめなの?
そっちのほうが簡単じゃね?
0857デフォルトの名無しさん
2014/06/23(月) 11:30:58.15ID:N/NXR7eWシートは正式な書類だから変なメモが残せないから
わざわざユーザフォームを検討したり
わざわざメモ帳を検討したり
しておる。
0858デフォルトの名無しさん
2014/06/23(月) 11:33:48.87ID:NJtDURlPテキストボックスでいいじゃん
メモ帳の実態はテキストボックスだから、中でできることはまったく同じだよ
0859デフォルトの名無しさん
2014/06/23(月) 11:34:47.35ID:NJtDURlP0860デフォルトの名無しさん
2014/06/23(月) 11:48:00.55ID:N/NXR7eWもしユーザが間違って保存してしまった場合それがファイルにずっと残るじゃないか。
0861デフォルトの名無しさん
2014/06/23(月) 12:01:31.36ID:NJtDURlPTextBox1.Locked = True
0862デフォルトの名無しさん
2014/06/23(月) 12:13:02.10ID:N/NXR7eWそれをしても、なにもかわらないじゃないか
0863デフォルトの名無しさん
2014/06/23(月) 12:26:27.35ID:zCax8W1QmyForm
0864デフォルトの名無しさん
2014/06/23(月) 12:29:16.35ID:zCax8W1Q質問です
myForm があってその中に myButton があるとき
フォームのコード内からボタンをクリックするにはどうすれば良いですか?
Private Sub myButton_Click()
MsgBox "test"
End Sub
Private Sub UserForm_Activate()
Call myForm.myButton_Click
End Sub
としても駄目でした
0865デフォルトの名無しさん
2014/06/23(月) 12:49:27.29ID:h9OdHO6ePrivate Sub UserForm_Activate()
Call myForm.myButton_Click
End Sub
じゃなくて
Private Sub UserForm_Activate()
Call myButton_Click
End Sub
でいいんじゃないの?
0866デフォルトの名無しさん
2014/06/23(月) 12:54:09.88ID:zCax8W1Qありがとうございました!!!
0867デフォルトの名無しさん
2014/06/23(月) 16:00:53.41ID:89oxU91pそうなんだけど考えてみて
0868デフォルトの名無しさん
2014/06/23(月) 16:22:31.21ID:h9OdHO6e0869デフォルトの名無しさん
2014/06/23(月) 16:26:14.54ID:LmsmhY4T0870デフォルトの名無しさん
2014/06/23(月) 16:39:51.77ID:h9OdHO6eメッセージ表示のトリガーをマウス操作にすれば
(画面上の何らかのオブジェクトをマウスでクリックした後でメッセージが表示されるようにする)
Enter連打は回避できる
0871デフォルトの名無しさん
2014/06/23(月) 17:33:26.97ID:ERNDPjz2A B C D
1山田 パンツ 100
2(空白行)
3田中 パンツ 100
4 ステテコ 300
5(空白行)
6伊藤 パンツ 100
7 シャツ 200
8 靴下 400
9(空白行)
このように一人一人が購入した品物と金額が入った表を別のCSVファイルから取り込むマクロを作ってます
取り込みや体裁を整えるところは出来たのですが、わからないことがあるので教えてください。
D列に各顧客の合計金額を出したいのですが、顧客ごとの行数がまちまちなので範囲の指定方法がわかりません。
幸い顧客と顧客の間には必ず空白行が入るので空白行を目安に範囲指定すれば良さそうとは思うのですが方法がわからないです。
合計は名前のある行のD列に入れたいと考えてます。
不特定なの範囲での合計はどのように書けばできるのでしょうか?
0872デフォルトの名無しさん
2014/06/23(月) 17:44:48.00ID:XnygHaO/Endプロパティとか、ループでB列の空白を判定とかでいいんじゃね?
でもさ、そういう不適切な集計の仕方はやめた方がいいよ
集計が面倒になる原因って、難しいことをやってるからとかではなく
元データの形式や集計結果の出し方が不適切故に、
不適切なことを一発でやるための機能が備わってないから、
遠回りが必要になってるだけで、正しくやれば
ものすごく簡単に同じ結果を出せるんだからさ
0873デフォルトの名無しさん
2014/06/23(月) 19:10:58.16ID:3o7GTMgOhttps://friendpaste.com/6Efa456sVeLQgRAfYxFAHV
考えてみた
こんなんでいいんじゃないのか
0874デフォルトの名無しさん
2014/06/23(月) 21:27:39.48ID:h9OdHO6eまぁ、本来は>>872さんの仰る通りなんだけど、
コード書いてみたかったから書きました。
A列に名前がある行を先頭にして、B列で空白が出てきた行までの範囲の
C列の値を集計して、先頭行のD列に書き込むマクロです。
処理対象シートの下の方から順次処理をして、先頭行のD列が空白ではない時点、
もしくは先頭行が1行目になった時点で処理を終了します。
なお、With 〜 のところで処理するシートを指定しているので、
使用する際はここを適宜書き換えてください。
Sub test()
Dim rwA As Long
Dim rwB As Long
With ThisWorkbook.Sheets(1)
rwA = .Cells(.Rows.Count, 1).End(xlUp).Row
If .Cells(rwA, 1) = "" Then Exit Sub
rwB = .Cells(rwA, 2).End(xlDown).Row
Do
If .Cells(rwA, 4) = "" Then Exit Do
.Cells(rwA, 4) = WorksheetFunction.Sum(.Cells(rwA, 3).Resize(rwB - rwA + 1))
If rwA = 1 Then Exit Do
rwB = .Cells(rwA - 1, 2).End(xlUp).Row
rwA = .Cells(rwA, 1).End(xlUp).Row
Loop
End With
End Sub
0875桃白白 ◆9Jro6YFwm650
2014/06/23(月) 21:32:42.29ID:WlySWkx4| 丿 ヽ
/ ● ● |
| ( _●_) ミ
彡、 ヽノ ,,/ ♪
/ ┌─┐´
|´ 丶 ヽ{ .茶 }ヽ
r ヽ、__)ニ(_丿
ヽ、___ ヽ ヽ
と____ノ_ノ
0876874
2014/06/23(月) 21:44:44.46ID:h9OdHO6e書き間違えてた。
If .Cells(rwA, 4) = "" Then Exit Do
じゃなくて
If .Cells(rwA, 4) <> "" Then Exit Do
です。
何で間違えたんだろ?
(多分、3行上からIf文をコピペして "=" を "<>" に直し忘れたんですね)
あと、表の開始行が1行目じゃないとエラーが出ますので、
その場合は
If rwA = 1 Then Exit Do
の1を開始する行に変更してください。
0877デフォルトの名無しさん
2014/06/23(月) 21:47:48.46ID:eOLFLVwW「オブジェクト指向できる?」
「C#できる?」
「UMLかける?」
そして入ってみたらVBAの案件やった
なんでやねん
0878桃白白 ◆9Jro6YFwm650
2014/06/23(月) 21:54:21.02ID:WlySWkx4超いいじゃん、うらやましい
0879デフォルトの名無しさん
2014/06/23(月) 23:02:37.78ID:ZccyYMgGあなたが全部できないから仕方なく?
0880デフォルトの名無しさん
2014/06/23(月) 23:36:38.89ID:c5Kifoi8メッセージボックスで白熱の議論になってしまい
ちょっとビックリしています
>>870
バーコードリーダーでバーコードを読んだ時に
それが過去に入力済みのバーコードだった場合に
「上書きしますか」とメッセージボックスが表示されるようになっています。
バーコードで読んだ管理番号を元に対象の行を一覧表から検索し、
入力者、入力日などの情報を追記・更新するプログラムになります。
トリガーはWorksheet_Changeイベントです。
机に沢山のバーコードラベルを並べて、連続で読んでいく入力方法を考えていて、
正確に言うと問題なのはENTER連打ではなくバーコード連続入力です。
バーコードを読んだとき最後にENTERキーが押されたのと同じ効果が発生するので、
メッセージボックス表示中に、次のバーコードを読んでしまった場合に
メッセージが飛ばされ、入力者が気づかない恐れがあると言った具合です。
0881デフォルトの名無しさん
2014/06/23(月) 23:44:37.17ID:qAGmjPdg>>873
ためせば
シートロックするからバーコードのキー入力も受け付けないんじゃね
0882870
2014/06/23(月) 23:54:40.63ID:h9OdHO6eあぁ、そういうことですか。
作業中にEnter連打とか
どんなバカ野郎揃いの職場なんだと思ってました、ゴメンなさい。
そんじゃあ、Yes/Noじゃなくて、Yes/No/キャンセルの3つのボタンを用意して、
デフォルトをキャンセルボタンにしておいたらどうですか?
で、キャンセル選択時には再びメッセージボックスを表示するように無限ループにしておく。
あるいはメッセージボックス表示前とボタン押下後にNowで時刻を取得して
1秒以上(別に1秒じゃなくてもいいけど)経過してなければ
同様に無限ループとか。
閾値が1秒だとちょっと作業のテンポが悪すぎかもしれないんですが、
確かミリ秒単位で時間を計れるマクロがググッたらどっかに在った気がします。
0883デフォルトの名無しさん
2014/06/24(火) 00:09:38.96ID:p/P3a7R3>>882
回答ありがとうございます。
ますは、882のデフォルトをキャンセルにする方法で対応して、
ゆくゆくは873の方を導入したいと思います。
知らない機能を使ってるみたいなので少し勉強が必要そうです。
0884デフォルトの名無しさん
2014/06/24(火) 00:26:03.63ID:Ti0c9rze0885デフォルトの名無しさん
2014/06/24(火) 00:26:49.78ID:F5DFjMP30886デフォルトの名無しさん
2014/06/24(火) 00:50:31.53ID:5iFc+8Q+Yes/Noだけだと、2つのうち1つはEnter連打を無視するのに使わなきゃならないから
本来やりたいデータの上書き確認が出来ないってことなんじゃないの?
0887デフォルトの名無しさん
2014/06/24(火) 01:27:24.29ID:yc/rKAcg悪質サイトにありがちな、入会しますか? で、どうあがいても Yes しか押せないみたいな w
0888デフォルトの名無しさん
2014/06/24(火) 04:24:16.40ID:Ti0c9rze上書きしますか?(はい/いいえ)
いいえ->上書きしませんか?(はい/いいえ)
いいえ->上書きしますか?(はい/いいえ)
いいえ->上書きしませんか?(はい/いいえ)
以下永久にループでw
0889デフォルトの名無しさん
2014/06/24(火) 05:31:01.64ID:kCZG54Z40890デフォルトの名無しさん
2014/06/24(火) 08:43:47.68ID:zV5ogSbP|Windows [−][口][×]|
| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|
| ハ,,ハ |
| ( ゚ω゚) お断りしますが、よろしいですか? |
| ─── |
| ______ ______ ______ |
| | はい(Y) || はい(Y) || はい(Y) | |
|  ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ |
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
0891デフォルトの名無しさん
2014/06/24(火) 09:21:49.91ID:oDNeDxJ6アメーバ会員の退会手順がそうだった
なんども退会しますか?ほんとうに退会しますか?って無限ループω
0892デフォルトの名無しさん
2014/06/24(火) 10:43:03.21ID:jPo8ZSVbサンプルコードありがとうございました。
こういうやり方があるの勉強になりました
0893デフォルトの名無しさん
2014/06/25(水) 19:54:49.36ID:BILL5zszエラーとなる言葉はNaNという言葉になり、ある行からNaNになれば以降はずっとNaNになるため、NaNの直前の行を取得できれば良いです。
もともと最終行は
.cells(rows.count,1).end(xlup).row
.cells(1,columns).end(xltoleft).column
で取得しています。
よろしくお願いします。
0894デフォルトの名無しさん
2014/06/25(水) 20:17:48.86ID:vwnOk3e3SpecialCellsを使えばいいんじゃないかと
>指定された条件を満たしているすべてのセル (Range オブジェクト) を返します。
なので
Set Err_Cell = Range("A1:A100").SpecialCells(xlCellTypeFormulas, xlErrors)
Set Before = Err_Cell.Cells(1, 1).Offset(-1)
とかとか
0895デフォルトの名無しさん
2014/06/25(水) 20:39:19.00ID:5r4HS54B>.cells(rows.count,1).end(xlup).row
>.cells(1,columns).end(xltoleft).column
みつかったセルから1行目まで順繰りに調べて行けばいいだけ
0896デフォルトの名無しさん
2014/06/25(水) 20:40:07.79ID:IVQPbhSwありがとうございます。
試してみます。
もうひとつ質問なのですが、列のうちある値を超えた時の最小の行番地をかえしてほしいとき、
min(if(a1:a100)>x,rows(a1:a100)とやったらうまくいきません。どうすればよいのでしょうか。前で来たのですがうろ覚えなせいかできません。
0897894
2014/06/25(水) 20:40:17.63ID:vwnOk3e3エラーって言葉で勘違いしてた
>>894は無視して
0898デフォルトの名無しさん
2014/06/25(水) 20:41:09.47ID:IVQPbhSwすみません、うまくいきました
0899デフォルトの名無しさん
2014/06/25(水) 21:00:15.35ID:LGqGwfyWしらべるというのは最終行を取得したあと
繰り返して調べてもし値があれば更新していくと考えて、
do isnumeric(cells(lastrow,1)=false then
lastrow=lastrow-1
elseif exit
loop
とすればよいのでしょうか?いまいちよく分からないです
0900デフォルトの名無しさん
2014/06/25(水) 21:15:40.33ID:37/MdzoUコード書いてみた
以下のマクロを実行すると変数colで指定した列の最終行が変数rwに入る
例によってシートはWith〜で指定しているので適宜書き換えてください。
Sub test()
Dim col As Long '処理対象列
Dim rw As Long '最終行
Dim er As String '検索するエラー値
Dim rng As Range
With ThisWorkbook.Sheets(1) '処理対象シートの指定
col = 1 '1列目を指定
er = "NaN" 'エラー値”NaN"を設定
rw = .Cells(.Rows.Count, col).End(xlUp).Row
If .Cells(rw, col).Value = er Then
Set rng = .Cells(1, col).Resize(rw).Find(What:=er, after:=.Cells(rw, col), _
LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByColumns, _
SearchDirection:=xlNext, MatchCase:=True, MatchByte:=True)
rw = rng.Row - 1
End If
Set rng = Nothing
End With
End Sub
0901デフォルトの名無しさん
2014/06/25(水) 21:19:26.53ID:5r4HS54Bfor 探索行 = 見つかった行 to 1 step -1
if 数値かどうか and エラーでは無い とか then
目的の行 = 探索行
exit for
endif
next
0902デフォルトの名無しさん
2014/06/25(水) 21:24:00.62ID:5r4HS54Bエラーならフラグをたてて、エラーじゃなくなるまで探せばいい
0903デフォルトの名無しさん
2014/06/25(水) 21:24:19.82ID:IMwLZcWPエラーのセルは数字以外のデータ("NaN")だって前提で良いのか?
Dim lastgoodrow As Long
Dim i As Long
For i = lastrow To 1 Step -1
If IsNumeric(.Cells(i, 1)) Then
lastgoodrow = i
Exit For
End If
Next
こんな感じでいけるんじゃね
Do Loopでもやれなくはないけど
0904900
2014/06/25(水) 21:26:51.14ID:37/MdzoUSub test()
Dim col As Long '処理対象列
Dim rw As Long '最終行
Dim er As String '検索するエラー値
With ThisWorkbook.Sheets(1) '処理対象シートの指定
col = 1 '1列目を指定
er = "NaN" 'エラー値”NaN"を設定
rw = .Cells(.Rows.Count, col).End(xlUp).Row
If .Cells(rw, col).Value = er Then
rw = .Cells(1, col).Resize(rw).Find(What:=er, after:=.Cells(rw, col), _
LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByColumns, _
SearchDirection:=xlNext, MatchCase:=True, MatchByte:=True).Row - 1
End If
End With
End Sub
ただし、使わないと可読性は下がるかもしれない。
0905900
2014/06/25(水) 21:31:27.09ID:37/MdzoU>>893が独自に"NaN"という文字列をエラーとして定義しているだけじゃないの?
エラー以外が数値かどうかもはっきりしないから
それ前提で>>900のコード書いたんだけど。
0906デフォルトの名無しさん
2014/06/25(水) 21:41:08.62ID:5r4HS54BLastGoodRow = -1
If Cells(LastRow,1) <> "NaN" Then
LastGoodRow = LastRow
Else
For i = LastRow To 1 Step -1
If Cells(i, 1) <> "NaN" Then
LastGoodRow = i
Exit For
End If
Next
End If
if LastGoodRow = -1 Then
MsgBox "全部エラーだって、信じらんない"
End If
0907>>899
2014/06/25(水) 21:45:00.34ID:2Yp71LFs>>905のおっしゃる通りNaNというのは私が出力プログラム側で設定したエラーメッセージです。
参考にして下記のコードで試したところうまくいきました。1 step -1という意味が調べても出てきませんが、ウォッチしていくと思い通りの動きをしてくれるのでこれで良いと思います。とても助かりました。
for i = lastrow to 1 step -1
if cells(lastrow,1).value=″NaN″ then lastrow=lastrow-1
else exit for
end if
next i
すべてメモ帳に保存して勉強します。とても参考になりました。
0908デフォルトの名無しさん
2014/06/25(水) 22:14:38.62ID:37/MdzoU1 step -1 っていうふうに区切っちゃ駄目。
あくまでも
For i = A to B step C
という構文の一部だからね。
変数iをカウンターとして、Aがその開始値でBが終了値、
Cは、ループするときの数値の増減を指定するものだよ。
デフォルトは1だからループ一回ごとにカウンターが1ずつ増える。
Stepを-1にすればループするごとにiの値が1ずつ減る。
今回はそれを利用して判定する行をひとつずつ上にずらしてるんだよ。
下から上に1行ずつセルの値が"NaN" かどうかを判定して、
初めて"NaN" じゃなかった行を取得してる。
ちなみに俺の書いたコードではFindを使って上から下に検索し、
初めて”NaN"が出てくる行(の一個上の行)を取得してました。
0909デフォルトの名無しさん
2014/06/25(水) 22:24:54.50ID:WuPundp1>ちなみに俺の書いたコードではFindを使って上から下に検索し、
>初めて”NaN"が出てくる行(の一個上の行)を取得してました。
目的からすると下から上にNaN以外を探した方がベターなんじゃない
0910デフォルトの名無しさん
2014/06/25(水) 22:50:03.47ID:37/MdzoUデータの総数とエラー値の個数がわからないからなんとも言えないんじゃないですか?
データが10万行有って、そのうちつかえるデータが100行ほどで
残りが全部NaNだった、なんて場合は上からのほうが早いですし。
まぁ、そんな極端な事例があるかどうかは知りませんが。
あと、一行ずつループで判定するよりは
ざっくりFindで検索のほうが分かりやすいかなと。
0911デフォルトの名無しさん
2014/06/26(木) 01:42:15.08ID:QF5vpOOe10列目「氏名」のフィルターでオプションを選び
「山田*」と等しい OR 「山本*」と等しい
を選択して実効
記録を見ると
Selection.AutoFilter Field:=10, Criteria1:="=山田*", Operator:=xlOr, Criteria2:="=山本*"
となっている
ここで「山田」「山本」を決め打ちするのではなく入力できるように修正した
例) 名字〜フルネーム 名字先頭2文字
入力1 → 佐藤花子 → 佐藤* → inNAME1
入力2 → 鈴木一郎 → 鈴木* → inNAME2
Selection.AutoFilter Field:=10, Criteria1:=inNAME1, Operator:=xlOr, Criteria2:=inNAME2
これで、氏名の先頭2文字が「佐藤」と「鈴木」のデータが抽出されるはずなんだけど
先に入力した文字、例えば inNAME1="佐藤*"のとき、佐藤さんのみが抽出され、鈴木さんが表示されません
因みに
Selection.AutoFilter Field:=10, Criteria1:="佐藤*", Operator:=xlOr, Criteria2:="鈴木*"とマクロに決め打ちすると
両者が表示されました
何が間違っているのでしょう?
0912デフォルトの名無しさん
2014/06/26(木) 05:15:04.25ID:A8fdTDkm最近VBAの勉強を始めたんですけど、自分はプログラミングに向いてない気がしてます。
向き不向き関係なく、忍耐強く続けていればある程度のレベルまでいけるものなんでしょうか?
0913デフォルトの名無しさん
2014/06/26(木) 05:44:43.82ID:YKDhPwk8>何が間違っているのでしょう?
お前のコード。試したけどAutoFilterの所は間違ってない
一旦AutoFilterクリアしてもダメなら、それまでのコードのどこかが間違ってる
0914デフォルトの名無しさん
2014/06/26(木) 10:41:11.02ID:Vl0DMOsH目的によって違うでしょ
趣味で楽しむなら自分が満足できればOK
極端に論外な質問じゃなければ(入門書に書いてある最低限の基本レベルの話しとか、ググればわかる話とか)
解らないことはネットで聞けば誰かが教えてくれるので問題ない
後は実力次第で仕事にできるかも
仕事にしたいというのなら中級レベルくらいまでは自力でこなせるくらいじゃないと難しいだろうね
仕事は人に聞きながらやるものではない
特別にセンスのある人なら、自力で相当なレベルまで行くんだろうけど
1人で勉強していると、参考書やネット検索だけでは行き詰まるときがある
へーそんなことができるんだとか、そんな手があったんだというテクニックとか
職場や学校なら先輩・同僚・友人から知恵を拝借なんだけど、1人では調べても気付かないことがある
そこはネットで質問すればいい
結局あるレベルに到達するまで続けられるかどうかだね
0915デフォルトの名無しさん
2014/06/26(木) 10:46:41.59ID:3UKMa8v3手動でやってることをVBAで単純に自動化するってレベルなら、
知識だけで出来るものなので頑張れば誰でも到達できる
これはプログラムというよりマクロだね
マクロの記録も、手動でやったことをそのまま記録して再現するだけだからそれと同じで
コードを書くと言ってもプログラミングとは呼べない、機械でも出来る単純作業
手動作業の自動化でも、単純に手動操作と同じ手順を踏んでいくのではなく
効率的に処理するためのアルゴリズムを考え出したり、効率的な操作や入力のための
インターフェイルを作ったりって部分は、知識も必要だがそれ以上に
根本的な頭の回転の良さや、理論的思考能力、プログラミングセンスなどが関わってくるので
程度問題ではあるが、努力だけで誰でも出来るというものではない
0916デフォルトの名無しさん
2014/06/26(木) 10:48:05.80ID:Sh8OHuSQVBAの中から、外部にあるSWI-Prologの定義述語を質問として呼び出してその解を得る方法を教えてください。
0917デフォルトの名無しさん
2014/06/26(木) 19:36:02.44ID:/K4PsCsscopyの前にactivateを挟んだり、copyのdestinationを使うのをやめてpasteを使ったりすればしのげることがほとんどなんですが、これはどうしてこんなことが起きるのでしょうか
0918デフォルトの名無しさん
2014/06/26(木) 20:39:07.57ID:GQSdjYychttp://okwave.jp/qa/q1837160.html
これの回答通りにしても、全角文字が化けます。
質問者はこの回答をヒントにして対応できたと書いていますが、
具体的にどう対応したのかどなたかわかりませんか?
0919デフォルトの名無しさん
2014/06/26(木) 20:49:22.99ID:opxnlqAwそのAPIは使った事ないから具体的なアドバイスが出来ないけど
ここあたりが参考にならない?
http://www.happy2-island.com/access/gogo03/capter90301.shtml
0920デフォルトの名無しさん
2014/06/26(木) 20:54:38.15ID:NJwGBRS/めんどいからftpコマンド使えば?
0922デフォルトの名無しさん
2014/06/26(木) 21:37:25.60ID:opxnlqAwなんか 全角文字が シフトJIS でない気もするんだけど
ダウンロード元のファイルは 全角文字 シフトJISなの?
>msdosでやると全角がばけないんです。
良くわからんがどういう事?
0923918
2014/06/26(木) 22:07:42.74ID:GQSdjYycmsdosでFTPコマンドを対話式で実行すると文字化けしないという意味です。
その際、私の場合は、getの前にqoute type c 943を実行しています。
0924デフォルトの名無しさん
2014/06/26(木) 22:13:14.65ID:jelhdoL6┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬
1│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼
2│ │●│●│●│ │ │ │ │ │ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┏━━━━━━━━━━━┓─┼─┼─┼─┼
3│ │●│●│●│ │ ┃ │ │ │ │ │ ┃ │ │ │ │
├─┼─┼─┼─┼─┼─┃─・─┼─┼─┼─・─┃─┼─┼─┼─┼
4│ │ │●│●│ │ ┃ │ │●│●│ │ ┃ │ │ │ │
├─┼─┼─┼─┼─┼─┃─┼─┼─┼─┼─┼─┃─┼─┼─┼─┼
5│ │ │ │ │ │ ┃ │●│ │●│ │ ┃ │ │ │ │
├─┼─┼─┼─┼─┼─┃─┼─┼─┼─┼─┼─┃─┼─┼─┼─┼
6│ │ │ │ │ │ ┃ │●│ │●│ │ ┃ │ │ │ │
├─┼─┼─┼─┼─┼─┃─┼─┼─┼─┼─┼─┃─┼─┼─┼─┼
7│ │ │ │ │ │ ┃ │●│ │●│●│ ┃ │ │ │ │
├─┼─┼─┼─┼─┼─┃─・─┼─┼─┼─・─┃─┼─┼─┼─┼
8│ │ │ │ │ │ ┃ │ │ │ │ │ ┃ │ │ │ │
├─┼─┼─┼─┼─┼─┗━━━━━━━━━━━┛─┼─┼─┼─┼
データがいくつかの領域に分れている時に(この例では二か所に分布)、その中で
ある一つのデータ領域を囲むように選択したとして(太い罫線)、その状態で
囲まれているデータの実質のデータ領域を取り出したいのですがどんな方法がありますか?
この例では H4:K7 というアドレスを取得したいのです。
0925デフォルトの名無しさん
2014/06/26(木) 22:19:02.60ID:4VblDczs0926デフォルトの名無しさん
2014/06/26(木) 22:47:54.48ID:kbxRbX970927デフォルトの名無しさん
2014/06/26(木) 22:55:41.37ID:kbxRbX97上下左右4方向にSelection.Find("●")
0928デフォルトの名無しさん
2014/06/26(木) 23:10:07.56ID:YKDhPwk8FTPにはバイナリモードとテキスト(アスキー)モードがあるのはわかってる?
その例は見る限り、バイナリモードで転送するようにして文字コード変換させない事にしてる
お前が化けないっていってるときは、TYPEコマンド送出してるって事はおそらくアスキーモード
wininet.dllがどうなってるか知らんが、同じようにTYPEコマンド送ってアスキーで転送すれば行けるんじゃね
それでだめならサーバ側でログ調査
これ以上はVBAまったく関係ないからどっか適切なとこで聞いてください
0929デフォルトの名無しさん
2014/06/26(木) 23:21:02.14ID:wyn/j17F線分の両端は各セルの真ん中になります。
0930デフォルトの名無しさん
2014/06/26(木) 23:36:54.58ID:kbxRbX97セルの中心座標は
With Range("A1")
x1 = .Left + .Width / 2
y1 = .Top + .Height / 2
End With
線を引くのは
ActiveSheet.Shapes.AddLine x1, y1, x2, y2
0931デフォルトの名無しさん
2014/06/26(木) 23:39:13.96ID:jelhdoL6>>925,926
その場合、各セルにデータが有るかどうか一個ずつ順番に調べていくとすると
効率が悪いと思うのですが、でもそれしか方法は無いでしょうか?
>>927
確かにデータが●だけならその方法が良いかも知れませんが、●以外の一般の
データの場合で考えています。
0932デフォルトの名無しさん
2014/06/26(木) 23:46:01.80ID:wyn/j17Fよっしゃ。
0933デフォルトの名無しさん
2014/06/26(木) 23:47:56.49ID:kbxRbX97Find("*")
0934912
2014/06/26(木) 23:48:36.11ID:A8fdTDkm>>915
当たり前ですが、やはりある程度以上になるとセンスが必要になってくるんですね。
とりあえずどこかしら楽しめる範囲で続けていこうと思います。
ありがとうございました。
0935デフォルトの名無しさん
2014/06/26(木) 23:49:07.94ID:t2BI4rIw要求仕様がイマイチ不明確なんだけど、要するに
選択された矩形範囲内で外縁部の空白セルを含まない
CurrentRejion領域を求めればいいんだよな?
(最初の質問に有った「データがいくつかの領域に分れている時に」は関係ないよね?)
Currentrejion に CountIf の組み合わせで出来そうな気がするんだけど、
実際にコードで書くとなるとイマイチ考えがまとまらない。
0936デフォルトの名無しさん
2014/06/26(木) 23:49:38.72ID:wyn/j17F0937デフォルトの名無しさん
2014/06/26(木) 23:50:20.41ID:3UKMa8v3CurrentRegion
0938935
2014/06/26(木) 23:55:18.56ID:t2BI4rIw0939デフォルトの名無しさん
2014/06/26(木) 23:59:25.82ID:jelhdoL6>>「データがいくつかの領域に分れている時に」は関係ないよね?
その通りです。説明が悪くてすみません。
出来れば参考になるコード、よろしくお願いします。
0940デフォルトの名無しさん
2014/06/27(金) 00:07:15.61ID:MwZdRGeI□□□□□
□□□■□
□□□□□
□■■□□
□□□□□
0941デフォルトの名無しさん
2014/06/27(金) 00:07:42.04ID:MwZdRGeI質問はもっと丁寧に
何の色?
0942デフォルトの名無しさん
2014/06/27(金) 00:18:06.71ID:fv43ADTPDim startcell As Range, endcell As Range
Dim lineshape As Shape
Set startcell = Sheet1.Range("B2")
Set endcell = Sheet1.Range("D3")
Set lineshape = Sheet1.Shapes.AddLine( _
startcell.Left + startcell.Width / 2, _
startcell.Top + startcell.Height / 2, _
endcell.Left + endcell.Width / 2, _
endcell.Top + endcell.Height / 2)
lineshape.line.ForeColor.RGB = vbBlack
もう来るなよ
0943デフォルトの名無しさん
2014/06/27(金) 00:21:57.37ID:tG/H6ykxその場合は
□□■
□□□
■■□
の部分を取り出したいです。
0944デフォルトの名無しさん
2014/06/27(金) 00:23:10.49ID:aWx7sjWc0945デフォルトの名無しさん
2014/06/27(金) 00:47:50.48ID:tthd8i7m2重ループにしないで(For j=・・・・・なしに)配列を一発で
代入できないでしょうか?
k=0
For i = LBound(Arry1, 1) To UBound(Arry1, 1)
if とある条件 then
k=k+1
For j = LBound(Arry1, 2) To UBound(Arry1, 2)
Arry2(k, j) = Arry1(i, j)
Next
end if
Next
0946デフォルトの名無しさん
2014/06/27(金) 00:49:58.75ID:MwZdRGeIその「愚直に調べる」方法にも色々あるだろ
0947デフォルトの名無しさん
2014/06/27(金) 00:53:49.28ID:fv43ADTP素直にコード書いてくださいって言えよ
0948デフォルトの名無しさん
2014/06/27(金) 00:54:47.16ID:MwZdRGeI無理
処理スピード関係なくコードをシンプルにしたいだけなら、ワークシートにデータを置くという方法がある
ワークシート上なら簡単に不要な列を詰めたりできる
あるいは、行ごとにJoinして一次元配列にしといて、処理が終わったら最後にSplitで2次元に戻すとか
0949デフォルトの名無しさん
2014/06/27(金) 00:56:56.44ID:MwZdRGeI日付変わってID変わったけど俺は>>927 >>933だよ
Findを4回よりシンプルな方法ってあるか?
0950デフォルトの名無しさん
2014/06/27(金) 00:59:53.62ID:aWx7sjWc0951945
2014/06/27(金) 01:01:09.42ID:tthd8i7m無理ですか ありがとうございます
この前に少し重い処理があって それを含めて 全体をもっと効率化できないかと考えておりました
重い処理の方をもっと効率化するように考えてみます。
0952デフォルトの名無しさん
2014/06/27(金) 01:16:52.94ID:MwZdRGeIそれはおまえが決めることじゃない
どんな方法を望んでいるかは質問者にしかわからない
0953デフォルトの名無しさん
2014/06/27(金) 01:18:30.71ID:dGXFzF3sシンプルとか言い出したのおまえだろ
0955デフォルトの名無しさん
2014/06/27(金) 01:45:43.30ID:fv43ADTPたぶんベタにやるしかない。速度差なんて大差無いと思うが
ベタにやってみた
0956デフォルトの名無しさん
2014/06/27(金) 01:47:19.39ID:fv43ADTP前半
Function DataArea(checkarea As Range) As Range
Dim retarea As Range
Dim row1 As Long, col1 As Long, row2 As Long, col2 As Long
Dim r As Range, i As Long
'上
For Each r In checkarea.Rows
Debug.Print "r1 count=" & WorksheetFunction.CountA(r)
If WorksheetFunction.CountA(r) > 0 Then
row1 = r.Row
Exit For
End If
Next
'左
For Each r In checkarea.Columns
If WorksheetFunction.CountA(r) > 0 Then
col1 = r.Column
Exit For
End If
Next
If row1 = 0 Or col1 = 0 Then
MsgBox "範囲内にデータなし"
Exit Function
End If
0957デフォルトの名無しさん
2014/06/27(金) 01:47:49.81ID:fv43ADTP'下
For i = checkarea.Rows.Count To 1 Step -1
If WorksheetFunction.CountA(checkarea.Rows(i)) > 0 Then
row2 = checkarea.Rows(i).Row
Exit For
End If
Next
'右
For i = checkarea.Columns.Count To 1 Step -1
If WorksheetFunction.CountA(checkarea.Columns(i)) > 0 Then
col2 = checkarea.Columns(i).Column
Exit For
End If
Next
With checkarea.Worksheet
Set retarea = .Range(.Cells(row1, col1), .Cells(row2, col2))
End With
Set DataArea = retarea
End Function
0958デフォルトの名無しさん
2014/06/27(金) 01:51:47.61ID:fv43ADTPMsgBox DataArea(Selection).Address
とかで行けるんじゃね
問題になるほど遅いとは思わんが
0959デフォルトの名無しさん
2014/06/27(金) 01:52:10.06ID:WBIkvaOnもしも条件にあったものをArray1から抜き出してArray2をつくるということなら
Array2はインデックスだけにしてそれを使ってArray1にアクセスするというのはだめですか?
0960935
2014/06/27(金) 02:00:43.32ID:fo8RbvYeCurrentRejion は、関係なかった。(というか>>940の指摘どおりCurrentRejionでは対応出来ない部分があった)Findを4回でどうやるのかも分からないからベタにやった。
適当な範囲をセレクトした状態で以下のマクロを実行すると、データがある範囲だけを包含した矩形の領域をセレクトして終了する……はず。<=ちょっと自信ない
Sub test()
Dim wf As WorksheetFunction
Dim rw_cnt As Long, cl_cnt As Long, st_rw As Long, ed_rw As Long, st_cl As Long, ed_cl As Long
Set wf = Application.WorksheetFunction
With Selection
rw_cnt = .Rows.Count
cl_cnt = .Columns.Count
For st_rw = 1 To rw_cnt
If wf.CountA(.Rows(st_rw)) > 0 Then Exit For
Next st_rw
If st_rw > rw_cnt Then
MsgBox "Err:NoData"
Exit Sub
End If
For ed_rw = rw_cnt To 1 Step -1
If wf.CountA(.Rows(ed_rw)) > 0 Then Exit For
Next ed_rw
For st_cl = 1 To cl_cnt
If wf.CountA(.Columns(st_cl)) > 0 Then Exit For
Next st_cl
For ed_cl = cl_cnt To 1 Step -1
If wf.CountA(.Columns(ed_cl)) > 0 Then Exit For
Next ed_cl
Range(.Cells(st_rw, st_cl), .Cells(ed_rw, ed_cl)).Select
End With
Set wf = Nothing
End Sub
0961935
2014/06/27(金) 02:02:55.35ID:fo8RbvYe0962デフォルトの名無しさん
2014/06/27(金) 02:15:13.27ID:MwZdRGeISub Macro1()
With Selection
If WorksheetFunction.CountA(.Cells) Then
r1 = .Find(What:="*", After:=.Cells(.Count), SearchOrder:=xlByRows, SearchDirection:=xlNext).Row
r2 = .Find(What:="*", SearchDirection:=xlPrevious).Row
c1 = .Find(What:="*", After:=.Cells(.Count), SearchOrder:=xlByColumns, SearchDirection:=xlNext).Column
c2 = .Find(What:="*", SearchDirection:=xlPrevious).Column
Range(Cells(r1, c1), Cells(r2, c2)).Select
End If
End With
End Sub
0963デフォルトの名無しさん
2014/06/27(金) 02:23:22.97ID:fo8RbvYeなるほど、SearchOrderとSearchDirectionを上手く使ってますね。
あと、何気にAfterも。
可読性がちょっと犠牲になるけど、c1とc2の順番を逆にしたら
ほんのちょびっと(SearchDirectionの指定一回分)だけコード短く出来ますな。
0964デフォルトの名無しさん
2014/06/27(金) 02:43:45.05ID:MwZdRGeISearchDirectionはデフォルト値が記憶されるんだっけ?
0965デフォルトの名無しさん
2014/06/27(金) 02:44:41.44ID:MwZdRGeISub Macro2()
With WorksheetFunction
If .CountA(Selection) = 0 Then Exit Sub
r1 = Selection.Row
c1 = Selection.Column
r2 = Selection(Selection.Count).Row
c2 = Selection(Selection.Count).Column
While .CountA(Range(Cells(r1, c1), Cells(r1, c2))) = 0
r1 = r1 + 1
Wend
While .CountA(Range(Cells(r2, c1), Cells(r2, c2))) = 0
r2 = r2 - 1
Wend
While .CountA(Range(Cells(r1, c1), Cells(r2, c1))) = 0
c1 = c1 + 1
Wend
While .CountA(Range(Cells(r1, c2), Cells(r2, c2))) = 0
c2 = c2 - 1
Wend
End With
Range(Cells(r1, c1), Cells(r2, c2)).Select
End Sub
0966デフォルトの名無しさん
2014/06/27(金) 02:57:21.18ID:WMnmrq5J上手く使ったというか、本人も言ってる通り
「愚直に調べる」方法の一つをコードにしただけの話でしょ
でも愚直なのが一番確実だし、速度的にも十分じゃね?
0967945
2014/06/27(金) 02:59:21.01ID:tthd8i7mえっとごめんなさい
>2重ループにしないで(For j=・・・・・なしに)配列を一発で
が主眼で if とある条件 then
をつけないと Arry2 = Arry1 でいいじゃんとかいわれそうで付けた
説明不足で申し訳ありません
実際の処理は以下なんです
当初これで質問しようとしてたんだけどここまで聞くのは どうなのかって感じでもっとシンプルな質問に変えたんです(^^;
(ソート処理をFunction化したものの 一部なんだけどね)
配列 Arry(1 TO n,1 TO m)
配列 Sortdata(1 TO n)・・・・実際は2次元配列だけど 説明上1次元としている
があって
配列Sortdataは 1〜n の 数値が 入っていて(同じ数値は入っていない) 配列Arryのインデックス値に対応してます
配列Dataを元に 配列Arrayの配置を変えたいのです。
Sortdata(1) = 100 なら 配列Arry(100, j) → 配列Arry(1, j)
Sortdata(5) = 200 なら 配列Arry(200, j) → 配列Arry(5, j)って感じで
※配列Arryのある列をキーにして昇順になるように 配列Sortdataが作られていると考えて下さい。
'Orgin配列へ書戻し
Arry_Copy = Arry
For i = LBound(Sortdata, 1) To UBound(Sortdata, 1)
For j = LBound(Arry, 2) To UBound(Arry, 2)
Arry(i, j) = Arry_Copy(Sortdata(i), j)
Next
Next
PS. ソート処理本体を バブルソート から クイックソート に変えようとアルゴリズム勉強中です(^^
0968924
2014/06/27(金) 03:09:40.07ID:tG/H6ykx作って頂いて大変感謝しています。
早速試してみましたところ、全て期待通り動きました。感激です。
せっかく作ってもらっておきながら、気になった点を言いますと、
うっかりシート全体を選択して実行すると(EXCEL2010)、
>>956
>>960
10秒くらいかかりました。(わたしのパソコンが遅いのかもしれませんが)
>>962
>>965
オーバーフローしました。
もし解決方法が有りましたら教えてください。
シート全選択時でも1秒以内くらいが理想です。
0969デフォルトの名無しさん
2014/06/27(金) 03:11:24.73ID:MwZdRGeIScreenUpdating = Falseして、A1:Z100を選択した状態で10000回ずつ実行
>>956 40秒
>>960 19秒
>>962 0秒
>>965 10秒
0970デフォルトの名無しさん
2014/06/27(金) 03:19:28.93ID:fo8RbvYe指定する度にその設定が保存される仕様でしたよね、
たしかヘルプにはそんな様な事が書いてあったと思います。
だからr2とC2はDirectionが同じなのでOrderだけ指定すれば良くて、
c2からc1でDirectionの指定でいけたはずだな、と。(確かめてないですけど。)
>>966
すいません。
俺には思い付けなかったんです。
だから上手い手だなと思いました。
>>967
見当違いかもしれないけどジャグ配列ってのが参考になるかもです。
配列の配列とも言う奴です。
俺は使ったことがないのでよく分からないから間違ってたら許してください。
0971デフォルトの名無しさん
2014/06/27(金) 03:38:56.47ID:MwZdRGeIすまん、全選択は想定の範囲外だった
オーバーフローの原因は潰した
スピードも十分のはず
Sub Macro_962_2()
With Selection
If WorksheetFunction.CountA(.Cells) Then
Set c = .Cells(1).Offset(.Rows.Count - 1, .Columns.Count - 1)
r1 = .Find(What:="*", After:=c, SearchOrder:=xlByRows, SearchDirection:=xlNext).Row
r2 = .Find(What:="*", SearchDirection:=xlPrevious).Row
c1 = .Find(What:="*", After:=c, SearchOrder:=xlByColumns, SearchDirection:=xlNext).Column
c2 = .Find(What:="*", SearchDirection:=xlPrevious).Column
Range(Cells(r1, c1), Cells(r2, c2)).Select
End If
End With
End Sub
0972デフォルトの名無しさん
2014/06/27(金) 03:43:06.73ID:MwZdRGeIヘルプじゃなくて悪いけど、ここにはSearchOrderは記憶されると書いてある
つまりSearchDirectionは記憶されないようだ
http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_find.html
ヘルプでは発見できんかった
0973デフォルトの名無しさん
2014/06/27(金) 03:50:36.34ID:MwZdRGeIそれは知らんかった
0974970
2014/06/27(金) 04:03:10.21ID:fo8RbvYeあ、ホントだ。Directionは記憶されないんですね。
ちゃんと確認してませんでした。ごめんなさい。
http://msdn.microsoft.com/ja-jp/library/office/ff839746(v=office.15).aspx
でもそうすると、おそらくDirectionには規定値が存在しますよね?
省略可能なパラメータですし。
多分xlNextがデフォだと思いますが、
それの指定は省略できそうですね。<=まだ懲りてない
あと、これまた確認してなくてあてずっぽうですが、
変数の宣言で明示的にLong型にしたほうがVarantで使うより早くならないですかね?
(うちのPCは未だにExcel2000なんで、全領域指定しても全然範囲が狭いんで処理時間掛かるか試せないんです。)
0975デフォルトの名無しさん
2014/06/27(金) 04:08:49.44ID:MwZdRGeIExcelの機能をフルに使って、A列にインデックス、B列以降にデータを入れて
こんな感じでソートすれば一発で並べ替えできるけど、どうしてもVBAだけでやらないとだめ?
Range("A1:A100") = SortData
Range("B1:Z100") = Arry1
Worksheets("Sheet1").Sort
Arry2 = Range("B1:Z100")
0976デフォルトの名無しさん
2014/06/27(金) 04:20:34.26ID:vLpfuBhO一瞬で終わる処理の実行時間を測るには、Subを1000回呼んで時間を1000で割る
0977デフォルトの名無しさん
2014/06/27(金) 04:36:07.16ID:fv43ADTPシート全選択で、実際にデータ入ってる範囲はどのくらいなんだ?
つか今気づいたんだが、(一旦保存して開き直して)UsedRange見れば良いんじゃないか
0978945
2014/06/27(金) 04:39:09.43ID:tthd8i7mたしかにそれでも出来るけど
それ用のシート作らんとだめだし処理速度的にどうなんだろうか
配列内ソートの方が圧倒的に早いと思うんだけど
数百件程度のソートでは低速といわれてるバブルソートでも使えたけど
数千件のソートで処理速度的に不満が出てきたので効率化できないかなと
>>975 のやり方も含めて検討してみる ありがとう
あとは個人的な興味もありクイックソートも勉強中してみるっス
さて さすがに眠いな そろそろ仮眠タイムなので寝るっす
ではでは
0979デフォルトの名無しさん
2014/06/27(金) 05:07:04.04ID:81jca32sUsedRangeじゃだめ
最初の質問をよく読め
0980デフォルトの名無しさん
2014/06/27(金) 05:17:01.03ID:jgnIvu2AVBAには配列の一部分をまとめてコピーする方法がないんで、ワークシートに展開した方が速そうに思えるけどなあ
もしVBAだけで高速にソートするのが目的なら、単純な2次元配列にせずにVariant型の配列にするとか、
データをコピーせずにインデックス経由でアクセスするとか、根本的にデータ構造やアルゴリズムを工夫しないと
0981デフォルトの名無しさん
2014/06/27(金) 06:15:06.07ID:MwZdRGeIごめん、実際に試してみたら、単純なForの二重ループの方がワークシートよりずっと速かったわ
20倍ぐらい差があった
0982デフォルトの名無しさん
2014/06/27(金) 06:17:38.59ID:MwZdRGeIパラメータ省略ついでに、重そうな関数の呼び出しを1回減らして気休めレベルのスピードアップ
Sub Macro_962_3()
With Selection
Set c = .Cells(1).Offset(.Rows.Count - 1, .Columns.Count - 1)
Set f = .Find(What:="*", After:=c, SearchOrder:=xlByRows)
If Not f Is Nothing Then
r1& = f.Row
r2& = .Find(What:="*", SearchDirection:=xlPrevious).Row
c1& = .Find(What:="*", After:=c, SearchOrder:=xlByColumns).Column
c2& = .Find(What:="*", SearchDirection:=xlPrevious).Column
Range(Cells(r1&, c1&), Cells(r2&, c2&)).Select
End If
End With
End Sub
0983924
2014/06/27(金) 13:12:34.79ID:tG/H6ykxお返事おそくなりました。
たびたび改良ありがとうございました。
完璧に動きました。私の希望通りの動きです。
Findのテクニックも大変勉強になりました。
重ねてお礼申し上げます。
0984970
2014/06/27(金) 13:25:59.66ID:fo8RbvYeお呼びでないかもしれませんが、ジャグ配列のサンプルコード書きました。
こんな事がしたいのではありませんか?
Sub jagtest()
Dim tmp As Variant
Dim ary1 As Variant
Dim ary2 As Variant
Dim r As Long, c As Long
'サンプル用に2次元配列変数 ary1(1 to 500,1 to 100) をジャグ配列で作成
ReDim tmp(1 To 500)
ReDim ary1(1 To 100)
ReDim ary2(1 To 100)
With ThisWorkbook.Sheets(1)
For c = 1 To 100
For r = 1 To 500
'配列内のデータにはとりあえずセルのアドレスを使用
tmp(r) = .Cells(r, c).Address
Next r
ary1(c) = tmp
Next c
End With
stop
'ここまではサンプル用の配列変数を用意しただけ、ここからがジャグ配列の操作
For c = 1 To 100
ary2(c) = ary1(101 - c)
Next c
stop
'ary1とary2をウォッチ式とかで確認してください
End Sub
0985デフォルトの名無しさん
2014/06/27(金) 13:41:29.31ID:TCJgScNN0986970
2014/06/27(金) 13:45:07.18ID:fo8RbvYeary1(100,500)ではなく、ary1(100)(500)のようにしないとダメです。
あと、多分まとめて操作できるのは片方の要素(今回は最初の100の要素の方)だけです。
ところで、どなたかそろそろ次スレお願いします。
0987970
2014/06/27(金) 13:54:03.22ID:fo8RbvYeサンプルコード内の注釈が間違ってた……orz
ary1もary2もサイズは(500,100)ではなく(100,500)です。
連投すみませんでした。
0988911
2014/06/27(金) 13:54:16.09ID:e5TZuaT8再起動した後やってみたら上手く行った
何度やっても上手く行かなかったのに、原因不明
0989945
2014/06/27(金) 14:55:39.03ID:tthd8i7m>>967でもちょっと書いたけど
>(ソート処理をFunction化したものの 一部なんだけどね)
各プロシージャで使われる共通Functionなんです
なんでIn/Outの配列仕様は変えたくないのです(あっちこち変更しないとだから)
そのごく一部の処理で 元々数百件のデータを扱うもりで書いた処理が
データ量増加で 数千件に肥大してまい処理時間がかかるようになり
その主要因が 件の共通Functionだったのです。
とは言えそもそも 呼び足し元の処理自体もデータ量増加に対応出来てない部分もあるんで
>>980さんの言われるとおり 根本から見直したほうがよさそうです(D/B利用も含めて)
>>984さん
そうゆう手法もありですね今後の参考にさせてもらいます。
0990デフォルトの名無しさん
2014/06/27(金) 19:37:16.88ID:51fPEK/Z0991デフォルトの名無しさん
2014/06/28(土) 05:27:46.68ID:UFon7Qh20992デフォルトの名無しさん
2014/06/28(土) 16:02:46.50ID:CYmFK5pL遠慮なく埋めてくれ。
Excel VBA 質問スレ Part34
http://peace.2ch.net/test/read.cgi/tech/1403911485/
0993デフォルトの名無しさん
2014/06/28(土) 16:59:56.07ID:x8pWVUAe乙です
0994デフォルトの名無しさん
2014/06/28(土) 20:46:27.10ID:18/3jPkpおつ
0995デフォルトの名無しさん
2014/06/28(土) 21:32:22.70ID:S4simBtK0996デフォルトの名無しさん
2014/06/28(土) 21:33:59.74ID:87/kSllN自分なりに検索してみたんですけど見つからなかったので質問します
Windows7、Excel2010
ある列に文字が並んでいて、その文字に対応させた文字を同じ行の隣の列に表示させることはできますか?
例えば
A
B
A
A
A
B
のように一列に文字が並んでいて、Aの隣の列に1、Bの隣の列に2と表示させたいです
検索するときのキーワードだけでもいいので教えてほしいです
0997デフォルトの名無しさん
2014/06/28(土) 21:40:13.41ID:CYmFK5pLEXCELの数式だけで片付きそうなもんだけど、
VBAでやりたい理由が何かあるの?
0998デフォルトの名無しさん
2014/06/28(土) 21:47:06.54ID:QPLRDCyXループ if
0999デフォルトの名無しさん
2014/06/28(土) 21:53:46.84ID:87/kSllN調べてみたらVLOOKUPというものでできそうですね
こういうのはVBAでやるものだと思い込んでました
ありがとうございます
>>998
ありがとうございます
1000デフォルトの名無しさん
2014/06/28(土) 21:54:55.58ID:xYrnaOxY10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。