1 名前:デフォルトの名無しさん mailto:sage [2007/01/09(火) 11:14:15 ] ・まじめにExcelの機能を追及してみようと思う奇特なひと ・スキルがないのに無理やりVBAの仕事を押し付けられた普通のひと ・VBAなんていまさらやりたくないのに業務で仕方なく使っているひと ・とにかく漏れにこんな仕事まわすなと怒っているひと そんなM$大好きなひとからアンチM$なひとたちまで幅広くカバーするスレです OOoのCalcの質問もOKです 前スレ pc10.2ch.net/test/read.cgi/tech/1054356121/
136 名前:デフォルトの名無しさん mailto:sage [2007/02/02(金) 00:10:24 ] > VBAは自分で作った関数を使う際、 > 引数にかっこをつけてはいかんのです。 ハズレ 自作関数の場合ではなく、基本的にSub、Functionプロシージャ(メソッド)を呼ぶ場合、 戻り値を取る場合とCallで呼ぶ場合以外は()を付けない。MsgBox関数の場合だとこんな感じで使う。 [1] MsgBox "test", vbOkOnly [2] Call MsgBox("test", vbOkOnly) [3] ret = MsgBox("test", vbOKCancel) 自作関数の場合でも戻り値を取る場合とCallで呼ぶ場合は()付けなきゃダメだし 自作関数じゃなくても、[1]のように使うときは()付けてはいかんのです。 ややこしいのは、引数一つの関数の場合。 [4] Inc hoge [5] Inc (hoge) Sub Inc(Value As Long) Value = Value + 1 End Sub [4]の方だと変数hogeが+1され、[5]の方だと変化しない。 引数一つの関数をCallを省略し引数に()を付けて呼ぶと、引数は値渡しになる。 基本的に参照渡し値渡しは呼び出される側で指定するので、[5]は殆ど使われない。 意味も知らずに間違って使ってる奴は居そうだけどな。
137 名前:デフォルトの名無しさん [2007/02/02(金) 00:13:03 ] >>135 潮位というシートで作業しています。
138 名前:デフォルトの名無しさん mailto:sage [2007/02/02(金) 00:21:04 ] >>136 サンクス。職場では恥かかんよう気をつけるよー。 >>137 Option Explicit Option Base 1 Sub testTwo() Dim rng As Range Dim outRng As Range Dim data() As Variant Dim cnt As Long Dim outCnt As Long Set rng = ActiveSheet.Range("B1") cnt = 1 Do While rng.Row <= 10 If rng.Value = "0:00" Then ReDim Preserve data(cnt) data(cnt) = rng.Offset(0, -1).Value cnt = cnt + 1 End If Set rng = rng.Offset(1) Loop Set outRng = ActiveWorkbook.Worksheets("潮位").Range("D1") For outCnt = 1 To cnt - 1 outRng.Value = data(outCnt) Set outRng = outRng.Offset(1) Next End Sub とりあえずD列に出してみた。 別シートに出力の際は潮位のところをそのシート名に変更すればよし、あとそのとなりをA1にするとA列にでる。
139 名前:デフォルトの名無しさん mailto:sage [2007/02/02(金) 00:25:16 ] ごめん。 Do While rng.Row <= 10 を Do While rng.Row <= 65500 あたりに変えといて。 ちなみに検索する行の最大数。 あと、なにも出力されないようなら、 if rng Value = "0:00" Then の 0:00 の部分をセルに表示されてる値ではなくて、 その右上らへんにある本当の値に変えてみて。
140 名前:デフォルトの名無しさん mailto:sage [2007/02/02(金) 00:29:36 ] っていうか、 VBAの勉強中だからついVBAで答えてしまったけれども・・・。 セルB1をクリック(選択) データ→フィルタ→オートフィルタ B1に三角がでるのでクリック 0:00を選択 orz...
141 名前:デフォルトの名無しさん [2007/02/02(金) 00:37:36 ] >>140 ありがとうございます。 オートフィルにすると、行が詰まってしまうので、 行間は白紙のまま置いておきたいのですよ。 >0:00 の部分をセルに表示されてる値ではなくて、 その右上らへんにある本当の値に変えてみて。 VBAでは出力されないのですが、もう少し教えてもらえますか。
142 名前:デフォルトの名無しさん mailto:sage [2007/02/02(金) 00:39:30 ] ここで無限ループ使った回答したら、素人にはブラクラ並の攻撃かもしれない と、ふと思った
143 名前:デフォルトの名無しさん mailto:sage [2007/02/02(金) 00:47:28 ] こっちのほうが安全じゃない? my_Row= Range("a65536").End(xlUp).Row for i = 1 to my_row 処理 next i
144 名前:デフォルトの名無しさん mailto:sage [2007/02/02(金) 00:48:48 ] そのままなら、こっちか。 my_Row= Range("a65536").End(xlUp).Row Do While rng.Row <= my_row
145 名前:デフォルトの名無しさん mailto:sage [2007/02/02(金) 00:52:51 ] >>141 Option Explicit Option Base 1 Sub testTwo() '変数定義 Dim row As Long row = 1 '正午のデータだけ取得 Do While row < 65500 If row Mod 24 <> 1 Then ActiveSheet.Range(Cells(row, 1), Cells(row, 2)).ClearContents End If row = row + 1 Loop End Sub 正午以外を消して空白を残す。 24行ごとに値があること前提だけども…。 手抜きでスマソ、そろそろ寝ようかと…。
146 名前:デフォルトの名無しさん mailto:sage [2007/02/02(金) 00:59:56 ] >141 追記。 一瞬止まるけども、処理が遅いだけなので。 (>>143 )方式で、 Do While row < 65500 を Dim myRow as Long myRow = Range("a65536").End(xlUp).Row Do While row < myRow にすると早くなりまする。 >>143 >>145 まったくその通りですな。 まだまだ良いやり方のテンプレみたいなのがぱっと浮かんでこないのよなぁ…。 >142 自分のテストでは無限ループしたいほうだいだけどね。 すみません放置します。 おやすみなさい。
147 名前:デフォルトの名無しさん mailto:sage [2007/02/02(金) 01:03:55 ] どうもでした。ペコリ。
148 名前:デフォルトの名無しさん mailto:sage [2007/02/02(金) 01:08:35 ] 成功しました。重ねてペコリ。 これで寝れそうです。
149 名前:125-126 mailto:sage [2007/02/02(金) 07:20:11 ] >>129-130 レスどうもです。 出ているエラーの件は、たまにしかエラーが出ないので エラーの内容を良く覚えてないのですが 「サポートされてない」みたいなエラーだったと思います。 do until構文を使う前にもsleepしてみて エラーが出るかどうか、しばらく様子を見てみます。
150 名前:デフォルトの名無しさん [2007/02/03(土) 01:28:07 ] ちょっと暇だったのでVisualBasicのヘルプ全部印刷してみた(両面) ヘルプ最高だな 高い金出してリファレンス買うぐらいならヘルプ印刷しといたほうが幸せだと気付いた つうか手元のリファレンス見たらヘルプ丸写しがあって萎えた
151 名前:デフォルトの名無しさん mailto:sage [2007/02/03(土) 22:06:07 ] そうか〜? 現実問題、リファレンスで一番重要なのは索引なのだけども オブジェクト名やメソッド名とかは印刷したものをアルファベット順に並べればいいとしても・・・ その他は・・・
152 名前:デフォルトの名無しさん [2007/02/03(土) 23:11:21 ] すみません。Vista/Excel2007で Application.Speech.Speak "日本語" をやると、英語なら何の設定もせずに読み上げるんですが、 日本語は読み上げません。 2003では設定すれば「ツール」→「音声」→「[読み上げ]ツールバー」ででたツールバーも 表示させる方法もわからないのですが、 どなたか、お教えいだけないでしょうか。
153 名前:デフォルトの名無しさん mailto:sage [2007/02/04(日) 00:19:46 ] 新しいものにすぐ飛びつく早漏の癖に 情報的な基盤の無いものを自力で使いこなしていく スキルも無い奴ってのは一番厄介だな 初心者ならシェアが広がるまで我慢汁垂らしながら待ってろよ
154 名前:デフォルトの名無しさん mailto:sage [2007/02/04(日) 00:21:56 ] >>150 両面印刷コストが20円として、100ページで2000円になる。 1000ページなら2万だし買った方が安くないか?
155 名前:デフォルトの名無しさん [2007/02/04(日) 01:22:42 ] コンピュータを用いた授業をしようと思うんですが、 VBAを用いて中学校数学の何か面白い教材を作ることできないかな??
156 名前:デフォルトの名無しさん mailto:sage [2007/02/04(日) 01:31:07 ] >>155 あるセルに好きな数字を入れると別なセルに数字が自動的に表示されて その計算方法を推理させるとか。 もちろん数字を変えていくことで推理可能な計算式を考えんといかんよ。 数字じゃなくて論理式でも面白い、ある言葉を入れると別な言葉に置き換えられるとか。 あなたのVBA習熟度がどのくらいか知らないけど。
157 名前:デフォルトの名無しさん mailto:sage [2007/02/04(日) 01:31:45 ] >>155 「面白い教材」を考えるのは教員の仕事。 お前が思いつけないなら、お前はその程度の教師ってことだ。 考えついた「面白い教材」の実現方法なら手助けしないこともないが 何が悲しくて教員でもないのにガキの嗜好に頭捻らにゃならんのだ?
158 名前:156 mailto:sage [2007/02/04(日) 01:34:02 ] >>157 正直スマンかった・・・
159 名前:デフォルトの名無しさん mailto:sage [2007/02/04(日) 01:46:55 ] いや、そういう返答は無視でw
160 名前:156 mailto:sage [2007/02/04(日) 01:55:35 ] いや、>>157 は言い方はあれだけど正論 写真屋スレで「キャラ絵描くんだけどどんなキャラがいい?」って聞く奴はおかしいのと同じ
161 名前:デフォルトの名無しさん mailto:sage [2007/02/04(日) 02:13:03 ] 言ってしまえば > 「面白い教材」の実現方法 だって教師の仕事なのに、それなら手助けしてやるって 言ってる時点で十二分に親切だな。
162 名前:デフォルトの名無しさん mailto:sage [2007/02/04(日) 02:16:26 ] Excel2007ってVBAの基本的言語仕様は変わってないんでしょうか? 例えばVB6.0のIntegerが16Bitなのが VS2005のVBだとIntegerが32Bitになってるみたいな
163 名前:155 [2007/02/04(日) 02:45:37 ] 私は数学教師ですが、VBAは全くといっていいほどの初心者です。 データから平均を出したり、総合得点を出して表示させるぐらいしか できません。 実現方法よりもどういったことができるかがよくわかっていないのです。 VBAにかなり詳しい方々が集まっているようなので、ご意見を参考に させていただきたかったのですが、予習をしてから出直してきます。 すいませんでした。
164 名前:デフォルトの名無しさん mailto:sage [2007/02/04(日) 03:08:23 ] >>163 藻前は本当に教師なのか? 数学の分からない厨房は数学をイメージできない 数値なんて表示させても糞の意味もない パソコンで学習させるなら、イメージを表示させてやる方がいい つまり、関数グラフとか図形を使いこなして表示させろってこった
165 名前:デフォルトの名無しさん mailto:sage [2007/02/04(日) 03:12:32 ] >>164
166 名前:デフォルトの名無しさん mailto:sage [2007/02/04(日) 04:52:17 ] >>163 エクセルVBAで色々できるよ。外部アプリケーション、例えばインターネットエクスプローラーの制御も出来るよ。 工夫すれば、それなりにエクセルVBAでゲームを作ることもできて エクセルVBAで作られたゲームのサンプルプログラム集とかも発売されてるよ。
167 名前:デフォルトの名無しさん mailto:sage [2007/02/04(日) 04:59:10 ] つうかさ、パソコン関係って何が出来るかって聞いていたら全然先に進めんぞ 自分は何がしたいって目的が最初であって、それを実現するにはVBAを選択するとか 他のモノを選択するとかすべき
168 名前:デフォルトの名無しさん [2007/02/04(日) 11:04:19 ] パソコンクラブでも作ってマニアな中学生に教えてもらえ 学習曲線は残念だけど物好きな中学生には勝てん 先生側は「教育の技術」で中学生と勝負しろよ ExcelVBAは開発環境と実行環境の距離が近くていい材料だと思うけどね
169 名前:デフォルトの名無しさん mailto:sage [2007/02/04(日) 11:47:54 ] >>163 子供が見て分かりやすいのは物理シミュレーション やはり目で見て動くと分かりやすい。 普通に教科書レベルの加速度とか落下だけでも結構面白い物が作れる ExcelでもShapeやUserFromの座標を指定できるわけで 日本のApple本社に学校の旅行で行った時に、 なんてソフトか忘れたけどBasic風の記述言語で 「初期値を設定してボール(カエルだったかも)をジャンプさせて、落ちてきたて跳ねる」 ってプログラムが課題だった ついでに速度や高さも表示する 設定値を間違えると果てまで飛んで行ったりして面白かったが。 数学なら幾何系とか確率系とかも分かりやすいかも
170 名前:デフォルトの名無しさん mailto:sage [2007/02/04(日) 11:50:05 ] 計算問題を自動で作って答えあわせをするコードとか 100マス計算とかできるんじゃない? でもそういうなのはネットを探せばいくらでも出てくるような気がする。
171 名前:デフォルトの名無しさん mailto:sage [2007/02/04(日) 12:30:10 ] >>170 数学を図式化して理解しやすくするのは良いが それは駄目だろ、餓鬼に頃は紙に文字を書いて計算しないと馬鹿になるぞ
172 名前:デフォルトの名無しさん mailto:sage [2007/02/04(日) 12:31:00 ] >>170
173 名前:デフォルトの名無しさん [2007/02/04(日) 14:19:00 ] あるExcelファイルを日付が変わったら自動起動させるようにするには、 どんな感じで実現したらよいのでしょうか・・? 日の定型処理をしているのですが、 忘れてしまう事が多々あるので自動化したいです。
174 名前:デフォルトの名無しさん mailto:sage [2007/02/04(日) 14:53:15 ] >>173 そんな曖昧な条件でどうしろと? 「あるExcelファイルを日付が変わったら自動起動」という条件だけなら OnTimeで0:00にブックを開くプロシージャを呼ぶだけだが、実際にはOnTimeが使える 状況では無いだろうし、ブックを開くのも「日付が変わったら=0:00」では困るのでは? 条件はエスパー以外の第三者にも伝わるように、日本語できちんと書こう。
175 名前:デフォルトの名無しさん mailto:sage [2007/02/04(日) 15:00:57 ] 多分タスクでOK。つまり、VBA云々ではなくWindowsの使い方の問題。
176 名前:デフォルトの名無しさん [2007/02/04(日) 16:00:52 ] excel4.0専用のスレが見当たらないのでここで失礼します。 excel4.0のマクロって最近のexcelでも当時と同じように記述できるの? なくなったマクロ関数や文法の変更なんかはないのかな? たとえば『=select(シート名!R[1]C[1])』と記述して実行すると、 目的のシートのアクティブセルではなくマクロシートのselect関数が 記述してあるセルから1行下で1列右のセルを選択してしまう。 これはexcel側の仕様変更によるものじゃないよね? もし記述の間違いによるものだったら正しい書き方を教えて。
177 名前:173 mailto:sage [2007/02/04(日) 19:26:01 ] >>174 すいません。今週末から勉強を始めたので理解が足りないかもしれません。 Webクエリを用いてあるHPの表データを取得し統計処理をしています。 統計処理はそのExcelファイルを起動すれば実行できるよう実装済。 そのHPの表データは00:10頃に日々更新されているので毎日実行したいです。 そこでこの時間がきたら自動的にExcelファイルを起動する方法は、 どうやるのかなと質問してみました。 よくウイルス等で特定の時間が来たら挙動するようなものもあるし、 出来ない事はないなだろうと。 実行条件は時間以外にも色々ありますがFlagや分岐をつけたりすれば、 何とかできるだろうという事で今回は質問しませんでした。 Googleで「VBA 自動起動」等と検索しても条件が悪いらしく、 上手く引っかからないのでキーワードだけでももらえればと思いました。 これ以上は上手く説明できません。ごめんなさい。 >>175 あっありがとうございます。 VBAではなくそんな方法だったんですね。 書き込み後の検索中にAccessで似たような質問にヒットした時、 APIでスケジュラーに・・なんて記述があったので、 関係あるのかと思っちゃいました。
178 名前:デフォルトの名無しさん mailto:sage [2007/02/04(日) 21:35:03 ] >>177 スタートボタンから、ヘルプとサポートをクリック、テキストボックスに at っていれてみ。 出てくるから スレ違いな話になってしまうんでこれでやめるけど。
179 名前:デフォルトの名無しさん [2007/02/04(日) 22:14:27 ] 誰か教えてください。 仕事で ある一定の条件を満たすレコードを足していくプログラムをかいたのですが、数字がおかしくなります。 例えば、足す数字が15.1 80.6 30.4となると出た数字が126.100015239みたいな数字になります。 これはなんでなんでしょうか?
180 名前:デフォルトの名無しさん [2007/02/04(日) 22:43:27 ] 小数点の演算というのは、CPUの仕組み上誤差が出るものなのだ。 仕組みや理由についてはは、「浮動小数点 誤差」とかでググるとそれっぽい解説のされてるとこがでるのでそこで確認してください。 Excelのシート上で、その見た目をどうにかしたければ、セル書式の設定で小数桁数1桁だかなんだかにすればよいです。
181 名前:デフォルトの名無しさん mailto:sage [2007/02/04(日) 23:35:39 ] 浮動小数点演算をIF文なんかで条件処理する場合 =つかっちゃ駄目なんだよなぁ
182 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 01:29:53 ] 基本的に割り算もだめですね
183 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 08:09:20 ] 整数値の割り算の場合は/でなく ¥(商) Mod(余り)を使えばなんとかなる
184 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 10:48:46 ] いま正規表現の検索フォームを作ってます 検索対象をusedrangeで取得してfor eachでまわしてます。 これで動作は問題ないのですが、対象が多いと時間がかかってしまいます。 そこで、rng=usedrangeと配列に代入して高速化しようとして問題にぶちあたりました。 配列に代入されるのがValueっぽいので、 セルに10:00の様に時間や日付が入っている場合 longになるので検索文字が10などと一致しません。 usedrang.textとして代入すると空になってしまいます。 配列に代入された文字の表示形式を調べて変換することも考えたのですが、 現状と大差ない感じがします。 シート上に表示されている値をまとめて配列に代入する方法か代替案がありましたら ご教授おねがいします。
185 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 10:53:50 ] クエリー
186 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 11:05:11 ] txt→CSV変換でなにか、いいサンプルコードないですか? 入力ファイル:oder.txt 出力ファイル:任意.csv csvに出力する時、元のtxtから不要データの排除と任意条件での集計 VBAかVBSで出来そうと思いいろいろ本読んで見たけど いかんせんCobolerなので、よくわかっとりません
187 名前:デフォルトの名無しさん [2007/02/05(月) 11:09:25 ] 元のテキストファイルのフォーマットはどのようなものですか? 固定長?
188 名前:デフォルトの名無しさん [2007/02/05(月) 11:36:51 ] Public Sub TextToCSV(ByVal pInPath As String, ByVal pOutPath As String) Const C_DELIM As String = "," '区切り文字 Dim s As String:Dim s2 As String:Dim ss() As String Dim fnoIn As Long: Dim fnoOut As Long 'ファイル開く fnoIn = FreeFile: Open pInPath For Input As #fnoIn fnoOut = FreeFile: Open pOutPath For Output As #fnoOut 'ファイル終了まで繰り返し Do While (EOF(fnoIn)) '1行読み出し Line Input #fnoIn, s '特定のバイト位置に区切り文字を入れた文字列を作成する。 'イメージ000001111122222⇒00000,11111,22222 s2 = Mid(s, 1, 5) & "," & Mid(s, 6, 5) & "," & Mid(s, 11, 5) '区切り文字が入った文字列をSplitで配列に出力 ss = Split(s2) '各要素のチェックをする If ss(0) = "99999" Then GoTo LOOP_NEXT 'ここまで来たら大丈夫のようなのでカンマ入り文字列(s2)CSVに出力する Print #fnoOut, s2 LOOP_NEXT: Loop Close #fnoIn: Close #fnoOut End Sub
189 名前:デフォルトの名無しさん [2007/02/05(月) 11:37:36 ] あータブとか消されてしまうのか。見づらいな。
190 名前:186 mailto:sage [2007/02/05(月) 15:09:56 ] >>187 固定で102byteです。 得意先がいい加減で、仕様も手探り状態なもので(泣 >>188 ありがとうございます。 このコードを参考にして、試行錯誤してみます。
191 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 17:01:11 ] >>190 得意先に仕様書無いと作れないと言えばいいじゃん。
192 名前:186 mailto:sage [2007/02/05(月) 18:04:31 ] >>191 言ったよ゚・(つД`)・゚・ 普段もらっている受注データとは別のもので。。。 特殊なパターンで、これしか渡せないと言われた。 txtデータと口頭で言われた項目(どこまでが**で**byteで、とか)だけ。 結局、自分たちで解析するしかなくて。。。 ホストのマスターに落とす必要ないのでVBSかAccessの類で出来ないか 考えてたんです。 ちなみに得意先はホ●ダ技研鈴鹿工場です バイクも車もホ●ダだが、こういう体質は好かん!
193 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 18:10:10 ] 大丈夫、他も似たようなもんだ。
194 名前:デフォルトの名無しさん [2007/02/05(月) 20:11:48 ] >>180 >>181 >>182 >>183 激しく感謝です。やっぱだめなんですね・・・^^;
195 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 21:04:29 ] >>194 つか<、>で範囲チェックすりゃいいじゃん
196 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 21:09:03 ] >>195 それはやっちゃダメ 結果的に同じでもコード的に意味が違ってしまう つまり可読性を損なう
197 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 21:18:55 ] >>196 どうしても出来ないときは いいじゃんコメント書いとけばいいんだから 全部そんなプログラム組んじゃいけないけど
198 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 21:20:09 ] 後は10とか100でかけて整数値にするかだな
199 名前:184 mailto:sage [2007/02/05(月) 21:59:21 ] >>185 俺にたいするレスと受け取っていいんですよね? 色々検索して ttp://www.microsoft.com/japan/technet/scriptcenter/resources/officetips/jun05/tips0607.mspx を参考にしてテストしてみたんですが、 やっぱり時間とかはきちんと取得できないんですけど、 (セルに10:00といれておくと0.5になる) これじゃないんでしょうか? 申し訳ないんですが、検索キーワードなど教えていただけると 助かります。 いや、助けてください
200 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 22:41:49 ] Dim tm As Date Dim buf As String tm = Cells(0, 0) buf = Format(tm, hh:mm") これで普通の文字列になるがな
201 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 22:42:29 ] buf = Format(tm," hh:mm")
202 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 22:45:10 ] 更にtmだけでも応用すりゃ検索もできる
203 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 23:08:56 ] >>200-202 おまえ、バカだろ。文字列にする方法なんてこの際問題じゃない。そんなの簡単に解る。 君のやり方で文字列化するなら、その前にその値が元々どういう表示形式で表示されていたか判断しなきゃならないんだよ。 そして>>184 に > 配列に代入された文字の表示形式を調べて変換することも考えたのですが、 とあるから、君の考えた方法は既に変わりきってる上で、表示形式をいちいち調べて文字列に変換してたら ValueではなくTextプロパティをループで読むのと大差ないってこった。
204 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 23:14:58 ] >>203 いや >>10 :00といれておくと0.5 と言う単なるヒントだ、そのまま使ったら馬鹿だが
205 名前:デフォルトの名無しさん [2007/02/06(火) 00:15:27 ] 10:00といれておくと0.5になるなら 逆に検索値を時間の場合10:00なら0.5にすりゃいんじゃねぇ?
206 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 00:35:33 ] それだと時間じゃない0.5もヒットするわけで
207 名前:デフォルトの名無しさん [2007/02/06(火) 01:07:40 ] データベース使っても結局Value値がセットされると・・・ 0.5でヒットしたらセル見にいって属性しらべたら? 少しはマシかも、0.5とかいっぱいあったら終わりだけど
208 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 01:23:47 ] Findじゃ遅いの?
209 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 01:27:24 ] findじゃだめなんだよ
210 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 01:32:58 ] あとはクエリ使って、ここで答えでないんなら データベース関係のスレで聞いてみたら?
211 名前:184 mailto:sage [2007/02/06(火) 01:35:12 ] 色々なレスありがとうございます。 最初の書き込みが携帯からで、内容をはしょりすぎて誤解があるようなので再度書き込みます。 A列)日付 B列)曜日 C列)作業名 D列)開始時刻 E列)終了時刻 F列)処理時間 G列)備考 が入っている複数のシートから正規表現で検索をしたいと思っています。 今の簡単なコードを書くと Set reg = CreateObject("VBScript.RegExp") With reg .Pattern = strPattern .IgnoreCase = True .Global = True end with For Each sh in Thisworkbook.Sheets For Each rng in sh.UsedRange If reg.test(rng.Text) Then 検索文字列が見つかったときの処理 Debug.? "[address]" & rng.Address & " [text]" & rng.Text & " [Formula]" & rng.Formula End If Next Next といった流れなのですが、検索対象が大量にあり処理に時間がかかってしまいます。(対象30万件で5分くらい) そこでFor Each rng in sh.UsedRangeをやめて、rng = sh.UsedRangeのように 配列にして、検索しようとしたところ、日付や時間(表示形式は[h]:mm)がLong型になるため srtPattern = "10" などに10:00などが該当しなくなります。 rng = sh.UsedRange.Formulaは代入がうまくいくのですが、rng = sh.UsedRange.Textはできないようです。 列ごとに時間や日付が入っているなら、そこだけ変換すりゃいーだろ、と言われそうですが 列がずれた場合や新たに項目が増えた場合を考えて、決め打ちで変換するのは出来れば避けたいと考えています。 説明下手ですいませんが、高速に処理する方法がありましたらご教授お願いします。
212 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 01:39:00 ] 件数多いなぁ、確実にデータベース使った方が良いと思うよ 漏れはやり方わからんが
213 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 01:42:57 ] >>列がずれた場合や新たに項目が増えた場合を考えて 列のセルに名前付けりゃいいんじゃないの?
214 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 01:56:50 ] > 列がずれた場合や新たに項目が増えた場合を考えて、 2行目(実データの1行目)の表示形式に合わせるって手もある 30万回表示形式取得したら相当遅くなるだろうが、列数分(現状7回)だけなら殆ど気にならないだろ
215 名前:たのんます [2007/02/06(火) 02:00:54 ] エクセルに関する質問なんですが 統計数字データをグラフに変換して、統計データによるグラフを作成する際に 統計データの始点と終点を同じにして、重ねて比べられるようなグラフにしたいのですが 統計データの量が、比較したいAとBでは異なるため、 始点終点を同じにして、重ねて比べることができません。 何か関数とかその他の方法で、 違うデータ量のものを重ねて比較する方法はないでしょうか?
216 名前:184 mailto:sage [2007/02/06(火) 02:08:44 ] 書き忘れましたが、正規表現を使いたい理由は作業名が入力者により、まちまちなのでまとめて検索したいからです。 誤)日付はDate型ですね。すいません。 0.5は12:00でした。すいません。 いま>>199 のリンク先のコードを改良してテストしてみたら、 10:00とかはちゃんと取れますね(表示10:00→取得値10:00:00でした) ただ24時間を越えるとダメみたいです(表示28:00→取得値1900/01/01 4:00:00でした) 日付も表示が1月1日でも2007/01/01でした。 何か指定する方法があるのかもしれませんが… >>208 Findって正規表現使えましたっけ?調べてみます >>210 なにぶんADOとか初めてなんでもう少し ttp://support.microsoft.com/?kbid=257819 とかを見て勉強してみます。 >>212 俺もそう思います >>213 名前を定義なども考えましたが、名前=範囲な訳で新規に項目が増えた場合にはコードを追加し 範囲別にコードを書かなければいけないので、試してません。 条件分岐で範囲(名前)別にコードを書く必要もないかもしれませんが、 ただでさえ件数が多く時間がかかるので、極力条件分岐などの処理をいれたくないので。 >>214 それは考えつきませんでした。試して見たいと思います。 色々ありがとうございました。自分でも試行錯誤してみようと思います。
217 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 02:16:11 ] >>216 Date型 は日付と時間一緒ですよ(小数点以下が時間) >名前を定義 範囲で名前付けるんじゃなく、1行目の1セルに名前付けて 呼び出せば行位置と列位置が分かる 列位置分かればなんの行か分かるでしょ
218 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 02:19:39 ] >>217 >名前を定義 と書いていて複数シートじゃ駄目だね・・・
219 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 02:20:11 ] >>215 あるけどマルチしたので教えません
220 名前:たのんます [2007/02/06(火) 02:49:33 ] すいません マルチの意味がわかりました、、、 してはいけないことと知りませんでした。 ただものすごく困っています。 色々調べても方法がなくて、、、 ご存知でしたら、何卒お教えいただけませんでしょうか? 以後こんな事をしてしまわないように気をつけます。
221 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 02:59:27 ] 今回のが教訓だ。ここで教えちゃったら教訓にならない。 「マルチしても謝れば教えてもらえる」程度に思っちゃうだろう。 今回マルチをしてしまった責は、今回答えてもらえないということで負い 以後気を付けることで、以後の質問では突き放されることはなくなる。 まぁマルチをしても、2chで仮初めの礼を言われることくらいしか楽しみのない 哀れな教えたがり君が答えてくれることもあるけどね。
222 名前:デフォルトの名無しさん [2007/02/06(火) 13:58:34 ] VBAでTerminateメソッドって使えないんでしょうか? VBAから起動しているアプリを終了したいんですが Set WshShell = CreateObject("WScript.Shell") WshShell.Terminate ("ファイルパス") と打ち込んでもエラーになっていまいます。 Set WshShell = CreateObject("WScript.Shell") WshShell.exec ("ファイルパス") で起動はできるようですが。 VBAを使って、windows上で起動しているアプリを終了させるには どうしたらいいんでしょうか?
223 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 14:25:54 ] >>222 Win32API使うかWMI使うかだな つーか全然VBAの質問じゃないし
224 名前:222 [2007/02/06(火) 14:34:30 ] え、これVBAの質問じゃないんですか? すいません。 これはAPIのスレに行けばいいんですかね?
225 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 15:09:04 ] VB言語でApplicationオブジェクト(ExcelやWord)を操作するからVisual Basic for Application、略してVBA。 Applicationオブジェクト(Excelではブック、シート、セルなどを含む)を操作しなかったら 例えExcelやWord付属のVBEで実行しようと、VBAの分野の話じゃ無い。 開発環境の方のVisual Basicでやるべき事を、ExcelやWord付属のVBEに持ってきてるだけだ。 VBAはあくまでもマクロ言語なのに、開発環境に匹敵するほど強力過ぎる故にその辺の区別が出来ない奴が多くて困る。 「VBAで」の部分を「VB6.0で」に置換しても通用しちゃうような話は、全部開発環境分野の話だと思ってくれ。 因みに君のレベルならWin32APIよりはWMIの方がいいと思うぞ。 でもどっちにしろスレで質問することばかり考えてないで自分で調べることを考えよう。 どうせWin32APIスレでは言語限定での丸投げ(コード書いてクレクレ)なんて聞いちゃくれないし。
226 名前:デフォルトの名無しさん mailto:sage [2007/02/07(水) 10:38:35 ] ADOを使用してエクセルのシートをデータベースにセットする場合 各セル毎のデータ形式でなく、全て文字列形式にしてセットする方法があるんでしょうか? (セルを全て文字列形式にするという方法は除いて) もしあるのなら、教えてください。
227 名前:デフォルトの名無しさん [2007/02/07(水) 14:47:01 ] >>221 何をエラそうに講釈たれてんだよ、バーカ。何も教えないくせに態度ばっかしデカいんだよ。
228 名前:デフォルトの名無しさん mailto:sage [2007/02/07(水) 14:56:05 ] ( ゚д゚)ポカーン
229 名前:デフォルトの名無しさん mailto:sage [2007/02/08(木) 00:50:04 ] マルチがなぜダメなのかを知っていればあんなに高飛車に 偉そうなことは言わないというのは間違いのない話であるよな。
230 名前:デフォルトの名無しさん mailto:sage [2007/02/08(木) 01:01:14 ] つうか >>226 の質問はスルーか
231 名前:デフォルトの名無しさん mailto:sage [2007/02/08(木) 03:03:30 ] if Do While ********* Loop end if こんな感じのプログラムのDoLoopを1秒たったら繰り返すような感じに出来ますか?
232 名前:デフォルトの名無しさん mailto:sage [2007/02/08(木) 03:36:24 ] >>231 Application.WaitなりWin32APIのSleepなりお好きなように
233 名前:デフォルトの名無しさん mailto:sage [2007/02/08(木) 17:02:10 ] >>232
234 名前:デフォルトの名無しさん [2007/02/08(木) 20:05:16 ] const aretsul = 1 DATA = "データファイル" Cells(row, aretsul).Text Cellsに「222123,」見たいな感じにデータが入ってるんですが、最後のコンマを消したいんです 最後の一文字を読み込まないようにするにはどうすればいいでしょうか?
235 名前:デフォルトの名無しさん mailto:sage [2007/02/08(木) 20:31:13 ] > 最後の一文字を読み込まないようにする Value値にも因るが、基本的に不可能。 読み込んだ後で、末尾の1文字を消すなら文字列操作関数でどうにでもなるけどね。
236 名前:デフォルトの名無しさん mailto:sage [2007/02/08(木) 21:21:27 ] >>234 left(cells(セルA,セルB), len(cells(セルA,セルB)) - 1) こんなんどう?(未テスト。やりたいことは伝わるかと) っていうか上の2行は?