09/03/23 00:08:34
>>377
なんか本気で自覚がなさそうだから親切に教えてあげるけど、
デフォルトのプロパティがどうとか正解が知りたいんじゃなくて
「煽りがウザイ」って遠回しに言ってるんだと思うぞ。
プログラマーの精神年齢が低いのは世界共通の現象らしく、
とある海外のプログラミングの入門書にも
「まず大人になれ」みたいに書いてあって吹いたわ。
383:デフォルトの名無しさん
09/03/23 00:10:19
プロパティの重要度も分かってない奴が適当な回答して悦に浸るのは間違ってる。
>>365ではコピペしようと試みてるのに、destination使ってコピしてる>>368のコードは違うと言いきってるし。
どういうこっちゃ。
だいたいから、なんで .value を省略する馬鹿が多いんだ?
プロパティ省略なんて百害あって一利無しだ。
可読性もひったくれもあったもんじゃない。
384:デフォルトの名無しさん
09/03/23 00:11:04
なんでマジになってるの?
385:デフォルトの名無しさん
09/03/23 00:11:07
まあ今の時点でValueやらTextやら書いてもどうせ意味分からんだろうし
省略してることで壁に当たったとき、もう一度勉強しなおせばいいさ
386:デフォルトの名無しさん
09/03/23 00:11:36
プロパティの呼び方も分かってない奴がプログラマーとか笑わせるなよw
マジで。
387:デフォルトの名無しさん
09/03/23 00:12:03
> 百害あって一利無しだ。
コードが短くなるという利があるでしょ
388:デフォルトの名無しさん
09/03/23 00:12:21
皮肉や嫌みが通じないのは、目の前のコードを100%文法通りに解釈する訓練を受けた弊害だな
389:デフォルトの名無しさん
09/03/23 00:13:28
プロパティは知らなくても俺には関係ないが、それなら copyメソッドを勧めるべきだろ。
390:デフォルトの名無しさん
09/03/23 00:14:10
>>387
横から突っ込むけど
それって利点なのか?w
必要なことを表現してない短縮って百害あ(ry・・・以下ループ
391:デフォルトの名無しさん
09/03/23 00:15:53
古いバージョンのVBAだとRange( )よりRange( ).Valueのがかなり高速だったんだけど、
今のバージョンでは差が出ないんだよな。
当のMSもデフォルトプロパティの省略は推奨してないんだけど、言うことを聞かない
日曜プログラマが多いから仕様を変更したんかな。
392:デフォルトの名無しさん
09/03/23 00:19:44
一般論として、変に省略すると、うっかり複数のセルが選択された状態でマクロを呼んだら
エラーになったり関係ない周囲のセルを書き換えたりすることがあるから
もうちょっと丁寧にコーディングした方がいいと思う。
393:デフォルトの名無しさん
09/03/23 00:19:50
右辺を省略すると誤作動起こす可能性があるぞ。
394:デフォルトの名無しさん
09/03/23 16:22:07
xp 2003のADODB.Streamに関する質問です
shift-jisで読み込んだファイルをutf-8に変換して
バイナリモードにして.Wirteした後にさらにバイナリデータを追記したいのですが
.Write bytData
.Write chr(10)
とすると'実行時エラー3001'になってしまいます。
どうかご教示よろしくお願いいたします。
With SecondObj
.Position = 0
.Type = adTypeBinary
.Position = 3 '先頭から削除する文字数
bytData = .read
.Write bytData
.Write 追加したい文字列
.SaveToFile saveFile, adSaveCreateOverWrite
.Close
End With
395:デフォルトの名無しさん
09/03/23 16:42:29
Write バイト配列
396:デフォルトの名無しさん
09/03/23 17:40:17
すいません。
シートにプリントスクリーンで貼り付けた写真や図やらがあるのですが、
定期的に全て削除したいのですが、
VBAでやりたいと思います。
調べたのですが分かりませんでした。
識者の方、ご教授お願い致します。
なおexcel=2000
OS=2000
でう。宜しくお願い致します。
397:デフォルトの名無しさん
09/03/23 18:51:22
どう調べて、どこが分からなかったのか?
まずはそれをそっとささやいて欲しい
398:デフォルトの名無しさん
09/03/23 19:20:12
>>397
すいませんでした。
ネットと手持ちの本で調べたのですがのっていません。
自分でやったら、
数式
データ
書式設定
これらは削除できるのですが、
プリントスクリーンの画像だけは残ってしまいます。
399:デフォルトの名無しさん
09/03/23 21:59:21
>>398
なんかシートごと消した方がいいような感じの発言ですね
でも一応
For Each shp In ActiveSheet.Shapes
shp.Delete
Next shp
でアクティブなシートのシェイプが全部消えるよ
400:デフォルトの名無しさん
09/03/23 23:18:54
>>399
有難うございます!!!
今やったら出来ました。
大感激です!!!!!
本当に有難うございました!
401:デフォルトの名無しさん
09/03/23 23:44:09
>シートにプリントスクリーンで貼り付けた写真や図やらがあるのですが、
>定期的に全て削除したいのですが、
興味本位だけどどういう使い方してんの?
402:デフォルトの名無しさん
09/03/23 23:54:03
すみません初歩的な質問なんですが
オートフィルタで抽出した可視セルの値を配列変数に代入したのですが
うまくいきません。
Sub test()
Dim atai() As Variant
Dim gyo() As intger
Sheets(1).Range("A1").AutoFilter 3, ">0"
ReDim atai(0), gyo(0)
atai(0) = Sheets(1).Range("A2", Range("A2").End(xlDown)).SpecialCells(xlCellTypeVisible).Value
gyo(0) = Sheets(1).Range("A2", Range("A2").End(xlDown)).SpecialCells(xlCellTypeVisible).Count
Sheets(2).Range("A2", "A" & gyo(0)).Value = atai(0)
End Sub
上記のコードではうまく配列に値を代入できません。
どなたかご教授願います。
403:デフォルトの名無しさん
09/03/24 00:32:50
>>402
おかしな部分が多すぎて、どこから教えたらいいのか…
自分で考えながら作るのもいいけど、まずはマクロの記録やってみ?
無駄がないように手順を良く考えてから、余計なキーを押さないよう、
余計な場所をクリックしないよう、慎重に操作しながら記録してみて、
それでもできあがったマクロは無駄が多いから、
それを自分で修正していくのがいいと思う。
404:デフォルトの名無しさん
09/03/24 00:50:11
↑自動記録でどうやって配列変数に値を代入するの?
405:デフォルトの名無しさん
09/03/24 01:22:04
>>401
株です。
ライトカッターって言うソフトで下部のチャートを切り取って、
それで明日の作戦を立てるのですが、
一週間もすると莫大なページを消費してなにが何だかになるので、
今回のVBAが必要になりました。
406:デフォルトの名無しさん
09/03/24 01:25:55
オートフィルタに1件もひっかからなかった場合を考慮してないから注意な
Sub test()
Dim atai() As Variant
Dim gyo As Long
Dim i As Long
Dim R As Range
Sheets(1).Activate
Range("A1").AutoFilter Field:=1, Criteria1:=">0"
Set R = Range("A2", Range("A" & Rows().Count).End(xlUp))
gyo = R.SpecialCells(xlCellTypeVisible).Count
ReDim atai(gyo - 1)
i = 0
For Each C In R.SpecialCells(xlCellTypeVisible)
atai(i) = C.Value
i = i + 1
Next
R.Copy Destination:=Sheets(2).Range("A1")
End Sub
407:デフォルトの名無しさん
09/03/24 01:31:26
>>404
少なくとも最初のエラーはマクロの記録で解決するはず
自分で直せる部分は自力でやらせる方針なんで
408:デフォルトの名無しさん
09/03/24 02:08:30
質問です。
エクセル2003を使ってグラフの散布図作成するマクロを作っているのですが
データの範囲に変数使用する方法が分かりません。
マクロの記録で
Charts.Add
ActiveChart.ChartType = xlXYScatter
ActiveChart.SetSourceData Source:=Sheets("Sheet1").Range("J4")
ActiveChart.SeriesCollection.NewSeries
ActiveChart.SeriesCollection(1).XValues = "=Sheet1!R1C3:R300C3"
ActiveChart.SeriesCollection(1).Values = "=Sheet1!R1C1:R300C1"
ActiveChart.Location Where:=xlLocationAsObject, Name:="Sheet1"
これを作成したあと、グラフの読み込む範囲が今300なのに対して
ここの300を変数に格納した数値を利用して変化させたいのです。
ActiveChart.SeriesCollection(1).XValues = "=Sheet1!R1C3:R300C3"
ActiveChart.SeriesCollection(1).Values = "=Sheet1!R1C1:R300C1"
ここにどのように変数を絡めたらいいのでしょうか。
変数には、行の一番最後を記録しています。
宜しくお願いします。
409:デフォルトの名無しさん
09/03/24 02:16:47
>>408
gyou = 300
ActiveChart.SeriesCollection(1).XValues = "=Sheet1!R1C3:R" & gyou & "C3"
ActiveChart.SeriesCollection(1).Values = "=Sheet1!R1C1:R" & gyou & "C1"
とか
410:408
09/03/24 02:24:39
>>409
ありがとうございます。
その&の前後の半角スペースが必須なのですね…。
そのやり方を試していたんですが、やっと解決しました。
本当に助かりました!!!
411:デフォルトの名無しさん
09/03/24 02:31:21
スペースの有無で&記号の意味が変わるのってVBの最大の欠点だよな。
誰でも一度ははまったことあるはず。
412:デフォルトの名無しさん
09/03/24 07:47:15
c言語より後にできたくせにc言語より駄目な言語ばっかりで凹むよね
413:デフォルトの名無しさん
09/03/24 22:25:05
VBSのRegExpをユーザー定義関数としてADDIN化するとか、
Excelの機能自体を拡張出来るスクリプトとしては優秀だな。
ワークシート関数で、リアルタイムで正規表現使えるのは便利だYo!
使ってる人多いから、ADDIN、ADDONもネットで簡単に拾えるし楽ちん。
414:デフォルトの名無しさん
09/03/25 21:39:13
質問です。
forをつかってstr(i)に繰り返しデータを入れるようにして、
複数のボタンのキャプションを設定したいと考えてます。
bt1、bt2、bt3…と一部の数字だけ違うのですが、
上手くループで処理する方法はありますでしょうか。
415:デフォルトの名無しさん
09/03/25 21:50:13
>>414
Controls
416:デフォルトの名無しさん
09/03/25 22:15:32
ありがとうございます!
後、追加で知りたいんですが、
空のセルをstring型に取り込むと、空のままだと思うんですが、
それをcase文で判定するには、nullや””じゃうまくいきません。
セルが空の時は何かまた違う値が入るんでしょか?
417:デフォルトの名無しさん
09/03/25 22:58:00
セルの初期値はEmpty(定数:vbEmpty)だけど、Emptyなら「Case ""」にマッチするはずだし
String型変数にEmptyを代入するとNullStringに変換されるので、尚更「Case ""」で問題ない。
因みにNullString(定数:vbNullString)は""と同義ね。
「Case ""」にマッチしないなら、セルが空ではない可能性が高いと思う。
Debug.Print Len(変数)
若しくは
Debug.Print Len(セル)
で、0になるか確認してみそ。0じゃなかったら空セルじゃないってこった。
418:デフォルトの名無しさん
09/03/25 23:38:31
>>417
ありがとうございます。
一応、msgboxで確認してました。
今よくよく考えたら、""ではなく、" "にしちゃってたかも知れないです^^;
もうアドバイスを踏まえ、もう一度試してみます!
419:デフォルトの名無しさん
09/03/25 23:57:58
ちょっと色々やってみたんですが、controlsを使うものがうまくいきません。。。
Controls("CommandButton" & "i").Caption = "test"
というのを、ソースに直接書いても動かないんでしょうか?
Me. Controls("CommandButton" & "i").Caption = "test"
にしても動きません。
ネットで探してみても、Moduleに書け的な事もありますが、
Public Sub chg(ByVal i As Integer)
End Sub
の間に書いて、callしても動きません。
どこがいけないでしょうか?
420:デフォルトの名無しさん
09/03/26 00:08:18
変数「 i 」が「 1 」だとして
Controls("CommandButton" & "i")
だと、ボタン名は
CommandButtoni だぞ。
CommandButton1 なら
Controls("CommandButton" & "i") ではなく
Controls("CommandButton" & i) だ。
こういうのもMsgBoxやDebug.Printで
MsgBox "CommandButton" & "i"
などを確認すればすぐに解ることなので、そういう問題起きたら
動かねーって騒ぐ前に初歩的な確認を行う癖を付けようぜ。
421:デフォルトの名無しさん
09/03/26 07:42:12
すいません。
書き間違えました。
ソースはしっかりiのみで、””で囲んではないです;;
422:デフォルトの名無しさん
09/03/26 07:54:11
Me. Controls
↑このスペースはNGだ。
これも書き間違いなら
Me.CommandButton1.Caption = "test"
が動くか試せ。
423:デフォルトの名無しさん
09/03/26 07:59:19
ソースはコピペしろ
書き間違いがなくなるし早いだろ
424:デフォルトの名無しさん
09/03/26 09:28:58
すいません。セルを選択して、選択したところから左側のセルに、
「時刻」「日付」をそれぞれセルに書き込むコードを書いたのです。
該当部分のコードは
なのですが、そうしたら、時刻しか現れず、日付が出ません。
あれこれやって見て分かったのですが、
時刻と日付の順序を反対にすると
ActiveCell.Offset(0, -13).Range("A1").Select
Selection.Value = Date
ActiveCell.Offset(0, -14).Range("A1").Select
Selection.Value = Time
こうすると、日付は出るものの、今度は時刻が現れません。
色々試行錯誤をしたのですが、なぜか分からず困っています。
識者の方、何卒ご教授お願い致します。
なお、
excel:2000
OS;win2000です。
宜しくお願い致します。
425:デフォルトの名無しさん
09/03/26 09:33:11
>>424
セルの書式
426:424
09/03/26 09:33:52
>>424です。コードが一部抜けてました。>>424は破棄し、
丸々訂正させてください。丸々1から書き直すと下記になります。
すいません。セルを選択して、選択したところから左側のセルに、
「時刻」「日付」をそれぞれセルに書き込むコードを書いたのです。
該当部分のコードは
ActiveCell.Offset(0, -14).Range("A1").Select
Selection.Value = Time
ActiveCell.Offset(0, -13).Range("A1").Select
Selection.Value = Date
なのですが、そうしたら、時刻しか現れず、日付が出ません。
あれこれやって見て分かったのですが、
コードの時刻と日付の順序を反対にすると
ActiveCell.Offset(0, -13).Range("A1").Select
Selection.Value = Date
ActiveCell.Offset(0, -14).Range("A1").Select
Selection.Value = Time
こうすると、日付は出るものの、今度は時刻が現れません。
色々試行錯誤をしたのですが、なぜか分からず困っています。
識者の方、何卒ご教授お願い致します。
なお、
excel:2000
OS;win2000です。
宜しくお願い致します。
427:デフォルトの名無しさん
09/03/26 09:45:43
あのさ、そのコードだと日付と時刻のセルの間が12~13列空くってことは解ってるか?
間違っても日付と時刻が隣同士にはならないぞ。
とりあえずエスパーすると
ActiveCell.Offset(0, -14).Range("A1").Value = Time
ActiveCell.Offset(0, -13).Range("A1").Value = Date
で良いんじゃないかと思うのだが。
428:424
09/03/26 09:58:12
>>427
有難うございます!!!あっけなく出来ました。
感謝です。
しかし、
>そのコードだと日付と時刻のセルの間が12~13列空くってことは解ってるか?
これは分かってますが、
>間違っても日付と時刻が隣同士にはならないぞ。
え?これがなぜだかサッパリ分かりません。
少なくとも隣り合うと思うのですが。
>>426でも
(0,-14)(0,-13)
と位置を指定したのですから、-14の次の数字は-13ですから、
少なくとも隣り合うと思っていたのですが。。。
一応本は読みました。
私のコードのどこがいけないのか、
もう少しご指摘願えないでしょうか。
429:424
09/03/26 09:59:37
>>425
有難うございます。しかしそれではなかったです。
430:デフォルトの名無しさん
09/03/26 10:00:21
offsetで - の値を使うときは用心すべし。
どうしても使うならば、
if activecell.columns < 13 then
を挟むとかしてエラー回避しないと、何ともお粗末になってしまうよ。
431:デフォルトの名無しさん
09/03/26 10:04:17
if activecell.columns < 13 then
↓
if activecell.column < 13 then に訂正。
>>429
ActiveCell.Offset(0, -13).Range("A1").Select
Selection.Value = Date
ActiveCell.Offset(0, -14).Range("A1").Select
Selection.Value = Time
activecell.column が100で開始したとき、
offset(0,-13) で、87 を "select" してるでしょ。
んで、次に offset(0,-14) を "select” してるから、73に書かれる。
select したら activecellの場所変わるでそ。
432:424
09/03/26 10:14:10
>>430
>>431
431さんご親切に有難うございます。
>select したら activecellの場所変わるでそ。
そういうことか!!!と思いました。
ご指摘頂きやっと意味が分かりました。
>>431のご説明は、間違えたコードの下にメモとしてコーピーさせて頂きます。
勉強不足を感じました。
本当に有難うございました。
433:デフォルトの名無しさん
09/03/26 12:39:51
Controls("CommandButton" & i)でもやはり動きません…
subかfunctionがないと言われます。
またMeなどつけてもオブジェクトがおかしいと言われます。
何か宣言しないといけないとかありますか?
434:デフォルトの名無しさん
09/03/26 17:50:32
>>433
Controlsはフォーム上のコンポーネントにしか使えない。
ワークシートに貼り付けたボタンの場合はControlsじゃなくて
Worksheets("Sheet1").OLEObjects("CommandButton" & i).Object.Caption = "test"
435:デフォルトの名無しさん
09/03/26 19:40:44
>>433
>>414ではコマンドボタンのオブジェクト名が bt1、bt2…だけど、実際のオブジェクト名は?
436:デフォルトの名無しさん
09/03/26 19:47:13
エラーメッセージが「Sub または Function が定義されていません。」なら
>>434で正解の可能性が高い。
質問するときはエラーメッセージを1文字も間違えずにそのまま書くのが基本だよ。
たとえ意味が通じても、勝手に略しちゃだめ。悪い例→「subかfunctionがない」
それにメッセージをそのまま検索すればたいてい解決方法が見つかる。
437:デフォルトの名無しさん
09/03/27 00:11:47
質問です。
ブックオープン時に、publicのstringに
セルを読み込んでいます。
最初のうちはうまい事その中身を使えるんですが、
ずっとブックを開いたままにしていると、
気が付いたら変数の中身が変わってるのか、
消えるのか分かりませんが、最初の状態ではなくなってしまいます。
変数に値を入れたものを
ずっと保持しておく事はできないんでしょうか?
438:デフォルトの名無しさん
09/03/27 00:18:40
>>434>>436
ありがとうございます!
ご教授頂いた記述でうまくいきました。
>>435
携帯から書き込んでいて面倒だったので省きましたが、実際は普通にCommandButton1です。
439:デフォルトの名無しさん
09/03/27 02:34:06
>>437
Option Explicitは書いてある?
440:デフォルトの名無しさん
09/03/27 07:44:28
>>439
書いてないです。
それを書けば延々保持され続けるんでしょうか?
441:デフォルトの名無しさん
09/03/27 09:00:01
モジュールレベル変数の値は
・任意に代入、初期化
・モジュール内編集
しない限りは保持される。
誤って気付かない内に初期化するコードを書いてる可能性が無いのに不意に初期化されてるなら、
「モジュール内編集」に因るものの可能性が高い。
「モジュール内編集」とは、モジュールレベルの宣言部(Public xxx As Stringとか書いてるところ)
を書き替えるとか、新しいプロシージャを作成・削除するとか(既存のプロシージャ内の編集は非該当)
デザインモードを使用するとかね。
「モジュール内編集」を行ったらモジュールレベル変数が初期化されるのは当然のことでそれはどうしようも無い。
442:デフォルトの名無しさん
09/03/27 12:41:21
まぁ、それ以外にも初期化されることがあるんだけどな
443:デフォルトの名無しさん
09/03/27 13:16:52
例えば?
444:デフォルトの名無しさん
09/03/27 13:52:32
[VBA] Public 宣言された変数の有効期間
URLリンク(support.microsoft.com)
445:デフォルトの名無しさん
09/03/27 13:56:29
あー、そのページで、「モジュール内編集」以外が何なのか明記しておいた方がいいか。
・プロジェクトの構造の変更
・コンパイルエラーの発生
・コントロールを削除して [元に戻す] を実行する
ちなみに、そのほかにも初期化されることが経験上あった。
いずれにせよ「何もしてないつもりでも、変数が初期化されることはありうる」という前提で
プログラミングすべきで、意図しない初期化が困る場合は、シートに値を保存するなどを
しておく必要がある。
446:デフォルトの名無しさん
09/03/27 13:58:27
あー、さらに追加。
「そのほかにも」の内容は、「なにもしてないつもり」だったので、何なのかは具体的にはわからない。
447:デフォルトの名無しさん
09/03/27 15:29:13
へー
448:デフォルトの名無しさん
09/03/27 22:23:21
>>437
static
449:デフォルトの名無しさん
09/03/27 23:01:14
staticでも無力ですがな
450:デフォルトの名無しさん
09/03/27 23:38:26
モジュールレベルの変数が初期化されるとき
つまりモジュールが初期化されるときは
モジュールレベルのプロシージャも初期化され
プロシージャレベルで保持されるStatic変数も
プロシージャの初期化に伴い当然初期化される
451:デフォルトの名無しさん
09/03/28 00:23:02
ななめ読みしてレスで悪いんだけど、非表示シートに書き込んでおけば?
452:デフォルトの名無しさん
09/03/28 02:06:03
すいません。
もし選択したセルがA1であれば、B1の値を7にする。
というのは何とかできました。
If ActiveCell = Range("A1") Then
Range("B1").Value = 7
End If
これと似たように
もし選択したセルがA1からA10のいずれかであれば、B1の値を7にする。
というのが出来ず困っています。一応下記のようにしましたが
If ActiveCell = Range("A1:A10") Then
Range("B1").Value = 7
End If
どうしても出来ません。
もし出来なければ、
「選択したセルがA列のいずれかであればB1の値を7にする。」
ということでも良いのですが。
識者の方お力をかしていただけないでしょうか。
宜しくお願い致します。
なおexcel:ver2000
OS:win2000になります。
宜しくお願い致します。
453:デフォルトの名無しさん
09/03/28 02:34:27
If ActiveCell.Column = "1" Then
454:デフォルトの名無しさん
09/03/28 02:45:24
>>453
有難うございます!
今日はもう遅いので、明日試させていただき、
追って報告します。
455:452
09/03/28 02:53:18
すいません。列のいずれか、というのを教えていただき本当に助かります。
感謝してます。
しかし出来れば、
「もし選択したセルがA1からA10のいずれかであれば、B1の値を7にする。」
というケースも分かれば嬉しいなと思います。、
どなたか教えていただければ助かります。
456:デフォルトの名無しさん
09/03/28 03:16:16
If Not Intersect(ActiveCell, Range("A1:A10")) Is Nothing Then
Range("B7").Value = 7
End If
457:デフォルトの名無しさん
09/03/28 13:00:11
ここは質問スレだがおまえの宿題手伝いスレじゃねーぞ
んなクソ簡単な命令くらい自分で調べて作れアホ
458:452
09/03/28 13:39:05
>>453
有難うございます!出来ました!助かりました。
>>456
有難うございます!
出来ました。
お二人に助けていただき、エラーを防ぐプログラムが出来るようになりました。
本当に感謝します。
>>457
勘違いしてます。私は既に自分で調べて、試行錯誤して、
それでも分からなかったのでここで聞いてます。
>んなクソ簡単な命令くらい自分で調べて作れアホ
クソ簡単って。。。
自分まだVBA初めて10日ぐらいなんですよ。
あなたにとってはそんな簡単なこと、でも私にとっては
チンプンカンプンで難しいことが一杯あるんですよ。
でもなんとか自分で試行錯誤してるうちに、
これでも最初に比べれば飛躍的に自分で対処できるようになったんですよ。
459:デフォルトの名無しさん
09/03/28 13:54:26
>>458
> 自分まだVBA初めて10日ぐらいなんですよ。
>>361
> VBA;多少使えます。
> VBA;多少使えます。
> VBA;多少使えます。
ふ~ん
460:デフォルトの名無しさん
09/03/28 13:57:14
>>1
> ★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み
> コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。
> ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。
お前のやってることはまるで教えてクンだ
461:デフォルトの名無しさん
09/03/28 16:10:19
まあ俺の顔に免じてゆるしてやれよ
462:デフォルトの名無しさん
09/03/28 17:33:27
>>457
心のちーせーやろーだなぁw
463:デフォルトの名無しさん
09/03/28 18:34:21
亀レスだけど・・・。
>>437
シートに保持させるのが嫌なら、レジストリに放り込んでおくとか、
CGIでインターネットに変数保管しておくのはどう?
464:デフォルトの名無しさん
09/03/28 20:22:59
>>463
>CGIでインターネットに変数保管しておくのはどう?
ネットにつながらない環境の時とか接続に失敗したらどうするのさ
465:デフォルトの名無しさん
09/03/28 20:41:40
それが問題になるなら、それを選択しなければ良いだけじゃね?
466:デフォルトの名無しさん
09/03/28 22:32:23
bookopenのイベントでレジストリキー書き換えが強固だな。
467:デフォルトの名無しさん
09/03/28 23:08:18
437です。
レジストリに値をってのはやり方は全くわかりませんが、
その動作や処理自体特に問題のないものなんでしょうか?
468:デフォルトの名無しさん
09/03/28 23:20:46
WSHでレジストリに変更加える訳でも無ければ、
ExcelVBAから触れるレジストリ領域は一か所だけだね。
VBAで触れる部分をどんだけ滅茶苦茶にしても問題は無いと思うけど。
個人的には、レジストリやINIの肥大化が嫌いなんで、
きちんと管理出来ないなら使わない方が良いかも。と思うよ。
レジストリエディタでVBAを介さずに値の削除、書き込みが出来ない内はお勧めしないよ。
今回の状況だと、素直にワークシートに値を書き込んでおくのが良いんじゃないかな。
469:デフォルトの名無しさん
09/03/28 23:21:36
ExcelVBAのビルドイン関数って意味ね。
470:デフォルトの名無しさん
09/03/29 01:02:17
>>468
ありがとうございます。
もう少し色々調べたいと思います。
471:デフォルトの名無しさん
09/03/29 14:14:12
初歩的な質問ですみません。マクロの記録で操作記録されないようでお手上げです。
OS ビスタ
Excel2007使用です。
スピンボタンの設定で
LINKEDCELL = TARGET.ADDRESS
という部分をその左隣のセル指定に変更したく色々やりました。
稚拙な質問ですみません。よろしくお願いします。
472:デフォルトの名無しさん
09/03/30 09:55:25
特定のフォルダに「品番」.jpg
A1~A10に「品番」の羅列
B1~B10に「品番」.jpgを自動的にセルのサイズに合わせて貼り付け(もし該当するファイルがなければunknown.jpg
A列の品番が変わると自動的に差し替え
現在は
A列にフルパスで参照したい画像のファイル名
挿入の数だけ下記のマクロ作ってやってます
Range("A2").Select
ActiveSheet.Pictures.Insert(Cells(1, 1)).Select
OSはXP エクセルは2003です
宜しくお願い致します
473:デフォルトの名無しさん
09/03/30 17:44:24
丸投げ感たっぷりだなぁ
474:デフォルトの名無しさん
09/03/30 19:33:18
すいません
最初考えた時はできなくて現在の妥協案になりまして
やっぱりもう一度やり直そうと考えたんですが、やっぱり挫折・・・
正直、丸投げしました
475:デフォルトの名無しさん
09/03/30 19:59:32
>>472
ChangeイベントでTargetやTargetからの相対位置を対象とすれば良し
これで解らなければ、諦めるか、この程度は理解できるレベルまで自分で勉強しろ
476:デフォルトの名無しさん
09/03/30 20:07:04
shell関数について質問です。
アプリケーションをwinword.exeを指定した時、
空白を含むパスのファイルが開けません。
C:\test 1\test.txtだと、
file:///test%201/test.txtと記述しないとうまくいきません。
セルからパスを読み込ませ開きたいのですが、
うまく開く方法はないでしょうか?
477:デフォルトの名無しさん
09/03/30 20:13:47
>>476
"""C:\test 1\test.txt"""
セルに「C:\test 1\test.txt」と入っているなら
"""" & Range().Value & """"
478:デフォルトの名無しさん
09/03/30 21:23:54
>>477
ありがとうございます。
今は外にいるのでまた明日試したいと思いますが、
ご教授頂いた記述はどういった意味になるんでしょうか?
479:デフォルトの名無しさん
09/03/30 21:33:33
>>478
ここは初心者スレじゃない
基礎的な構文規則くらい自分で調べろ
480:デフォルトの名無しさん
09/03/30 22:06:18
初心者スレなんてないんだから、初心者の質問でもいいだろ。
まぁ俺は答える気ゼロなんだがなw
481:デフォルトの名無しさん
09/03/30 22:15:01
プログラム起動時のパラメータはスペースで分割される。
スペース入りのパスを渡す場合には、分割されないようダブルコーテーションで囲む必要がある。
ダブルコーテーションの中にダブルコーテーションを書く場合場、""と書く。
以上をあわせると、
"""abc def"""
"""" & range.value & """"
の意味がわかるはず。
482:デフォルトの名無しさん
09/03/30 22:15:55
質問スレだろ?
変な研究とかの丸投げじゃなきゃ質問に答えてやれよ
どーせ分からないだけだろ
483:デフォルトの名無しさん
09/03/30 22:22:22
>>482
偉そうなこと言ってる暇があるならお前が教えてやればいい
それとも質問者本人が煽ってるだけなのかな?
484:デフォルトの名無しさん
09/03/30 22:22:58
これわからない奴なんてほとんどいないだろw
485:デフォルトの名無しさん
09/03/30 22:26:30
>>483
そんなくだらん煽りなんかしないで、お前が答えてやれよ。
486:デフォルトの名無しさん
09/03/30 22:27:15
丸投げでも良いじゃない。人間だもの。
487:デフォルトの名無しさん
09/03/30 22:41:46
いや、俺にはわからん。
A2なのに(1, 1)になる理由とか、、、
>>484はわかるのか。すごいなあ。
488:デフォルトの名無しさん
09/03/30 22:49:44
>>481
ご親切にありがとうございます。
489:デフォルトの名無しさん
09/03/30 22:50:44
>>487
わかんねーなら黙っとけ糞が
490:デフォルトの名無しさん
09/03/30 22:53:50
ExcelVBA覚えるのにおススメの本ありませんか?
当方のレベルは、超簡単なシェルスクリプトぐらいなら作りますが
VBAの文法とか構造がさっぱりわからなくて初学者向けから勉強したいと思ってます。
491:デフォルトの名無しさん
09/03/30 22:59:25
Excel VBAのプログラミングのツボとコツがゼッタイにわかる本―最初からそう教えてくれればいいのに!
492:デフォルトの名無しさん
09/03/30 23:05:29
本屋に行って手に取ってみるぐらいの労力惜しむなよ…
493:デフォルトの名無しさん
09/03/30 23:11:58
>>492
書評ってなんで必要だと思う?
494:デフォルトの名無しさん
09/03/30 23:13:09
大村あつしの入門書っぽいの選んどけ
495:デフォルトの名無しさん
09/03/30 23:22:34
うちのばあちゃんが、人の悪口ってのはコンプレックスの裏返しだって言ってた。
つまり>>489自己紹介乙
496:デフォルトの名無しさん
09/03/30 23:24:28
>>493
(1) 書評欄を埋めるため
(2) 評論家がゼニをふんだくるため
497:490
09/03/30 23:46:29
ありがとうございます
>>491
よさそうですね。見てみます。エロゲみたいなタイトルですが
>>492
>>494
実はすでに大村あつしの入門書を見たんですが最初は簡単だったのにいきなりむずかしくなって
自分には合わないなって思いました。
ほかたくさんあったんですがイマイチピンとこずここで聞きました。
498:デフォルトの名無しさん
09/03/30 23:52:18
>>493
書評は別に必要ではないだろ
499:デフォルトの名無しさん
09/03/30 23:56:12
できる大辞典 Excel VBA
がオススメ
大村あつしは知識はあるが根本的にバカなので
こいつの書いた本は素人にはオススメしない
バカな内容に引きずられないだけの基礎スキルを持っていて
知識だけ上乗せしたい中級者以降なら構わないが
500:472
09/03/31 00:04:55
ヒントありがとうございます。助かります。
別のイベントで指定すれば良いんですね。やってみます。
501:デフォルトの名無しさん
09/03/31 00:57:31
(^p^)あうあうあー
502:デフォルトの名無しさん
09/03/31 01:13:54
>>475
changeイベントなんて1文字打ち込むごとに…
503:デフォルトの名無しさん
09/03/31 01:22:15
…は発生しない
確定された時にのみ発生する
あとは変更確定されたセルが、目的のセル範囲かで条件分岐して処理すれば良いだけ
504:デフォルトの名無しさん
09/03/31 08:02:57
1文字打ち込むごとにchangeイベントが発生するのはComboBoxやTextBoxなどだな
505:デフォルトの名無しさん
09/03/31 08:04:59
>>499
著者は誰?
506:デフォルトの名無しさん
09/03/31 15:10:37
Excel-VBAでXMLデータを引っ張ってるのですが
--------------------------------------------------------------
NGパターン
Set xmlHttp = CreateObject("MSXML2.XMLHTTP.4.0")
xmlHttp.Open "POST", "URLリンク(192.168.1.1:8080)", False
xmlHttp.Send xmlData
--------------------------------------------------------------
--------------------------------------------------------------
OKパターン
Set xmlHttp = CreateObject("MSXML2.XMLHTTP.4.0")
xmlHttp.Open "GET", "URLリンク(192.168.1.1:8080)", False
xmlHttp.Send xmlData
-証明書確認画面が出る。(主導ではいを選択)-
Set xmlHttp = CreateObject("MSXML2.XMLHTTP.4.0")
xmlHttp.Open "POST", "URLリンク(192.168.1.1:8080)", False
xmlHttp.Send xmlData
--------------------------------------------------------------
POSTでリクエストを出すとエラーが返ります。
GETでサーバ証明書を取得後にPOSTを続けるとエラーが出ないので、証明書関連だと
おもってるのですが、オレオレ証明書でも無視して続行する方法を
教えて頂けないでしょうか。
507:デフォルトの名無しさん
09/04/01 01:57:32
>>506
ぐぐれ
508:デフォルトの名無しさん
09/04/01 15:26:40
XPのExcel2007です。
次の流れのプログラムを作成しました。
1.テキストファイルを読み込み
2.不要データの削除
3.作表(列の追加など)
4.罫線・セルの色付け
プログラム自体は稼働し、結果も希望通りのものができました。
しかし、一度実行した後にもう一度実行すると、初回時に比べて処理時間がかかります。
マクロの最初と最後に、画面更新の停止と解除(screenupdating)も追加してみたのですが、改善にいたりませんでした。
一度ファイルを終了し、再度開きなおした場合の初回はやはり処理は早いです。
そういった現象を回避できる手掛かりを探しています。
ご助言をいただけましたら幸いです。
509:デフォルトの名無しさん
09/04/01 15:28:50
再実行の前に、初回の実行したときのデータをすべて削除してるか?
510:デフォルトの名無しさん
09/04/01 15:37:54
>>509
ありがとうございます。
データの削除は最初に行っています。
(Cells.Delete Shift:=xlUp)
使用しているシートは2つ。(2つとも削除しています)
1.テキストファイルを読み込むシートと読み込んだ後に、
2.別シートにすべてコピーしてから、不要データの削除や罫線処理を行っています。
何度か確認したところ、別シートにコピーしてからの処理が重くなるようです。
511:デフォルトの名無しさん
09/04/01 16:34:06
>>507
証明書を入れて回避する方法は探せたけど
認証を無視する方法がみつからない。(回避じゃダメなので)
ぐぐって見つかるサイトがあるならURLを教えてください。
512:デフォルトの名無しさん
09/04/01 16:36:58
>>510
とりあえずブックうp
外部に出せないデータとかは、適当な文字列と置き換えていいから
513:デフォルトの名無しさん
09/04/01 17:08:14
>>508,510です。
ファイルあげてみました。よろしくお願いします。
URLリンク(uproda.2ch-library.com)
DLパスは変更なしです。
外に出せないコードは削除してあります。
しかし一回目早く、2回目以降が遅いという現象はおきます。
何分手探りでVBAやっているため、コードが見づらいと思います。
(基本マクロ記録からいじくっているのが多いです)
よろしくご教授ください。
514:デフォルトの名無しさん
09/04/01 17:11:57
>>513 ですが、一回削除してからうpしなおしました。
URLリンク(uproda.2ch-library.com)
パス変更なしです。
お願いします。
515:デフォルトの名無しさん
09/04/01 17:20:32
>>513-514です。
たびたび本当に申し訳ありません。
うまくあがってなかたったので、再度あげました。
URLリンク(uproda.2ch-library.com)
お願いします。
516:デフォルトの名無しさん
09/04/01 17:29:06
事務所名でてるから早く消せ
517:デフォルトの名無しさん
09/04/01 17:32:07
>>516
最後にあげたのは全部消したはずなので、大丈夫だと思います。
518:デフォルトの名無しさん
09/04/01 17:45:18
>>517
マクロの中に
519:デフォルトの名無しさん
09/04/01 18:06:53
ありがとうございます。
先程削除しました。
今後はあげるのやめときます。
お騒がせしてすいませんでした。
520:デフォルトの名無しさん
09/04/01 18:55:05
諦めるって事か
お疲れさまでした
521:デフォルトの名無しさん
09/04/01 19:33:11
>>510
>データの削除は最初に行っています。
これは、マクロの中でやってるのか?
再実行する前に手で全部削除(コピー残すんじゃなくて)して再実行してみてどうだ
考えられる可能性は、コピーを残すことによりデータ量が増えて遅くなってるとか
空シートのクリアは早いがデータの多いシートのクリアは遅いとか
まあ、まずマクロのどこ(どの命令)が遅いか確認したら?
522:非508
09/04/01 20:12:53
落としたやつを動かしてみたが、枠線とか背景色とかをいじってる所が遅くなるようだ。
セルでなくシートを削除して、新しいシートで実行すると速度が変わらないので、Excelの仕様の問題かと。
シートの中に何か覚えている部分があるんだろう。
523:デフォルトの名無しさん
09/04/02 00:40:12
>>521、522
ありがとうございました。
その後、メモリの消去の命令とかいろいろ追加してみましたが、やっぱり駄目でした。
仕様ということであきらめてみます。
お見苦しいところを、多々お見せして、申しわけありませんでした。
524:デフォルトの名無しさん
09/04/02 01:45:51
>>523
upし続けてくれる?
直ぐ消すと
見てくれる人も見てくれないよ
525:デフォルトの名無しさん
09/04/02 20:01:17
開放する命令を出さないとダメだぞ。
526:デフォルトの名無しさん
09/04/03 00:36:17
open ?
527:デフォルトの名無しさん
09/04/03 01:45:48
初心者なんですが質問をさせてください。
ワークシートのセルに関数を入れて
4(=index(~)とかで4になったもの)
n = ↑のセル
range("a1")=n
とかにするとa1には=index(~)がそのままはいってしまって。
値(この場合4)にしたいんだがどうすればいいか教えてください。説明が下手で申し訳ありません。
528:デフォルトの名無しさん
09/04/03 01:59:19
自己解決しました。
マクロの記録でコピペして値のみでできました。
もし他にも方法があったら教えてください。
529:デフォルトの名無しさん
09/04/03 02:06:10
ここって日本の掲示板だよな?
あまりにも日本語の質問が少ないんで
何処か日本以外の国の掲示板に迷い込んだのかと錯覚する…
530:デフォルトの名無しさん
09/04/03 04:30:14
自然言語がちょっと乱れた程度で外国語と間違えそうになるなんてすごいです。
尊敬します。先生と呼ばせてください。
ところで先生は文末に約物だけを付けるのは正しい日本語とみなす派なんですね。
531:デフォルトの名無しさん
09/04/03 04:34:51
どうしたの?
532:デフォルトの名無しさん
09/04/03 07:05:43
自分で不自由て自覚あるみたいだから好きに呼ばせておけばいいよ
533:デフォルトの名無しさん
09/04/03 19:57:19
4(=index(~)とかで4になったもの)
もうね。メタ文字が入ってると、どんなパターンなのか考えてしまってダメだわ。
534:デフォルトの名無しさん
09/04/04 01:52:17
日本語でOK
535:デフォルトの名無しさん
09/04/04 15:28:15
>>527-528
だいたい俺んとこじゃそういうふうにならないんだが。
仮にC1に=INDEX(D:D,4)となってて
n=Range("C1")
Range("A1")=n
と.Valueを省略して書いてもA1には値が入るぞ?
536:デフォルトの名無しさん
09/04/04 16:16:24
かつてoffice2003で作ったxlsファイルでVBAを組んだのですが
それをoffice2007のxlsxで開こうとするとエラーになってしまいます。
もちろん保存するときにxlsで保存すれば開けるのですが。
xlsで作ったVBAはあくまでもxlsファイルでしか開けなく
互換性はないのでしょうか?
537:デフォルトの名無しさん
09/04/04 16:55:47
>>536
マクロ付きの場合、xlsxではなくxlsmになる。
名前を付けて保存のダイアログのファイルの種類のところから、それ選べ。
538:デフォルトの名無しさん
09/04/05 09:46:08
ボタンが一個置いてあり、その下に、数字がはいった二つのセル(仮にセルA、セルBとする)がある。
で、ボタンを押すと、別シートの表の中からセルAと一致
するセルをもつ行のうち最初にみつかったセルの1マス右側のセルにセルBの内容を書き込む・・・
というようなことをVBAでやりたいのですが、
単純化したサンプルでいいんでどういうコードになるか教えていただけませんか
539:デフォルトの名無しさん
09/04/05 10:28:13
オートシェイプにMouseMoveとかのイベントはありませんか?
オートシェイプ上にカーソルが移動すると
オートシェイプに合わせたデータを表示する
というのプログラムを組みたいのですが
540:デフォルトの名無しさん
09/04/05 10:32:32
>>538
With Sheet2
.Range(.Cells(1, 1), .Cells(10, 1)).Find(what:=Sheet1.Cells(1, 1)).Offset(0, 1) = Sheet1.Cells(2, 1)
End With
Sheet2が別シート、Sheet1がボタンがあるシートな。
541:デフォルトの名無しさん
09/04/05 11:04:03
>>540
ありがとうございました。
ちなみにセルAとセルBじゃなくて、
列Aと列Bだったとして、
列Aの内容と一致するデータを別シートから検索し、右隣のセルに列Bの
内容を書き込む、みたいな場合はどうなるんでしょうか
542:デフォルトの名無しさん
09/04/05 11:11:31
丸投げよくない
543:デフォルトの名無しさん
09/04/05 11:48:36
>>539
シェイプ系には無い
ActiveXオブジェクトには有る
矩形で良いならコントロールツールのイメージオブジェクト使うのが手っ取り早い
凝った形が良いならActiveXオブジェクト作って取り込めば良い
544:デフォルトの名無しさん
09/04/05 12:38:49
>>539
無い。けど、マウス座標からObject位置判定を自前でやれば同じことはできる
できたとしても、定義済みシェイプを使う方法が面倒だと思う
シェイプと情報をうまく自動リンクさせる手法の方が難しいと思われ
545:デフォルトの名無しさん
09/04/05 13:58:18
デフォルトプロパティって書くべきなんだよな?
546:デフォルトの名無しさん
09/04/05 13:59:21
関数だと必ず()にして表記したほうがわかりやすいよな
仕事としての意味で
547:デフォルトの名無しさん
09/04/05 14:25:50
>>451
非表示シートって表示できるの?
矛盾した質問で申し訳ない
548:デフォルトの名無しさん
09/04/05 15:16:03
セルの値を二元配列に組み込みたいのですが、
簡単にする方法はありますか?
data(0, 0) = A1.value
data(0, 1) = A2.value
data(1, 0) = B1.value
data(1, 1) = B2.value
data(1, 2) = B3.value
のように一度に格納したいのです
549:デフォルトの名無しさん
09/04/05 15:21:55
>>547
出来ない理由でも?
550:デフォルトの名無しさん
09/04/05 16:05:28
>>548
Dim ary As Variant
ary = Range(Cells(1, 1), Cells(3, 3)).Value
これで配列に入る。
添え字は1始まり。
551:デフォルトの名無しさん
09/04/05 16:11:28
>>550
ありがとうございます
552:デフォルトの名無しさん
09/04/05 17:01:28
>>549
拾ってきたソースで非表示シートに値を入れてるのがあって
それを目で追うために見えるようにしたかったんだよ
553:デフォルトの名無しさん
09/04/05 17:11:41
表示できない場合、うっかり非表示にしちゃったときどうするんだ
554:デフォルトの名無しさん
09/04/05 17:16:02
>>545
保守的には書いたほうが良い。書くべき。
けど、VB6に限れば書かない方が速度が速い。もしかしたらVBAも・・・?
まあ、所詮Excelなんで筋違いか。2008は知らん。
555:デフォルトの名無しさん
09/04/05 17:26:50
どこぞのサイトに書く場合と書かない場合の計測結果があったな
556:デフォルトの名無しさん
09/04/05 18:06:51
書いた方がわずかに早いけど、そこまでスピードにこだわる処理にVBAは向いてない気が
557:デフォルトの名無しさん
09/04/05 19:43:34
質問です。
Variantに複数のRangeを代入した際の動きって
どこかにドキュメントとかありますか?
いまいちアレが配列になる理由がわからない。
558:デフォルトの名無しさん
09/04/05 19:57:49
>>557
どゆこと?
559:デフォルトの名無しさん
09/04/05 20:06:05
それは代入以前の問題だろ
君は複数範囲のRangeオブジェクトのValueプロパティが、配列を返すってことを理解してないだけじゃん。
変数は単にValueプロパティが返した値をそのまま保持しているだけで、Variant型変数に代入したときに
何か変換とかが行われてるわけじゃないし。
560:デフォルトの名無しさん
09/04/05 20:09:38
>>557
variantでメモリを確保します
最低16バイトです
そこに配列の値を入れていきます。増えたらVariantが確保してるメモリ量も増大します
終わり
多分可変長ってところでひっかかてるんじゃないかな
561:デフォルトの名無しさん
09/04/05 20:51:12
>>558,560
複数のRangeといったのは、下記のような代入です。
Dim var as Variant
var = [A1:B3]
なんでvarに配列が入るのか不思議だったので聞きました。
(普通に先頭要素の値が文字列として入ると思っていたから)
>>559
うーん、そういうExcelのCOMの作り方であって、
別にVBA的な何かというわけではないのですね。
デフォルトプロパティの動作についてドキュメントないのかな。
CVarでも動作同じなのかな。
562:デフォルトの名無しさん
09/04/05 20:53:46
つまり勘違いしてただけか
563:デフォルトの名無しさん
09/04/05 21:32:03
Range型に不用意にVariantを使用しない。後で意味が分からなくなる。
デフォルト云々の前に、Variantは不定形型ということを理解すべき。
564:デフォルトの名無しさん
09/04/05 21:38:54
range == stringの認識も改めたほうがよさそだね
565:デフォルトの名無しさん
09/04/05 22:45:48
>>563
なにいってんの?ばか?
566:デフォルトの名無しさん
09/04/05 22:46:10
>>564
を見てふと思ったんだけど、
やっぱり比較演算子と代入演算子が同じってのは分かりにくいよね。
>>563
ユーザー定義関数なんかで、セル指定or文字 を引数で使うみたいに、
明確にvariantじゃなきゃ条件分岐がしっかり出来ないって用途は限定されるしね。
まぁ、そんな目的だとしてもTypenameあたりでしっかりと何型が入ったかを判定させるべきだと思う。
入れっぱなし、とりあえず問題なく動くからOK。って作り方はわしゃ好まん。
567:デフォルトの名無しさん
09/04/05 23:10:16
VBAでカレーライスって作れますか?
568:デフォルトの名無しさん
09/04/05 23:12:10
>>567
外部マイコンをVBAで制御すればできる
もちろん、マイコンでカレーライスが作れるように設定しておいてくれ
569:デフォルトの名無しさん
09/04/06 00:27:07
だがそれは、はたしてVBAで作ったことになるのだろうか?
570:デフォルトの名無しさん
09/04/06 00:41:36
『パソコンはC言語で動いてる』の考え方次第じゃない?
目に見える結果にプログラミング言語は限定されないと思う
しいて言うなら、カレーライス製造装置の制御ソフトの大半がVBAなら、VBAで出来てるといえるのでは?
最悪、かーちゃんにメールするだけでも成立しそうだが
激しくスレチ乙
571:デフォルトの名無しさん
09/04/06 00:44:00
なるよ
572:デフォルトの名無しさん
09/04/06 01:05:33
「パソコンで年賀状作った」
「それはプリンタに作らせただけだろう」
みたいな話か
573:デフォルトの名無しさん
09/04/06 06:53:16
最後にちょっと国内で加工すれば国産になるのと同じ道理ですな
574:デフォルトの名無しさん
09/04/06 21:04:10
>>563は何か勘違いしてるの?
セルの値の配列をいっぺんに入れるならVariant型しかないじゃん。
575:デフォルトの名無しさん
09/04/06 21:38:27
Range.Value()の代入先がVariant()型に限るってのもVBAの妙な仕様の一つだよな。
別にDouble()やString()を許容してくれてもよさそうに思えるのに。
576:デフォルトの名無しさん
09/04/06 22:02:15
プロパティの定義が
Value As Variant
なんだから、妙でもなんでもなく当然だろ?
というか、配列じゃないときに変換関数も通さず別型の変数に代入できてしまう方が妙だ。
自動型変換なんてのは行われないのが普通だからね。
VB6以前やVBAにどっぷりハマっていると、自動型変換されるのが当然で、プロパティの戻り値を
プロパティの型とは別型の変数に代入できないという当たり前のことが不自然に感じてしまうものなのか?
577:デフォルトの名無しさん
09/04/06 22:22:28
ならばセルに数値が入ってる時TypeName(Range("A1").Value)ってやると
Doubleが返ってくるのをやめてほしい。
Range("A1").ValueTypeみたいなデータ型を調べるプロパティを用意すべき。
578:デフォルトの名無しさん
09/04/06 22:39:47
>>577
オブジェクト指向を一から勉強し直せ
579:デフォルトの名無しさん
09/04/06 22:40:13
>>577
それはTypeNameが内部型を返すという仕様通りの結果だろ?
結局全てに置いて理解が浅いだけの話じゃん。
そして問題点を指摘しているのではなく、「俺の妄想通りに動かない」とブー垂れてるだけ。
ホント、どうしようもないな。
580:デフォルトの名無しさん
09/04/06 22:53:11
じゃあ問題なのは一部の演算子で自動的に型変換が行われてしまうってこと?
VBAだと暗黙の型変換を禁止する方法ってないよね?
581:デフォルトの名無しさん
09/04/06 22:55:04
>>580
何いってんの?馬鹿なの?
582:デフォルトの名無しさん
09/04/06 23:11:21
>>580
それ、結構重要だと思うわ
最近のスクリプト言語でも思う
勝手に型変換して書いたソースをなんとか動く形に解釈してしまうのは
俺もダメだわ
583:デフォルトの名無しさん
09/04/06 23:20:39
単純な変数への代入だと勝手に型変換してくれるのに
配列への代入だと型変換してくれない。
なんで統一してくれないの?
584:デフォルトの名無しさん
09/04/06 23:22:08
VBAは中途半端に型があるからなぁ
VBSみたいに、もう型なんてバリアント以外禁止!にすればよかったんだよ
実行環境が勝手に型変換するのは、勝手に型変換するコードを書くからなんだがな
それは問題なんじゃなくて、そういう言語だと理解して使うしかない
585:デフォルトの名無しさん
09/04/06 23:25:23
>>577
それって意味あるの?
ValueTypeプロパティがあったとして、
VarType/TypeNameが廃止なら、現状のVarType/TypeNameと何も変わりない。
見た目が変わるだけ。
一方、VarType/TypeNameが存在するとしたら、そっちは何をするんだ?
例えば、Variantであるという戻り値なら、そんなものソースコードを見れば自明だ。
ほかの方法は思いつかない。まさかValueTypeと同じとは言わないだろうし。
586:デフォルトの名無しさん
09/04/06 23:30:16
「variantの使い方は気をつけよう」でおk?
初心者はよく勉強すること
熟練者は的確なスレをすること
反論だけのキチガイはスルーすること
587:デフォルトの名無しさん
09/04/06 23:33:36
スレをする?
588:デフォルトの名無しさん
09/04/06 23:40:27
Variantはまだいい方。
一番わかりにくいのはRangeオブジェクトだと思う。
よく使われることを想定したためか、かなりの省略が許容されているおかげで誤解も多い。
589:デフォルトの名無しさん
09/04/06 23:46:17
別に解りにくいなんて思ったことは無いけどな
理解度が低かった初心者の頃以外は
590:デフォルトの名無しさん
09/04/06 23:59:16
EntireRowとかのRow自体のRangeとか、
結合セル時のOffsetとか、Find・FindNextとかはわかりづらいと思った。
591:デフォルトの名無しさん
09/04/07 00:10:04
理論的な思考が出来る人なら問題にはならないけどね
結局は個人の問題
592:デフォルトの名無しさん
09/04/07 00:15:09
んなアホな
593:デフォルトの名無しさん
09/04/07 00:24:04
まあ出来ないうちはそう思うのは仕方ない
解ってみれば単純な物だが
594:デフォルトの名無しさん
09/04/07 00:26:06
うゎ、こいつうぜ
595:デフォルトの名無しさん
09/04/07 00:31:57
ここはヒトの理解というものについて考察するスレじゃないというのは、
論 理 的な思考が出来る人なら問題にはならないけどね。
596:デフォルトの名無しさん
09/04/07 00:36:17
悔しかったの?
597:デフォルトの名無しさん
09/04/07 00:39:06
Cellsの使い方がおかしい奴は多いねぇ。
Set r = Range("a1:b5")
r.Cells(2,1).hogehoge
なんてやつ見るとアフォかと。
598:デフォルトの名無しさん
09/04/07 00:40:46
なにやってんのそれ?w
599:デフォルトの名無しさん
09/04/07 00:49:29
やってることはどうでもRange("a1:b5") がセルの集合だからCellsを使うのはおかしいってこと。
600:デフォルトの名無しさん
09/04/07 00:58:52
>>599
ただの相対参照じゃねーの?
601:デフォルトの名無しさん
09/04/07 01:07:32
>>597
複数セルに対するCellsで第二引数まで指定するのは確かにおかしいが
やってる奴は滅多に見ないぞ
複数セルに対するCellsで第一引数のみの指定や
単一セルに対するCellsで第二引数まで指定するのならよく見るが、これらはちゃんと意味有るし
前者は範囲内、若しくは範囲の延長上で右下方向に何番目のセルという指定で
Range("A1:E5").Cells(12)なら、A1:E5の5行5列範囲で右下方向12番目ということで
1 2 3 4 5
6 7 8 9 10
11 12
のような感じで3行2列目のB3を返す
後者はOffsetの初期インデックス違いのようなもので、Offsetが0始まりなのに対して、Cellsが1始まり
Debug.Print Range("A1").Cells(3, 3).Address(0, 0)
Debug.Print Range("A1").Offset(2, 2).Address(0, 0)
因みに前者のような使い方があるので、「(親が)セルの集合だからCellsを使うのはおかしい」って言い方は不適切だな
602:デフォルトの名無しさん
09/04/07 01:35:18
問題は、RangeもCellsもRangeオブジェクトを返すのに、その明確な
使い分けができてないことだろ
603:デフォルトの名無しさん
09/04/07 01:40:10
使ってればそのうち使い分けられるようになるさ。
604:デフォルトの名無しさん
09/04/07 01:54:34
いや、たしかに自然と使い分けてるんだが、
問題としては、使い分けの方法ってか、指針を説明できないってことなんだ
今だから白状するが、俺は初心者の頃は、Cellsは単一セルそのものを返してると思ってた
まあ、だからRangeとCellsの使い分けはあんまり悩まなかったが、かといって
範囲が1×1のレンジ操作はCells使えってのも、なんかちょっと違う気がする
605:デフォルトの名無しさん
09/04/07 09:06:00
>>597がおかしいのは
r.Cells(2,1).hogehoge じゃなくて
rItem(2,1).hogehogeとかr(2,1).hogehogeって書けって意味だよ。
r.Cells(2,1).hogehoge ってr.Cells.Item(2,1).hogehoge の意味だけどセルの集合にわざわざ再度Cellsを使うのは無駄ってもんだ。
例えばCells(2,1)もCells.Cells.Cells(2,1)も同じセルををさすが、動けばいいってもんじゃねーからな。
EntireRowとかのセルの集合じゃないものにCellsを使うのは意味があるが>>597ではCellsは無意味だね
606:デフォルトの名無しさん
09/04/07 09:19:44
r.Cells(2,1).hogehogeがr.Cells.[_Default](2,1).hogehogeの意味だって突っ込みは無しよ。
607:デフォルトの名無しさん
09/04/07 11:41:21
>>605
デフォルトプロパティを省略するなって議論が上の方にあったな
だが実際問題、Cells.Item(2,1)なんて書かないなぁ
デフォルトプロパティがインデクサとして作用するなら普通みんな書かないんじゃない
まあ、そのせいで、Cells(2,1)はプロパティ取得じゃなくて、
Cellsというメソッドを2と1という引数で呼び出してると勘違いしてる時期があった
VBAの入門書とか、そのへんちゃんと解説してるようなのはほとんどないと思う
ちゃんとしたコード読まないと、ちゃんとしたコードかけるようにならないってことだな
ただ、Range.RangeとかCells.Cellsとかは感覚的におかしいと思うんだが
Range.Cellsは感覚的におかしいと思わないんだよなぁ
608:デフォルトの名無しさん
09/04/07 13:12:17
>>607
Excel95の頃はCellsはメソッドじゃなかった?
中身は実質変わってないのかな?
609:デフォルトの名無しさん
09/04/07 15:27:47
ソース見てRangeがオブジェクトかプロパティかわからない俺参上
Range("A1") = "abc"
たとえばこれはオブジェクトでデフォルトプロパティのValueが省略、でいいの?
610:デフォルトの名無しさん
09/04/07 15:52:48
Rangeはオブジェクトを返すプロパティだよ
611:デフォルトの名無しさん
09/04/07 17:35:05
EXCEL2003です
セルの書式設定の[表示形式]定義が[文字列]かどうか
判断する方法を教えて下さい。
やりたい事は「日付を表すデータ」([表示形式]が[日付]とは限らない)が
元々どのように入力されているか判断したいのです。
具体的には、
文字列で「3/1」、「2009/3」「2009/3/1」と入力されて
いるのか、日付データで「2009/3」等と入力されているのかの
判断方法は、どうすれば良いかということです。
よろしくお願い致します。
612:デフォルトの名無しさん
09/04/07 17:40:30
>>611
NumberFormatLocal
613:デフォルトの名無しさん
09/04/07 22:14:32
文字列で"0.1"とか"1"をDoubleに変換したいです。
且つ、"abc"のようなものなら失敗して欲しいです。
CDbl()でよいと思うのですが、"abc"などを渡した場合どのように失敗を通知してくれるのでしょうか?
例外などですか?このときの例外の補足の仕方を教えていただけますか?
宜しくおねがいします
614:デフォルトの名無しさん
09/04/07 23:24:36
On Error GoTo xxxx
でエラートラップ
Err.Numberでエラーの種類しらべてしかるべき処理
はっきりいってVBAのエラー処理はおまけみたいなもんだ
変換してエラーでる可能性があるとわかってるなら、
変換する前に変換元が数字かどうかぐらい自分でチェックするほうがいいと思うぞ
615:デフォルトの名無しさん
09/04/07 23:34:04
>>614
それは他の言語とどこが違うの?
616:デフォルトの名無しさん
09/04/07 23:41:15
>>614
ありがとうございます。m(_ _)m
アドバイス助かります。自分でエラーチェックすべきか、
オブジェクトの例外スローに期待すべきかも悩んでました。
とりあえず試してみます。
例外が送出され、それを捕らえて上手くメッセージが出せたらそれに越したことはないものですから。。
617:デフォルトの名無しさん
09/04/08 03:42:55
>>615
エラー処理ルーチンにうつった場合の、それ以降の処理が非常にややこしくなるんだ
まあ、詳しくは構造化エラー処理あたりでぐぐってみてくれ
で、613はJava系のプログラマか?
VBAで例外スロー、キャッチとか考えんほうがいいぞw
618:デフォルトの名無しさん
09/04/08 03:50:08
つーか、IsNumericじゃダメなの?
619:デフォルトの名無しさん
09/04/08 06:07:31
IsNumericかregexを使う
620:デフォルトの名無しさん
09/04/08 10:11:12
vbのエラー処理ってこんなかんじだったかな
1:
on error resume next
(処理)
if err.number = xxx then
~
end if
on error goto 0
2:
on error goto eh
(処理)
exit sub/function
eh:
(errで分岐したり処理したりする。resume next で戻ることも出来るが、大体はそのままプロシージャを抜ける。)
621:デフォルトの名無しさん
09/04/08 10:15:33
負の日付を判断する関数ってあります?
もしくは負の日付か判断する方法があったら教えてください
isDate(負の日付)や変数 = 負の日付とかするだけでエラーに飛んでしまって・・・
622:デフォルトの名無しさん
09/04/08 13:07:38
まず、負の日付の定義についておしえてくれ
623:デフォルトの名無しさん
09/04/08 13:45:02
1899/12/29以前ってことか?
俺のとこじゃDate型の変数にCdate("1872/8/13")を入れてMsgBox IsDate(変数)とすりゃTrueだけどな。
直にMsgBox IsDate(-10000)だとFalseだが。
エラーにはならんな。
624:デフォルトの名無しさん
09/04/08 14:07:01
>>622-623
説明不足でもうしわけないです
表示形式が「日付」のセルに、例えば9999999999って値を打つと
####と表示され、マウスカーソルをあてると「負の日付または時間は####と表示されます。」
と出てきまして、そこの値をvbaの方で参照しようとして落ちているという状況です
(日付型のとこには0~2958465以外の数値だと日付シリアル対象外でこうなるようで・・・)
関数があれば~と言いましたが、代入するにしろ引数にするにしろ、
参照した時点で落ちてるので関数があっても意味がないと思い、
結局エラーに行かせた先で判断するようにしました
どうもありがとうございました
625:デフォルトの名無しさん
09/04/08 14:19:05
>>624
Value2プロパティが2958465以下かで判断する方法もあるかもね。
ValueプロパティだとオーバーフローのエラーだがValue2だとオーバーフローしないから。
626:デフォルトの名無しさん
09/04/08 14:59:38
>>625
知らないプロパティだったんで早速調べてみたんですがこれで行けそうです!
>>625氏の言うとおりの方法で範囲外なら無効な日付とメッセージを出すようにしてみました
出来ればエラーに飛ばしたくないと考えていたので助かりました
どうもありがとうございます!
627:611
09/04/08 17:37:10
>612
レスありがとうございます
628:デフォルトの名無しさん
09/04/09 00:08:50
EXCELファイルがどのバージョン(EXCEL97、2000、2003)で
作成されたものか調べる方法を教えてくれ神ども。
629:デフォルトの名無しさん
09/04/09 05:48:16
拡張子は?