●EXCEL・VBAの教えて ..
136:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/02/02 00:13:03
>>135
潮位というシートで作業しています。
138:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/02/02 00:25:16
ごめん。
Do While rng.Row <= 10
を
Do While rng.Row <= 65500
あたりに変えといて。
ちなみに検索する行の最大数。
あと、なにも出力されないようなら、
if rng Value = "0:00" Then
の
0:00 の部分をセルに表示されてる値ではなくて、
その右上らへんにある本当の値に変えてみて。
140:デフォルトの名無しさん
07/02/02 00:29:36
っていうか、
VBAの勉強中だからついVBAで答えてしまったけれども・・・。
セルB1をクリック(選択)
データ→フィルタ→オートフィルタ
B1に三角がでるのでクリック
0:00を選択
orz...
141:デフォルトの名無しさん
07/02/02 00:37:36
>>140
ありがとうございます。
オートフィルにすると、行が詰まってしまうので、
行間は白紙のまま置いておきたいのですよ。
>0:00 の部分をセルに表示されてる値ではなくて、
その右上らへんにある本当の値に変えてみて。
VBAでは出力されないのですが、もう少し教えてもらえますか。
142:デフォルトの名無しさん
07/02/02 00:39:30
ここで無限ループ使った回答したら、素人にはブラクラ並の攻撃かもしれない
と、ふと思った
143:デフォルトの名無しさん
07/02/02 00:47:28
こっちのほうが安全じゃない?
my_Row= Range("a65536").End(xlUp).Row
for i = 1 to my_row
処理
next i
144:デフォルトの名無しさん
07/02/02 00:48:48
そのままなら、こっちか。
my_Row= Range("a65536").End(xlUp).Row
Do While rng.Row <= my_row
145:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/02/02 01:03:55
どうもでした。ペコリ。
148:デフォルトの名無しさん
07/02/02 01:08:35
成功しました。重ねてペコリ。
これで寝れそうです。
149:125-126
07/02/02 07:20:11
>>129-130
レスどうもです。
出ているエラーの件は、たまにしかエラーが出ないので
エラーの内容を良く覚えてないのですが
「サポートされてない」みたいなエラーだったと思います。
do until構文を使う前にもsleepしてみて
エラーが出るかどうか、しばらく様子を見てみます。
150:デフォルトの名無しさん
07/02/03 01:28:07
ちょっと暇だったのでVisualBasicのヘルプ全部印刷してみた(両面)
ヘルプ最高だな
高い金出してリファレンス買うぐらいならヘルプ印刷しといたほうが幸せだと気付いた
つうか手元のリファレンス見たらヘルプ丸写しがあって萎えた
151:デフォルトの名無しさん
07/02/03 22:06:07
そうか〜?
現実問題、リファレンスで一番重要なのは索引なのだけども
オブジェクト名やメソッド名とかは印刷したものをアルファベット順に並べればいいとしても・・・
その他は・・・
152:デフォルトの名無しさん
07/02/03 23:11:21
すみません。Vista/Excel2007で
Application.Speech.Speak "日本語"
をやると、英語なら何の設定もせずに読み上げるんですが、
日本語は読み上げません。
2003では設定すれば「ツール」→「音声」→「[読み上げ]ツールバー」ででたツールバーも
表示させる方法もわからないのですが、
どなたか、お教えいだけないでしょうか。
153:デフォルトの名無しさん
07/02/04 00:19:46
新しいものにすぐ飛びつく早漏の癖に
情報的な基盤の無いものを自力で使いこなしていく
スキルも無い奴ってのは一番厄介だな
初心者ならシェアが広がるまで我慢汁垂らしながら待ってろよ
154:デフォルトの名無しさん
07/02/04 00:21:56
>>150
両面印刷コストが20円として、100ページで2000円になる。
1000ページなら2万だし買った方が安くないか?
155:デフォルトの名無しさん
07/02/04 01:22:42
コンピュータを用いた授業をしようと思うんですが、
VBAを用いて中学校数学の何か面白い教材を作ることできないかな??
156:デフォルトの名無しさん
07/02/04 01:31:07
>>155
あるセルに好きな数字を入れると別なセルに数字が自動的に表示されて
その計算方法を推理させるとか。
もちろん数字を変えていくことで推理可能な計算式を考えんといかんよ。
数字じゃなくて論理式でも面白い、ある言葉を入れると別な言葉に置き換えられるとか。
あなたのVBA習熟度がどのくらいか知らないけど。
157:デフォルトの名無しさん
07/02/04 01:31:45
>>155
「面白い教材」を考えるのは教員の仕事。
お前が思いつけないなら、お前はその程度の教師ってことだ。
考えついた「面白い教材」の実現方法なら手助けしないこともないが
何が悲しくて教員でもないのにガキの嗜好に頭捻らにゃならんのだ?
158:156
07/02/04 01:34:02
>>157
正直スマンかった・・・
159:デフォルトの名無しさん
07/02/04 01:46:55
いや、そういう返答は無視でw
160:156
07/02/04 01:55:35
いや、>>157は言い方はあれだけど正論
写真屋スレで「キャラ絵描くんだけどどんなキャラがいい?」って聞く奴はおかしいのと同じ
161:デフォルトの名無しさん
07/02/04 02:13:03
言ってしまえば
> 「面白い教材」の実現方法
だって教師の仕事なのに、それなら手助けしてやるって
言ってる時点で十二分に親切だな。
162:デフォルトの名無しさん
07/02/04 02:16:26
Excel2007ってVBAの基本的言語仕様は変わってないんでしょうか?
例えばVB6.0のIntegerが16Bitなのが
VS2005のVBだとIntegerが32Bitになってるみたいな
163:155
07/02/04 02:45:37
私は数学教師ですが、VBAは全くといっていいほどの初心者です。
データから平均を出したり、総合得点を出して表示させるぐらいしか
できません。
実現方法よりもどういったことができるかがよくわかっていないのです。
VBAにかなり詳しい方々が集まっているようなので、ご意見を参考に
させていただきたかったのですが、予習をしてから出直してきます。
すいませんでした。
164:デフォルトの名無しさん
07/02/04 03:08:23
>>163
藻前は本当に教師なのか?
数学の分からない厨房は数学をイメージできない
数値なんて表示させても糞の意味もない
パソコンで学習させるなら、イメージを表示させてやる方がいい
つまり、関数グラフとか図形を使いこなして表示させろってこった
165:デフォルトの名無しさん
07/02/04 03:12:32
>>164
166:デフォルトの名無しさん
07/02/04 04:52:17
>>163
エクセルVBAで色々できるよ。外部アプリケーション、例えばインターネットエクスプローラーの制御も出来るよ。
工夫すれば、それなりにエクセルVBAでゲームを作ることもできて
エクセルVBAで作られたゲームのサンプルプログラム集とかも発売されてるよ。
167:デフォルトの名無しさん
07/02/04 04:59:10
つうかさ、パソコン関係って何が出来るかって聞いていたら全然先に進めんぞ
自分は何がしたいって目的が最初であって、それを実現するにはVBAを選択するとか
他のモノを選択するとかすべき
168:デフォルトの名無しさん
07/02/04 11:04:19
パソコンクラブでも作ってマニアな中学生に教えてもらえ
学習曲線は残念だけど物好きな中学生には勝てん
先生側は「教育の技術」で中学生と勝負しろよ
ExcelVBAは開発環境と実行環境の距離が近くていい材料だと思うけどね
169:デフォルトの名無しさん
07/02/04 11:47:54
>>163
子供が見て分かりやすいのは物理シミュレーション
やはり目で見て動くと分かりやすい。
普通に教科書レベルの加速度とか落下だけでも結構面白い物が作れる
ExcelでもShapeやUserFromの座標を指定できるわけで
日本のApple本社に学校の旅行で行った時に、
なんてソフトか忘れたけどBasic風の記述言語で
「初期値を設定してボール(カエルだったかも)をジャンプさせて、落ちてきたて跳ねる」
ってプログラムが課題だった
ついでに速度や高さも表示する
設定値を間違えると果てまで飛んで行ったりして面白かったが。
数学なら幾何系とか確率系とかも分かりやすいかも
170:デフォルトの名無しさん
07/02/04 11:50:05
計算問題を自動で作って答えあわせをするコードとか
100マス計算とかできるんじゃない?
でもそういうなのはネットを探せばいくらでも出てくるような気がする。
171:デフォルトの名無しさん
07/02/04 12:30:10
>>170
数学を図式化して理解しやすくするのは良いが
それは駄目だろ、餓鬼に頃は紙に文字を書いて計算しないと馬鹿になるぞ
172:デフォルトの名無しさん
07/02/04 12:31:00
>>170
173:デフォルトの名無しさん
07/02/04 14:19:00
あるExcelファイルを日付が変わったら自動起動させるようにするには、
どんな感じで実現したらよいのでしょうか・・?
日の定型処理をしているのですが、
忘れてしまう事が多々あるので自動化したいです。
174:デフォルトの名無しさん
07/02/04 14:53:15
>>173
そんな曖昧な条件でどうしろと?
「あるExcelファイルを日付が変わったら自動起動」という条件だけなら
OnTimeで0:00にブックを開くプロシージャを呼ぶだけだが、実際にはOnTimeが使える
状況では無いだろうし、ブックを開くのも「日付が変わったら=0:00」では困るのでは?
条件はエスパー以外の第三者にも伝わるように、日本語できちんと書こう。
175:デフォルトの名無しさん
07/02/04 15:00:57
多分タスクでOK。つまり、VBA云々ではなくWindowsの使い方の問題。
176:デフォルトの名無しさん
07/02/04 16:00:52
excel4.0専用のスレが見当たらないのでここで失礼します。
excel4.0のマクロって最近のexcelでも当時と同じように記述できるの?
なくなったマクロ関数や文法の変更なんかはないのかな?
たとえば『=select(シート名!R[1]C[1])』と記述して実行すると、
目的のシートのアクティブセルではなくマクロシートのselect関数が
記述してあるセルから1行下で1列右のセルを選択してしまう。
これはexcel側の仕様変更によるものじゃないよね?
もし記述の間違いによるものだったら正しい書き方を教えて。
177:173
07/02/04 19:26:01
>>174
すいません。今週末から勉強を始めたので理解が足りないかもしれません。
Webクエリを用いてあるHPの表データを取得し統計処理をしています。
統計処理はそのExcelファイルを起動すれば実行できるよう実装済。
そのHPの表データは00:10頃に日々更新されているので毎日実行したいです。
そこでこの時間がきたら自動的にExcelファイルを起動する方法は、
どうやるのかなと質問してみました。
よくウイルス等で特定の時間が来たら挙動するようなものもあるし、
出来ない事はないなだろうと。
実行条件は時間以外にも色々ありますがFlagや分岐をつけたりすれば、
何とかできるだろうという事で今回は質問しませんでした。
Googleで「VBA 自動起動」等と検索しても条件が悪いらしく、
上手く引っかからないのでキーワードだけでももらえればと思いました。
これ以上は上手く説明できません。ごめんなさい。
>>175
あっありがとうございます。
VBAではなくそんな方法だったんですね。
書き込み後の検索中にAccessで似たような質問にヒットした時、
APIでスケジュラーに・・なんて記述があったので、
関係あるのかと思っちゃいました。
178:デフォルトの名無しさん
07/02/04 21:35:03
>>177
スタートボタンから、ヘルプとサポートをクリック、テキストボックスに at っていれてみ。
出てくるから
スレ違いな話になってしまうんでこれでやめるけど。
179:デフォルトの名無しさん
07/02/04 22:14:27
誰か教えてください。
仕事で ある一定の条件を満たすレコードを足していくプログラムをかいたのですが、数字がおかしくなります。
例えば、足す数字が15.1 80.6 30.4となると出た数字が126.100015239みたいな数字になります。
これはなんでなんでしょうか?
180:デフォルトの名無しさん
07/02/04 22:43:27
小数点の演算というのは、CPUの仕組み上誤差が出るものなのだ。
仕組みや理由についてはは、「浮動小数点 誤差」とかでググるとそれっぽい解説のされてるとこがでるのでそこで確認してください。
Excelのシート上で、その見た目をどうにかしたければ、セル書式の設定で小数桁数1桁だかなんだかにすればよいです。
181:デフォルトの名無しさん
07/02/04 23:35:39
浮動小数点演算をIF文なんかで条件処理する場合
=つかっちゃ駄目なんだよなぁ
182:デフォルトの名無しさん
07/02/05 01:29:53
基本的に割り算もだめですね
183:デフォルトの名無しさん
07/02/05 08:09:20
整数値の割り算の場合は/でなく
¥(商) Mod(余り)を使えばなんとかなる
184:デフォルトの名無しさん
07/02/05 10:48:46
いま正規表現の検索フォームを作ってます
検索対象をusedrangeで取得してfor eachでまわしてます。
これで動作は問題ないのですが、対象が多いと時間がかかってしまいます。
そこで、rng=usedrangeと配列に代入して高速化しようとして問題にぶちあたりました。
配列に代入されるのがValueっぽいので、
セルに10:00の様に時間や日付が入っている場合
longになるので検索文字が10などと一致しません。
usedrang.textとして代入すると空になってしまいます。
配列に代入された文字の表示形式を調べて変換することも考えたのですが、
現状と大差ない感じがします。
シート上に表示されている値をまとめて配列に代入する方法か代替案がありましたら
ご教授おねがいします。
185:デフォルトの名無しさん
07/02/05 10:53:50
クエリー
186:デフォルトの名無しさん
07/02/05 11:05:11
txt→CSV変換でなにか、いいサンプルコードないですか?
入力ファイル:oder.txt
出力ファイル:任意.csv
csvに出力する時、元のtxtから不要データの排除と任意条件での集計
VBAかVBSで出来そうと思いいろいろ本読んで見たけど
いかんせんCobolerなので、よくわかっとりません
187:デフォルトの名無しさん
07/02/05 11:09:25
元のテキストファイルのフォーマットはどのようなものですか?
固定長?
188:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/02/05 11:37:36
あータブとか消されてしまうのか。見づらいな。
190:186
07/02/05 15:09:56
>>187
固定で102byteです。
得意先がいい加減で、仕様も手探り状態なもので(泣
>>188
ありがとうございます。
このコードを参考にして、試行錯誤してみます。
191:デフォルトの名無しさん
07/02/05 17:01:11
>>190
得意先に仕様書無いと作れないと言えばいいじゃん。
192:186
07/02/05 18:04:31
>>191
言ったよ゚・(つД`)・゚・
普段もらっている受注データとは別のもので。。。
特殊なパターンで、これしか渡せないと言われた。
txtデータと口頭で言われた項目(どこまでが**で**byteで、とか)だけ。
結局、自分たちで解析するしかなくて。。。
ホストのマスターに落とす必要ないのでVBSかAccessの類で出来ないか
考えてたんです。
ちなみに得意先はホ●ダ技研鈴鹿工場です
バイクも車もホ●ダだが、こういう体質は好かん!
193:デフォルトの名無しさん
07/02/05 18:10:10
大丈夫、他も似たようなもんだ。
194:デフォルトの名無しさん
07/02/05 20:11:48
>>180>>181>>182>>183
激しく感謝です。やっぱだめなんですね・・・^^;
195:デフォルトの名無しさん
07/02/05 21:04:29
>>194
つか<、>で範囲チェックすりゃいいじゃん
196:デフォルトの名無しさん
07/02/05 21:09:03
>>195
それはやっちゃダメ
結果的に同じでもコード的に意味が違ってしまう
つまり可読性を損なう
197:デフォルトの名無しさん
07/02/05 21:18:55
>>196
どうしても出来ないときは
いいじゃんコメント書いとけばいいんだから
全部そんなプログラム組んじゃいけないけど
198:デフォルトの名無しさん
07/02/05 21:20:09
後は10とか100でかけて整数値にするかだな
199:184
07/02/05 21:59:21
>>185
俺にたいするレスと受け取っていいんですよね?
色々検索して
URLリンク(www.microsoft.com)
を参考にしてテストしてみたんですが、
やっぱり時間とかはきちんと取得できないんですけど、
(セルに10:00といれておくと0.5になる)
これじゃないんでしょうか?
申し訳ないんですが、検索キーワードなど教えていただけると
助かります。
いや、助けてください
200:デフォルトの名無しさん
07/02/05 22:41:49
Dim tm As Date
Dim buf As String
tm = Cells(0, 0)
buf = Format(tm, hh:mm")
これで普通の文字列になるがな
201:デフォルトの名無しさん
07/02/05 22:42:29
buf = Format(tm," hh:mm")
202:デフォルトの名無しさん
07/02/05 22:45:10
更にtmだけでも応用すりゃ検索もできる
203:デフォルトの名無しさん
07/02/05 23:08:56
>>200-202
おまえ、バカだろ。文字列にする方法なんてこの際問題じゃない。そんなの簡単に解る。
君のやり方で文字列化するなら、その前にその値が元々どういう表示形式で表示されていたか判断しなきゃならないんだよ。
そして>>184に
> 配列に代入された文字の表示形式を調べて変換することも考えたのですが、
とあるから、君の考えた方法は既に変わりきってる上で、表示形式をいちいち調べて文字列に変換してたら
ValueではなくTextプロパティをループで読むのと大差ないってこった。
204:デフォルトの名無しさん
07/02/05 23:14:58
>>203
いや
>>10:00といれておくと0.5
と言う単なるヒントだ、そのまま使ったら馬鹿だが
205:デフォルトの名無しさん
07/02/06 00:15:27
10:00といれておくと0.5になるなら
逆に検索値を時間の場合10:00なら0.5にすりゃいんじゃねぇ?
206:デフォルトの名無しさん
07/02/06 00:35:33
それだと時間じゃない0.5もヒットするわけで
207:デフォルトの名無しさん
07/02/06 01:07:40
データベース使っても結局Value値がセットされると・・・
0.5でヒットしたらセル見にいって属性しらべたら?
少しはマシかも、0.5とかいっぱいあったら終わりだけど
208:デフォルトの名無しさん
07/02/06 01:23:47
Findじゃ遅いの?
209:デフォルトの名無しさん
07/02/06 01:27:24
findじゃだめなんだよ
210:デフォルトの名無しさん
07/02/06 01:32:58
あとはクエリ使って、ここで答えでないんなら
データベース関係のスレで聞いてみたら?
211:184
07/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:デフォルトの名無しさん
07/02/06 01:39:00
件数多いなぁ、確実にデータベース使った方が良いと思うよ
漏れはやり方わからんが
213:デフォルトの名無しさん
07/02/06 01:42:57
>>列がずれた場合や新たに項目が増えた場合を考えて
列のセルに名前付けりゃいいんじゃないの?
214:デフォルトの名無しさん
07/02/06 01:56:50
> 列がずれた場合や新たに項目が増えた場合を考えて、
2行目(実データの1行目)の表示形式に合わせるって手もある
30万回表示形式取得したら相当遅くなるだろうが、列数分(現状7回)だけなら殆ど気にならないだろ
215:たのんます
07/02/06 02:00:54
エクセルに関する質問なんですが
統計数字データをグラフに変換して、統計データによるグラフを作成する際に
統計データの始点と終点を同じにして、重ねて比べられるようなグラフにしたいのですが
統計データの量が、比較したいAとBでは異なるため、
始点終点を同じにして、重ねて比べることができません。
何か関数とかその他の方法で、
違うデータ量のものを重ねて比較する方法はないでしょうか?
216:184
07/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とか初めてなんでもう少し
URLリンク(support.microsoft.com)
とかを見て勉強してみます。
>>212
俺もそう思います
>>213
名前を定義なども考えましたが、名前=範囲な訳で新規に項目が増えた場合にはコードを追加し
範囲別にコードを書かなければいけないので、試してません。
条件分岐で範囲(名前)別にコードを書く必要もないかもしれませんが、
ただでさえ件数が多く時間がかかるので、極力条件分岐などの処理をいれたくないので。
>>214
それは考えつきませんでした。試して見たいと思います。
色々ありがとうございました。自分でも試行錯誤してみようと思います。
217:デフォルトの名無しさん
07/02/06 02:16:11
>>216
Date型 は日付と時間一緒ですよ(小数点以下が時間)
>名前を定義
範囲で名前付けるんじゃなく、1行目の1セルに名前付けて
呼び出せば行位置と列位置が分かる 列位置分かればなんの行か分かるでしょ
218:デフォルトの名無しさん
07/02/06 02:19:39
>>217
>名前を定義
と書いていて複数シートじゃ駄目だね・・・
219:デフォルトの名無しさん
07/02/06 02:20:11
>>215
あるけどマルチしたので教えません
220:たのんます
07/02/06 02:49:33
すいません マルチの意味がわかりました、、、
してはいけないことと知りませんでした。
ただものすごく困っています。
色々調べても方法がなくて、、、
ご存知でしたら、何卒お教えいただけませんでしょうか?
以後こんな事をしてしまわないように気をつけます。
221:デフォルトの名無しさん
07/02/06 02:59:27
今回のが教訓だ。ここで教えちゃったら教訓にならない。
「マルチしても謝れば教えてもらえる」程度に思っちゃうだろう。
今回マルチをしてしまった責は、今回答えてもらえないということで負い
以後気を付けることで、以後の質問では突き放されることはなくなる。
まぁマルチをしても、2chで仮初めの礼を言われることくらいしか楽しみのない
哀れな教えたがり君が答えてくれることもあるけどね。
222:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/02/06 14:25:54
>>222
Win32API使うかWMI使うかだな
つーか全然VBAの質問じゃないし
224:222
07/02/06 14:34:30
え、これVBAの質問じゃないんですか?
すいません。
これはAPIのスレに行けばいいんですかね?
225:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/02/07 10:38:35
ADOを使用してエクセルのシートをデータベースにセットする場合
各セル毎のデータ形式でなく、全て文字列形式にしてセットする方法があるんでしょうか?
(セルを全て文字列形式にするという方法は除いて)
もしあるのなら、教えてください。
227:デフォルトの名無しさん
07/02/07 14:47:01
>>221
何をエラそうに講釈たれてんだよ、バーカ。何も教えないくせに態度ばっかしデカいんだよ。
228:デフォルトの名無しさん
07/02/07 14:56:05
( ゚д゚)ポカーン
229:デフォルトの名無しさん
07/02/08 00:50:04
マルチがなぜダメなのかを知っていればあんなに高飛車に
偉そうなことは言わないというのは間違いのない話であるよな。
230:デフォルトの名無しさん
07/02/08 01:01:14
つうか
>>226
の質問はスルーか
231:デフォルトの名無しさん
07/02/08 03:03:30
if
Do While
*********
Loop
end if
こんな感じのプログラムのDoLoopを1秒たったら繰り返すような感じに出来ますか?
232:デフォルトの名無しさん
07/02/08 03:36:24
>>231
Application.WaitなりWin32APIのSleepなりお好きなように
233:デフォルトの名無しさん
07/02/08 17:02:10
>>232
234:デフォルトの名無しさん
07/02/08 20:05:16
const aretsul = 1
DATA = "データファイル" Cells(row, aretsul).Text
Cellsに「222123,」見たいな感じにデータが入ってるんですが、最後のコンマを消したいんです
最後の一文字を読み込まないようにするにはどうすればいいでしょうか?
235:デフォルトの名無しさん
07/02/08 20:31:13
> 最後の一文字を読み込まないようにする
Value値にも因るが、基本的に不可能。
読み込んだ後で、末尾の1文字を消すなら文字列操作関数でどうにでもなるけどね。
236:デフォルトの名無しさん
07/02/08 21:21:27
>>234
left(cells(セルA,セルB), len(cells(セルA,セルB)) - 1)
こんなんどう?(未テスト。やりたいことは伝わるかと)
っていうか上の2行は?
237:デフォルトの名無しさん
07/02/08 21:40:45
>>235 >>236
238:デフォルトの名無しさん
07/02/08 21:58:30
ごめん、ビジネスsoft板のExcel総合スレで聞いたんだけど、こっちの方がよさげなので、
すみませんがマルチさせていただきます。
以下、コピペですが、エラーを防ぐ原因と方法を知ってる方いたら教えてください。
すみません、VBAのことで質問です。
リンク先のプログラムで、コマンドボタンを押した後に表示されるフォーム(モーダレス)の
コマンドボタンを押して処理を実行中にシートをダブルクリックしたりすとエラーで落ちちゃう
んですが、これを防ぐにはフォームをモーダルでshowするしかないですかね?
URLリンク(555.sytes.net)
239:デフォルトの名無しさん
07/02/08 22:35:29
>>238
原因不明なのですが、試してみてくれませんでしょうか?
ループの前に
Application.ScreenUpdating = false
ループの後に
Application.ScreenUpdating = true
スペルミスあったらごめんなさい。
240:238
07/02/08 22:46:43
>>239
ありがとうございますm(_ _)m
教えていただいた通りにしたらエラーがでなくなりました。
Application.ScreenUpdating = false で画面の更新を一時的に止めてやるんですね。
Formをmodalで表示しなくてもこの方法ならいけそうです!
241:デフォルトの名無しさん
07/02/09 01:38:11
>>226
242:デフォルトの名無しさん
07/02/09 01:45:38
>>241
243:デフォルトの名無しさん
07/02/12 10:41:46
すみませんが質問です。
ユーザーフォームにテキストボックス若しくはラベルを作り、
そこに文字を電光掲示板のように文字をスクロールさせる事は可能ですか?
244:デフォルトの名無しさん
07/02/12 10:49:33
タイマー作って文字列を更新しろ
245:デフォルトの名無しさん
07/02/12 11:39:55
Alt + PrintScreenで、画面のハードコピーをとって、
エクセルシートに貼り付ける時に、
そのハードコピーの拡大率は100%ですよね。
これを80%の拡大率で貼り付けたい時はどうすればよいのでしょうか?
貼り付けた後に、拡大率を変更するのは面倒なので。
(エクセルシート自体は100%のままで)
246:デフォルトの名無しさん
07/02/12 12:22:16
sub 貼りつけ
const ZOOM_RATE AS SINGLE = 0.8
ActiveSheet.Paste
Selection.ShapeRange.LockAspectRatio = msoTrue
Selection.ShapeRange.Height = Selection.ShapeRange.Height * ZOOM_RATE
Selection.ShapeRange.Width = Selection.ShapeRange.Width * ZOOM_RATE
end sub
どのプロパティ実現できるか分からないときは、マクロの記録を活用すると良いですよ。
247:243
07/02/12 17:24:50
>>244
なめらかに文字を流したいのですが・・・
248:デフォルトの名無しさん
07/02/12 17:27:26
>>247
ラベルの位置を微調整するとか、自前で文字描画するとか、まぁ頑張って。
249:243
07/02/12 17:31:17
>>248
簡単にできる方法ってないんですね・・・
何とかがんばってみます!
250:デフォルトの名無しさん
07/02/12 18:06:55
いや、簡単だろ
251:デフォルトの名無しさん
07/02/12 18:12:42
質問です。
Office2007 Excelでマクロの記録機能で、テキストボックスを表示して、テキストボックス内に文字を表示するといったマクロを記録しましたが、テキストボックスに関するマクロが一切記録されません。
何か個別に設定が必要なのでしょうか?
252:デフォルトの名無しさん
07/02/13 15:53:09
そのテキストボックス自分で実装したなら無理じゃね?
253:デフォルトの名無しさん
07/02/13 19:25:13
質問があります。
たとえばA1:D50までの表がありその中に3桁の数値が入っているのですが、
そのなかに指定した1桁の数値(H1に入力した数値)が(3桁のいずれかに)含まれるセルに色をつけたいのです。
また、関係ないかもしれないですが、表には空欄がある場合があります。
どうしたらいいでしょか。
お力をお貸しください。
254:デフォルトの名無しさん
07/02/13 20:07:08
>>253
条件付き書式でも出来るが、VBAでやりたいなら単にループ回してInStrあたりでその数字が含まれてるかどうか調べればいいだけじゃん。
第二第三引数は数値渡しても自動で文字列化されるし、戻り値をそのまま条件に出来る。
255:デフォルトの名無しさん
07/02/14 15:53:03
教えてください!
VBAからマクロの記録を終了させたり開始させたりする事って
出来るのでしょうか?
Application.CommandBars("Stop Recording").Visible = True
strTempBuff = CommandBars("Stop Recording").Controls(1).Caption
If Not strTempBuff = "新しいマクロの記録(&R)..." Then
'記録中なら停止したい。
xlApp.Application.CommandBars("Stop Recording").Controls(1).Execute '同じErr
xlApp.Application.CommandBars("Stop Recording").Controls("記録終了(&R)").Execute '同じErr
End If
上記コードで実行すると、マクロ記録中の場合
オートメーションエラーが発生してしまいます。
既にマクロが走っているからでしょうか?
256:デフォルトの名無しさん
07/02/14 23:16:03
すみませぬが質問です。フォームにラベルを作り、そのラベルにランダムの行数のセルを表示させ、
ちょっと時間をおいてその隣のセルを表示させる、というプログラムを作りましたが
上手いこといきません。アドバイス下さいませ。
Option Explicit
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
'メイン
Private Sub userform_initialize()
Call 表示
End Sub
'表示
Sub 表示()
'乱数発生
Randomize
Dim 行番号 As Long
Dim 乱数 As Long
行番号 = Worksheets("sheet1").Range("a65536").End(xlUp).Row
乱数 = Int(Rnd * 行番号) + 1
Label1.Caption = Cells(乱数, 1).Value
Sleep (1000)
Label1.Caption = Cells(乱数, 2).Value
End Sub
257:デフォルトの名無しさん
07/02/15 00:01:44
>>256
なにが上手いこといかないのか良く分からないんですが、
きっとエラーになるのではなくて、いきなり表示がCells(乱数,2)の値に
なると仮定してレス
Private Sub userform_initialize()
はFormが表示されるまえに起こるイベントなんで、
表示されたときにはCells(乱数,2)が表示されてしまうと思います。
あとは、
Label1.Caption = Cells(乱数, 1).Value
'追加↓
DoEvents
Sleep (1000)
Label1.Caption = Cells(乱数, 2).Value
と、DoEventsを入れないと
Sub 表示()の処理がすべて終わるまで
表示が更新されないと思いますよ。
258:デフォルトの名無しさん
07/02/15 00:30:37
アクティブセルに色付けするとき、どう指定するんでしょうか?
range("A1").interior.colorindex=36
などという例は見たのですが、特定のセルじゃなく、アクティブなセルとして指定する場合を教えてください。
259:デフォルトの名無しさん
07/02/15 00:43:08
range("A1")の変わりにActiveCellって書けばいいだけじゃん。
何でそんなことも調べられないの?
「アクティブなセル」でヘルプ検索したらすぐ出てくるのに。
260:デフォルトの名無しさん
07/02/15 00:50:17
カーソル移動したセルの色変えたいなら
イベントと組み合わせて使えばよい
261:258
07/02/15 00:59:28
>>259
それも試しにやってみたのですが、色が変わらないので間違っているのかと。
ちなみにユーザー定義関数内でやろうとしていて以下のようにしてもoutputはでますが、
色が出ないんです。指定がおかしいのでしょうか?
Function color(work)
ActiveCell.Interior.ColorIndex = 36
color = "color" & work
End Function
262:デフォルトの名無しさん
07/02/15 01:18:30
>>261
普通にできてしまったのですが…。
Function test()
ActiveCell.Interior.ColorIndex = 36
End Function
同じですよね、多分?
263:デフォルトの名無しさん
07/02/15 01:25:42
>>262
たびたびすみません。同じだと思うのですが・・・。
やろうとしていることは、
・ユーザー定義関数を作ろうとしていて(ここでいうcolorという関数)
・計算結果がある値をとればセルの色を変える
というもので、上述のcolorという関数はそれをおもいっきり簡略化したものです。
やっぱり上手くいかないです・・・
もしかして根本的にわたしが勘違いしているのかもしれません。ユーザー定義関数とマクロは別物ということでしょうか?
264:デフォルトの名無しさん
07/02/15 01:27:47
263補足
>>262さんのを登録後、エクセル上で=test()と任意のセルに入力しても
ゼロと表示されるだけで色は変わりませんでした・・・
265:デフォルトの名無しさん
07/02/15 01:29:16
引数のworkには何が入る予定なの?
266:デフォルトの名無しさん
07/02/15 01:30:49
あー、分かった。
セルでセル関数のようにはマクロのユーザー関数は使えないよ。
ツールメニュー→マクロ→color(自分で作ったユーザ関数)を選らんで、
その時点で使うわけ。
267:デフォルトの名無しさん
07/02/15 01:30:54
>>265
ただの文字列です。
268:デフォルトの名無しさん
07/02/15 01:34:30
「セルの計算結果」って言ってるのは、
=SUM(R[-3]C:R[-1]C) ←こういう奴の話を言ってるんだよね?
で、このイコールのところに自分で作った関数を入れたいってことよね?
結論から言えば、できないんじゃないかなあ。
269:268
07/02/15 01:37:15
ごめん!
ウソ言ってた。
できたよ。
270:デフォルトの名無しさん
07/02/15 01:37:24
>>261
> ユーザー定義関数内でやろうとしていて
先に書けよ。
ユーザー定義関数ってのは引数を計算して、式を入れたセルに値を返す物で
書式設定だのなんだのというシート上の操作を行うものじゃないぞ。
だからアクティブセルを取得することは出来るが操作は出来ない。それがユーザー定義関数ってものだ。
指定がおかしいんじゃなくて、やろうとしている事に対してユーザー定義関数を使おうとしているのがおかしい。
取得が出来てることはDebug.Print ActiveCell.Address(0, 0)を入れればわかるだろう。
操作がしたいならイベントを使え。
271:デフォルトの名無しさん
07/02/15 01:38:10
URLリンク(www.relief.jp)
272:デフォルトの名無しさん
07/02/15 01:48:01
>>268
そういうやつですね。
文字列の長さからいろいろと計算させる予定でした。
結果的にダメっぽいですね。
いろいろとありがとうございました。
>>270
イベントでやるしかないのですね。
>それがユーザー定義関数ってものだ。
名言の匂いがしますね。使わせて頂きます。
>>271
参考になりました。
273:デフォルトの名無しさん
07/02/15 01:48:02
265+266+268+269
あとはがんばって〜。寝るわ。
274:デフォルトの名無しさん
07/02/15 03:47:04
Const a = 1
Const b = 2
Const c = 3
Sub main()
a1 = 1
b1 = 1
c1 = 1
cells_a = 0
cells_b = 0
cells_c = 0
Do While cells(a1, a).Text <> ""
a1 = a1 + 1
cells_a = cells_a + 1
Loop
Do While cells(b1, b).Text <> ""
b1 = b1 + 1
cells_b = cells_b + 1
Loop
Do While cells(c1, c).Text <> ""
c1 = c1 + 1
cells_c = cells_c + 1
Loop
cells(1, 5).Value = cells_a
cells(2, 5).Value = cells_b
cells(3, 5).Value = cells_c
End Sub
このプログラムを短くできませんか?
275:デフォルトの名無しさん
07/02/15 04:39:47
配列使うと1/3近くには出来るかも知れないが
速度は落ちるんじゃないかな
276:デフォルトの名無しさん
07/02/15 10:09:42
>>274
Const a = 1
Const b = 2
Const c = 3
Sub main()
a1 = 1:b1 = 1:c1 = 1
With Application.WorksheetFunction
cells(1, 5).Value = .Count(Range(Cells(a1,a),Cells(a1,a).End(xlDown)))
cells(2, 5).Value = .count(Range(Cells(b1,b),Cells(b1,b).End(xlDown)))
cells(3, 5).Value = .count(Range(Cells(c1,c),Cells(c1,c).End(xlDown)))
End With
End Sub
試してないけど、とかじゃダメなのか?
277:256
07/02/15 10:51:13
>>257
お答えありがとうございます。説明不足ですみませんでした。
御推察のとおり、1つ目のセルは表示されずに2つ目が表示されてしまっていました。
で、>>257様の誤解を参考にして色々試したのですが、どうにもうまくいきません。
もう少しだけヒント頂けないでしょうか?
278:sage
07/02/15 13:13:37
>>277
何を試してどうだめだったのか書かないと…
とりあえず自分の環境では普通に動く
フォームを表示したときに表示したければ
UserForm_Activaue()内で
Callしてみれば?
とりあえず、F8でステップインしながら
動きを確認してみることをお勧めするよ
後はDebug.Printするとか。
ローカルウィンドウで
変数に期待通りの値が
はいってるか確認する方法もあるし。
なんにしても情報が少なすぎだと思いますよ
279:デフォルトの名無しさん
07/02/15 13:18:21
うはぁ
あげちった…
携帯からレスするもんじゃないな…
280:デフォルトの名無しさん
07/02/15 14:18:22
他人事ながら
×UserForm_Activaue()
○UserForm_Activate()
横レス失礼
281:256
07/02/15 16:06:37
>>278,>>280
またまた説明足らずで申し訳ありませんでした。
で、ご指摘の方法でちゃんと出来ました!
自分の持ってるVBAの本が初心者用のものだったため、
UserForm_Active()とか全然載ってなくて方法が分かりませんでした。
今回はどうもありがとうございました!
282:デフォルトの名無しさん
07/02/15 16:27:59
VBに高階関数とかってないの?関数に関数を引数として渡したいだけなんだけど。
283:デフォルトの名無しさん
07/02/15 16:49:21
>>282
AddressOf
284:デフォルトの名無しさん
07/02/15 19:07:28
>>283
おお、サンクス
285:デフォルトの名無しさん
07/02/15 19:31:06
ダイアログボックスで入力された年・月にしたがってカレンダーを表示するマクロを作っています。
年・月は文字列として取得、それを日付型にデータ変換して日付型の変数に代入しているのですが、
そこで「実行時エラー'11': 0で除算しました。」とのエラーが出ます。
DateValue関数を使う、日付型の変数を Variant型に変える、を試してみましたが、
結果は同じでした。
文字型の変数を Variant型に変えると、最初に1回エラーが出たあとその後は出なくなりましたが、
カレンダー表示の処理のところで日付を誤認してしまいます。
現在は On Error Resume Next でエラーを抑制して動かしており、
本来の目的であるカレンダー表示はそれで問題なくできておりますが、
可能であればエラー自体出ないようにしたいと思っています。
どこが悪いのかアドバイスをお願いします。
テストコード
Sub test()
Dim strInput As String
Dim datDay As Date
strInput = InputBox("年と月を入力してください。(例)「2007 2」")
datDay = CDate(strInput)
MsgBox datDay
End Sub
環境
Mac OS X 10.4.8
Excel 2004 for Mac ver. 11.3(060914)
以上よろしくお願いします。
286:デフォルトの名無しさん
07/02/15 20:46:35
VBAのソースで右側に長くなって見づら苦なってきたのでソースの内容はそのままで改行することってできませんか?
普通に改行するとエラーが出てしまいます。
287:デフォルトの名無しさん
07/02/15 21:01:35
MsgBox _
"VBAのソースで右側に長くなって" & vbCrLf & _
"見づら苦なってきたので" & vbCrLf & _
"ソースの内容はそのままで" & vbCrLf & _
"改行することってできませんか?" & vbCrLf & _
vbCrLf & _
"普通に改行するとエラーが出てしまいます。"
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5375日前に更新/123 KB
担当:undef