トップページtech
1002コメント349KB

Excel VBA 質問スレ Part37 [転載禁止]©5ch.io

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2015/06/10(水) 16:18:49.84ID:T4wZlTyk
ExcelのVBAに関する質問スレです

★1 質問テンプレ(雛形)は用意しませんが、OSとExcelのバージョンは必ず書きましょう。

★2 ExcelのVBA以外の部分に関する質問はNGです。
   但し、VBA無しでも出来ることだが、あえてVBAでやりたいって物に関してはOK。

★3 ExcelのVBE(Visual Basic Editor)を使うとしても、VBAの分野以外に関してはスレ違いです。

 VBAとは、『Visual Basic for Applications』の略で
  Application
  ├Workbooks
  |└Workbook
  |  ├Worksheets
  |  |└Worksheet
 というApplication以下のオブジェクトを、VB言語で操作するものを指します。
 例えExcel付属のVBE(Visual Basic Editor)を利用しようとも、このApplication以下のブックやシート、
 セルやオブジェクト等を操作するもの以外はVBA分野の話ではないので、ここでは聞かないでください。

★4 とりあえず、Excelのインスタンスを作らずにVB6で出来ることは全てスレ違いだと思ってください。

★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み、
   コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。
   ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。

★6 わからなければとりあえず「マクロの記録」(Alt, T, M, R)

前スレ:Excel VBA 質問スレ Part36
http://peace.2ch.net/test/read.cgi/tech/1420790342/

関連スレ:VBAなんでも質問スレ
http://toro.2ch.net/test/read.cgi/tech/1342087380/
0232デフォルトの名無しさん2015/09/17(木) 03:58:01.75ID:pl8Hj06W
よく使うイコールとカッコを一発入力
http://i.imgur.com/FrbauP0.jpg
0233デフォルトの名無しさん2015/09/17(木) 08:45:59.29ID:negR8wPL
普通の半角英文字入力モードのときに
登録しておいた文章を簡単に入力する方法はありますか?

たとえば
tを押したときに"Thank you very much for"
bを押したときに"Best Regards, (my name)"
など20個以上の登録しておきたい文章があるんです。
0234デフォルトの名無しさん2015/09/17(木) 08:47:10.12ID:negR8wPL
あと英文のとき大文字をShift押すのをもっと簡単にする方法はないですか?
タッチタイプができるので大文字のところだけ0.1秒くらいタイミングが遅れて困っているんです。
0235デフォルトの名無しさん2015/09/17(木) 10:20:20.73ID:GcR8xHde
>>232
yenマークは?
0236デフォルトの名無しさん2015/09/17(木) 11:20:58.68ID:1vkd1c9N
バックスラッシュはシフトキーいらないだろ
0237デフォルトの名無しさん2015/09/17(木) 11:49:58.02ID:kipa1zpm
どうVBAに関係するんだよ。スレ違いの話続けんなドアホ
0238デフォルトの名無しさん2015/09/17(木) 11:52:52.51ID:Y9+umF8P
そのテンキー、コンマがあれば完璧だったのに
0239デフォルトの名無しさん2015/09/17(木) 12:39:55.33ID:+3F+8mBw
コンマがあれば何もコ(ン)マらなかったのに!
0240デフォルトの名無しさん2015/09/17(木) 13:19:44.18ID:1vkd1c9N
     \       ヽ           |        /        /
          \      ヽ               /      /
‐、、         殺 伐 と し た ス レ に 鳥 取 県 が ! !      _,,−''
  `−、、                  __/\            _,,−''
      `−、、              _|    `〜┐         _,,−''
                      _ノ       ∫
                  _,.〜’        /
───────‐     ,「~             ノ    ───────‐
               ,/              ` ̄7
                |     島 根 県     /
           _,,−'   ~`⌒^7            /    `−、、
        _,,−''            丿            \,      `−、、
 ,'´\           /  _7       /`⌒ーへ_,._⊃         /`i
 !   \       _,,-┐    \    _,.,ノ          r‐-、、      /   !
 ゙、   `ー--<´   /      L. ,〜’             ゙、  >−一'′   ,'
  y'  U      `ヽ/     /            ヽ      ヽ '´     U   イ
                                ____
         /      __        |       \____\
    ___/__ / ̄    ____|____ \ \____\
       //ヽ   /___         /|\       \ \____\
     / / ヽ  / /__     /  |  \       \_______
   /  /   / /   /     /    |    \          |    \
  /   /  / /  _/   __/      |      \__      |     \  ̄―_
0241デフォルトの名無しさん2015/09/17(木) 14:28:57.33ID:zQMTeEfi
オートコレクト使えば?
0242デフォルトの名無しさん2015/09/17(木) 19:21:57.39ID:ZEBJNCr9
>>238
Excel だとコンマよりタブの方がよく使う
0243デフォルトの名無しさん2015/09/17(木) 21:27:50.77ID:nm8tfio5
>>231
キーボードの配列によっては=はshift押さないものもある
これもまた使ってるキーボード次第だけど、10キーの+をビターンと押してみるとか
0244デフォルトの名無しさん2015/09/18(金) 02:08:42.21ID:OwYf98or
Excel2007なんですが、ListViewで20行表示されるようになってて、データは50あります。
40行目を変更して、再度データを読み込みます。そうすると、最初の1から20までを
表示するのですが、40行目を表示させることはできないんでしょうか?。
できれば、40行目を変更する時点で一番上に表示されてる、例えば26行目から
表示させることとか、できないでしょうか。
0245デフォルトの名無しさん2015/09/18(金) 03:58:21.92ID:jaUEyIYl
VB6のコントロール「Microsoft ListView Control 6.0」を使う場合のことかな?
指定の項目を画面に表示させたいならEnsureVisible()を使う

Private Sub CommandButton1_Click()
With ListView1
  With .ListItems(40)
    Call .EnsureVisible
    '.Selected = True
  End With
  'Call .SelectedItem.EnsureVisible
End With
End Sub
02462442015/09/18(金) 18:55:44.91ID:JBxUncF1
>>245
やってみました。できました!。ありがとうございました。
ググっていろいろやってみて、どうしてもわからず
ここに質問しました。よかったー。どうもでした。
0247デフォルトの名無しさん2015/09/19(土) 06:25:19.76ID:MRSgSgPN
2015/08/26 15:12:01
2015/08/27 1:04:03

上のような日付時刻のデーターから2つの差分の経過時間日数を表示させるには
どのように書けば良いのでしょうか?
0248デフォルトの名無しさん2015/09/19(土) 07:03:55.20ID:ZcnBR6n/
>>247
セルにシリアル値が入ってるとして
差 = Range("B1").Value - Range("A1").Value
0249デフォルトの名無しさん2015/09/19(土) 07:20:25.72ID:ABga1iDK
上達するまで時間かかりそうだなー。
0250デフォルトの名無しさん2015/09/19(土) 08:36:36.43ID:jW6yRKII
>>248
それって>>247の言う「経過時間日数を表示」することになるのかね?
0251デフォルトの名無しさん2015/09/19(土) 09:21:22.56ID:xryWHhpW
>>250
セルに表示するなら書式設定でできるかと
0252デフォルトの名無しさん2015/09/19(土) 10:19:50.27ID:jW6yRKII
>>251
0 3:26:13 (← 3時間26分13秒経過 の意味)
477 1:12:34 (← 477日1時間12分34秒経過 の意味)

みたいに表したいんじゃないかと想像したんだが、どうだろう。
0253デフォルトの名無しさん2015/09/19(土) 11:16:51.77ID:xryWHhpW
>>252
セルの書式 - 表示形式 - 分類(C) - ユーザー定義で種類(T) に d hh:mm:ss
02542532015/09/19(土) 11:23:41.09ID:xryWHhpW
あっ、日付が1ヶ月越えるとダメだな...
0255デフォルトの名無しさん2015/09/19(土) 12:39:08.79ID:N5F00OSs
datediffでインターバルをdにすれば日数は取れるんじゃないの
0256デフォルトの名無しさん2015/09/19(土) 13:01:19.07ID:GIof26cq
時刻の差分を求める
時間を特定のフォーマットで表示する
別の話だから
前者は>>248で良いだろ
後者は元質問者がどう望んでるか分からんから回答できんわ
0257デフォルトの名無しさん2015/09/19(土) 23:52:44.74ID:U6It5g+s
datediffじゃなくてdatedifだな
なぜかヘルプに載ってないシート関数
0258デフォルトの名無しさん2015/09/21(月) 07:41:10.03ID:TLTHusWT
Excel2007を開かないで読み込み、書き込みしたいので
ADODB.Connection
ADODB.Recordset
を使って見ているんですが

書き込みのとき文字型になるので
書き込み先の関数が反映されないのですが対処方法ないですか?
0259デフォルトの名無しさん2015/09/21(月) 09:14:39.19ID:6Qd0iGUJ
Excelの関数はExcelが処理してるわけだが
そもそもADOでExcelシート開いて関数動くのか?

文字列型とかそういう問題じゃない気がするんだが
0260デフォルトの名無しさん2015/09/21(月) 10:36:58.18ID:MLBJrwW+
CDateで読み込んでいる元のリストに空白とか-/-とか1988/-とかが
混ざってて、-/-と空白は” “か”不明”で処理して、年号は拾いたいです。
うまい方法あったら教えて下さい。
0261デフォルトの名無しさん2015/09/21(月) 10:41:23.41ID:wKVLsJx8
>>260
IsDate()で日付として読み込めるかどうか判断できる。
空白は日付として解釈出来るので別途判断が必要。
0262デフォルトの名無しさん2015/09/21(月) 10:43:56.79ID:wKVLsJx8
「1988/-」はIsNumeric(Split("1988/-","/")(0))で判断できる。
0263デフォルトの名無しさん2015/09/21(月) 13:35:26.77ID:TLTHusWT
>>259
データを書き込んだ後に、エクセルを開くと
数字が文字型で入っているから関数が計算しないんだ
0264デフォルトの名無しさん2015/09/21(月) 20:04:31.29ID:Kfx74dr5
>>258
>Excel2007を開かないで読み込み、書き込みしたいので

なぜ?その必要性は?
0265デフォルトの名無しさん2015/09/21(月) 20:20:21.00ID:Zmx0dOIG
>>263
>Excel2007を開かないで読み込み、書き込みしたい
エクセルを開かないで、どうやってブックに書き込みするつもりなんだい?
あと、ADODBはVBScriptで作成してるのかい?
0266デフォルトの名無しさん2015/09/21(月) 20:47:10.32ID:6Qd0iGUJ
>>263
ちょっと実行環境とコード晒して
0267デフォルトの名無しさん2015/09/21(月) 22:14:40.79ID:TLTHusWT
>>266
コードは会社なんで連休明けにまた質問します。

数秒毎に書き込みをすることが結構あるので
毎回OPENするのを見るのはうっとうしいなぁと思ってるんですが
エクセルに書き込みをするのはやっぱりOPENしてからが普通かな
0268デフォルトの名無しさん2015/09/21(月) 22:59:15.59ID:F/XEG3RA
画面更新止めて開けばいいだけのことじゃねーか
0269デフォルトの名無しさん2015/09/21(月) 23:37:00.23ID:c1rO/cps
文字列だから関数が反応しない、ってことの方が俺には疑問だわ
たいていの関数は数値でも文字列でも処理してくれるのに
0270デフォルトの名無しさん2015/09/22(火) 01:33:16.60ID:RmAixVRL
数秒ごとに更新が必要なら、もう開きっぱなしでいいんじゃ?
0271デフォルトの名無しさん2015/09/24(木) 10:18:47.70ID:omyXVQMB
Excel2010以前のは全世界で一斉に使わなくすることは可能ですか?
0272デフォルトの名無しさん2015/09/24(木) 10:41:14.56ID:X5tdJ92l
不可能です
0273デフォルトの名無しさん2015/09/27(日) 01:20:22.02ID:F07ZjUKB
>>263 >>269
Excelが変更されたって検出できなければ再計算されないのさ
auto_openとかでApplication.Calculate
と書いとけば開いた時に再計算されるよ
0274デフォルトの名無しさん2015/09/29(火) 09:44:27.26ID:wb2Wnzgx
>>271
可能です
0275デフォルトの名無しさん2015/10/04(日) 14:07:57.32ID:/vSmtKMA
どうしてでしょうか?。Excel2007です。画像が50枚。Userform1にイメージ(image1からimage10)。Pfile()は、貼り付ける画像の絶対パス。
sub gazo(No as long)
For i = 1 To 10
UserForm1.Controls("Image" & i).Picture = LoadPicture(Pfile(i+No-1))
UserForm1.Controls("Image" & i).PictureSizeMode = fmPictureSizeModeStretch
Next i
end sub
これを実行すると、10個ちゃんと表示されます。引数Noが1,11,21,31,41と変化しても、それにあった画像が表示されます。
imageには、それぞれ、クリックすると イベントが呼び出されるようにしています。例えば、image1の場合、
Private Sub Image1_Click()
  'これがよびだされただけで、ここの画像が更新されず、この画像が消えなくなります。
end sub
No=1で呼び出され画像が表示された状態で、image1をクリックします。そして、No=11でこのプロシージャを呼び出します。
そうすると、image1の画像だけが変わりません。同様に、ほかのimageをクリックすると、その画像は固定されてしまい、かわりません。
ちなみに、 UserForm1.Controls("Image1").Picture = LoadPicture("")でも消えません。(クリックする前は、ちゃと消えます)
0276デフォルトの名無しさん2015/10/04(日) 16:30:11.15ID:UTkim9Ku
>>275
UserForm1.Repaint
0277デフォルトの名無しさん2015/10/04(日) 17:03:45.11ID:g7SqYJ/X
>>275
単純にイメージ書き換えるサンプルで検証したけど、更新されないのは再現したな
とりあえずフォームをRepaintしてやれば画像は更新される
消えるのは再現しない

VBAのフォームってAutoRedrawとか無いんだな
まあ、そういうものだと割り切って使うしかないんじゃね
02782752015/10/04(日) 18:57:20.53ID:GDhGHTrc
>>276,277
レスありがとうございました。UserForm1.Repaintで、更新されました。
これ、1回でもSub Image1_Clickすると、以降は.Repaintする必要があるんですね。
Sub Image1_Click以降の処理に何かあるんじゃないかと、数日格闘しました。
解析の対応も、逆だったですね。勉強になりました。どうも、ありがとうございました。
0279デフォルトの名無しさん2015/10/04(日) 19:30:54.16ID:2AM+oKUz
もう一つのスレにも書き込みましたが
質問失礼します。

このたびwin10にアップグレードしたのですが
excelのVBAで下記の記述を使うIE操作ができなくなってしまいました。
object("InternetExplorer.application")
昨日からやり方をぐぐったりして試行錯誤していますが解決できませんでした。
今まで通りIEを呼び出す方法はあったりしますでしょうか?
0280デフォルトの名無しさん2015/10/05(月) 02:40:58.07ID:uvbnrVeH
10は物によってはIE入ってないらしいから入れる必要があるのかもね
うちは入ってたけど
0281デフォルトの名無しさん2015/10/05(月) 06:43:32.33ID:Gxee2tr0
>>279
出来ないってどうなるのよ?エラーメッセージ書きなさいよ。
0282デフォルトの名無しさん2015/10/05(月) 13:24:24.30ID:PnYDCBrn
>>281
ごめんなさい。
0283デフォルトの名無しさん2015/10/05(月) 13:32:25.29ID:riTZJY1L
ゆるさないんだから
0284デフォルトの名無しさん2015/10/06(火) 12:24:45.75ID:vCF6HdoW
教えてください。Excel2007使用です。
アクティブなシートで、シート名を変更する状態になっています(シート名が反転)。
この状態で、Range("A1").activate とするとエラーになります。
シート名を変更する状態になっているのですから、当然といえばそうでしょうが
vbaで、シート名変更状態をキャンセルして、Range("A1").activate をエラーなく
実行するには、どうすればいいでしょうか?。
また、シート名変更状態かどうかを、判定することはできるでしょうか?。

if シート名が変更状態なら then
(キャンセルして、セルをactiveにする)
end if
0285デフォルトの名無しさん2015/10/06(火) 12:32:24.59ID:pvo7HcyG
>>284
エラーメッセージぐらい書け
シート名が反転した状態からどうやってマクロ起動してるんだ?
そのマクロ、どこに書いてるんだ?Rangeにちゃんとシート指定してもダメなのか?
0286デフォルトの名無しさん2015/10/06(火) 13:13:15.32ID:ObRFSR9m
VBE開いたデバック状態でマクロ実行してるんじゃ?
通常だとシート名アクティブ状態でマクロそのものが実行できないだろ
0287デフォルトの名無しさん2015/10/06(火) 14:24:45.36ID:hiQs0jh9
SendKeys("Esc")
02882842015/10/06(火) 17:18:04.28ID:vCF6HdoW
>>285,286 失礼しました。
実行時エラー'1004' 'Activeメソッドは失敗しました'_Workbook'オブジェクト
A,B2つのブックがあって、AからBを処理しようとしてます。
マクロはAの標準モジュールに書いてます。Bブックの追加シートタブを1クリック、さらにうっかりもう1回クリックすると
シート名が反転状態になり、その状態でAフォームのBブックに対するモジュールを実行したら、エラーになりました。

>>287 ありがとうございます。下記のようにして、どうにかエラーが出なくなりました。
On Error Resume Next
Workbooks(target).Activate ' Bブック この時点でエラーになってしまうので
If Err.Number <> 0 Then
  Application.SendKeys "ESC"
Err.Clear
End If
On Error GoTo 0
UserForm1.Show (vbModeless)  '表示されてるフォームをアクティブにして
Application.SendKeys "ESC" 'こちらにもESC送らないと、いけませんでした。
0289デフォルトの名無しさん2015/10/06(火) 18:38:46.96ID:0TXrfnt1
DO LOOPで
列を1個づつずらしてループさせる方法をお願いします
0290デフォルトの名無しさん2015/10/06(火) 19:04:12.04ID:B9q/85j9
>>289
インクリメントすればいいんじゃ?
0291デフォルトの名無しさん2015/10/06(火) 21:32:26.91ID:wE29fvgY
上のIEの件もし解決出来てたら詳細教えてください
うちにも使えなくなったブックがあってダルくて考えるの放棄してるw
0292デフォルトの名無しさん2015/10/07(水) 08:11:32.88ID:qdqRCjiZ
受ける会社大丈夫?
下記の条件が全て当てはまる会社にご注意下さい。

・IT系 in tokyo
・「社名 労基」でググると過去の2chスレが出てくる
・転職会議で2.5点
0293デフォルトの名無しさん2015/10/11(日) 00:47:04.78ID:QkgTMuTY
with activecell.rows
.autofill .resize(1)
end with

これなにか間違ってる?
0294デフォルトの名無しさん2015/10/11(日) 00:52:22.49ID:tii6VF/Q
>>293
rows→row ?
0295デフォルトの名無しさん2015/10/11(日) 01:02:11.74ID:dc8fNJEd
>>293
俺の乏しい知識では間違いだらけに見える
.AutoFill Destination:=.Resize(10)
とかしないと動かない
0296デフォルトの名無しさん2015/10/11(日) 13:33:14.14ID:QkgTMuTY
>>294
rowって行数だよな

>>295
resizeの引数の考え方をoffsetと勘違いしてたっぽい
けどたぶん行全体のrangeをautofillするのがそもそも駄目な気がする
エクセル会社にしかないから今検証できないけど
0297デフォルトの名無しさん2015/10/13(火) 19:55:27.34ID:l9wB2pdG
>>296
こういうこと?
Sub test()
With ActiveCell
.AutoFill .Cells(1, 1).Resize(, 1 + Columns.Count - .Column)
.AutoFill .Cells(1, 1).Offset(, 1 - .Column).Resize(, .Column)
End With
End Sub
最初 .EntireRow でやってみたら、ActiveCellがA列のときしか駄目だった
0298デフォルトの名無しさん2015/10/21(水) 16:49:09.39ID:+5BbTA0D
特定のグラフの再描画を停止させることはできますか?
できるのでしたらやり方を教えて下さい。

シートにグラフが3枚あります。
2枚のグラフのデータ領域は5秒間隔で書き換えられます。
残りの1枚のグラフは5分間隔でデータが書き換えられます。
グラフ1:データ数180*7系列 データ更新頻度:5秒
グラフ2:データ数180*6系列 データ更新頻度:5秒
グラフ3:データ数900*6系列 データ更新頻度:5分

3枚目のグラフは5分間隔で再描画されれば十分のですが、5秒間隔で再描画されているように見えます。
この再描画に結構時間がかかっているようですしリソースも食っているように感じます。
3枚目のグラフが5秒おきに再描画されるのを止めたいのですが可能でしょうか?
0299デフォルトの名無しさん2015/10/21(水) 16:53:11.23ID:jtu/I8YX
グラフを5秒おきに書き換えたいって、為替とか株やってる人なのかなぁ。
03002982015/10/21(水) 17:03:52.89ID:+5BbTA0D
>>299
正解!
03012982015/10/21(水) 17:12:29.63ID:+5BbTA0D
今は暫定的に
Sheet1:グラフ1とグラフ2
Sheet2:グラフ3
というように3枚のグラフを別シートに置き、
5秒間隔のデータ更新時は、Worksheets("Sheet2").EnableCalculation = False のようにし、
5分間隔のデータ更新後に、Worksheets("Sheet2").EnableCalculation = True でグラフ3を更新しています。
できれば3枚のグラフは一つのシートに配置したいのです・・・
0302デフォルトの名無しさん2015/10/21(水) 19:08:39.42ID:dF+6DuJI
株価book見てみたい!
0303デフォルトの名無しさん2015/10/21(水) 20:51:45.44ID:ZXMR/M8n
データを直接シートに、5秒毎に書き込むから、
それが再描画されるのだろう

データ → メモリ → シート

のように、間にメモリか配列(コンテナ)をおいて、
5秒毎にメモリに書き込んで、そこにデータを貯めておいて、
シートには5分毎にしか書き込まない
0304デフォルトの名無しさん2015/10/21(水) 21:55:36.77ID:reylgbjK
>>299
そういう用途は、Googleスプレッドシートのほうが楽に出来る。
0305デフォルトの名無しさん2015/10/21(水) 22:12:42.83ID:+5BbTA0D
>>303
え、え?よくわかりません
グラフ1とグラフ2は5秒毎に更新したい、
グラフ3は5分毎に更新したいのです
シートに5分毎に書き込まなかったらグラフ1,2は5秒毎に更新されないのでは?

>>304
ちょいとググってみます
0306デフォルトの名無しさん2015/10/21(水) 22:32:19.10ID:t2Kd5CVN
>>305
3つのグラフをシート1に置き、
グラフ1とグラフ2のデータをシート1に、グラフ3のデータだけシート2に置く。
シート1のデータは5秒おきに更新し、シート2のデータは5分おきに更新する。

じゃダメなの?
0307デフォルトの名無しさん2015/10/21(水) 22:36:58.59ID:+5BbTA0D
>>306
あーなるほどー
今エクセルできる環境じゃないので明日の夜に試してみます
私頭固いんでそういう柔軟な発想ができないんですよね
非常にありがたいんですが非常に悔しいです
ありがとうございます!
0308デフォルトの名無しさん2015/10/21(水) 22:41:33.05ID:OyO16cpw
頭固くて株は大丈夫なのか?
0309デフォルトの名無しさん2015/11/14(土) 14:26:30.36ID:kOM7V2YG
コンボボックスに入れた数値にバリデーションチェックをかけたいのですが

Private Sub ComboBox1_Change()
With ComboBox1.Validation

ってやるとメソッド又はデータメンバーが見つかりませんというエラーが出ます。
どうやればバリデーションチェックをかけられますでしょうか。
0310デフォルトの名無しさん2015/11/14(土) 17:47:27.05ID:v0Sve+AN
>>309
自分でそのバリデーションチェックというのを実装すればいい
バリデーションチェックて具体的になに?
0311デフォルトの名無しさん2015/11/14(土) 18:09:07.45ID:saXVV+dT
>>309
こんな方法はどうですか? (セルの入力規則を利用する方法)

セルに入力規則をかけておく (下記例では B1 としている)
※ LinkedCellの設定が同じ(つまり B1)なら正しく制御できない為 LinkedCellの設定削除

んで
Private Sub ComboBox1_Change()
  Dim Save As Variant
  With Range("B1")
    Save = .Value
    .Value = ComboBox1.Value
    If .Validation.Value = False Then
      .Value = Save
       MsgBox "入力規則に合っていません。"
    End If
  End With
End Sub
0312デフォルトの名無しさん2015/11/15(日) 03:12:39.36ID:XgNMkXlR
>>311
.valiidationはセルにするという基本を知りませんでした。
でtrue false判定ができるんですね
この方法は便利ですね。
入力値にセルのバリデーションを介さず直接判定をかける方法もあるんでしょうが、私には難しいと思います。

ありがとうございました。
0313デフォルトの名無しさん2015/11/20(金) 12:48:13.07ID:6QRhjKxy
何か実行する時にまとめてチェックするといいよ
0314デフォルトの名無しさん2015/11/23(月) 18:05:34.71ID:E/AQhXvM
VBAの処理を完全終了(停止)してからその後に
次実行したいプロシージャを自動で実行させる方法はありますか?
可能であればBookをすべて閉じて開き直したブックに書かれたプロシージャを実行させたり
Excel事態を再起動してBookを開き次にじっs校するプロシージャを動かせれば完璧なのですが、こういうことをやる方法はありますでしょうか?かのうでしょうか?
0315デフォルトの名無しさん2015/11/23(月) 18:40:53.20ID:rlgjQim1
Variant型変数はセル範囲や配列も代入できるでしたっけ?
この辺のしくみを竹を割ったようにサッパリと分かりやすく解説していただけないでしょうか?
0316デフォルトの名無しさん2015/11/23(月) 19:28:58.01ID:DSD5gnTN
>>314

ExcelVBA 裏ワザ大辞典って本で
「一時的にVBScriptファイルを作成して、それを使ってExcelを再起動する方法を解説する」ってのがあった
後は本のタイトルでぐぐればゲフンゲフン w
0317デフォルトの名無しさん2015/11/24(火) 01:21:12.88ID:wu4gTPMZ
>>315
Variantの中には必ず2つのデータが組で入ってて、1つ目は変数の内容そのもの、もう1つは変数の型が入ってる
型の部分は変数を代入する時に、自動的にセットされる
何の型がセットされたか調べるにはTypeName関数を使う
何がセットできるかはMSDNに一覧がある
どうやって型を決めるかのアルゴリズムは確か非公開だったように思う

(例)
Dim a As Integer
Dim b As Variant
a = 123
b = a ' Variant型変数にInteger型変数を代入
Debug.Print TypeName(b) ' Integerと表示される
0318デフォルトの名無しさん2015/11/24(火) 08:48:27.95ID:DVbUiEch
>>317
> 何の型がセットされたか調べるにはTypeName関数を使う

デバッグとかで型名表示するだけならともかく、型で処理を分けるとかなら VarType 関数の方がいいと思う
03193152015/11/24(火) 10:50:41.90ID:2xX81aKH
>>317
なるほどすばらしい。
ありがとうございます。
0320デフォルトの名無しさん2015/11/25(水) 11:39:32.64ID:/lbny/AY
お願いします。
配列に小数点のある数値を格納した場合、勝手に第二小数点まで四捨五入されてしまうのでしょうか?
dim data() as currencyで作ってみたのですが、
VBAなしで作った計算結果とVBA配列を使った同じ計算結果が全く違う答えになってしまいました。
0321デフォルトの名無しさん2015/11/25(水) 13:19:12.11ID:8iY9CP3j
>>320
何か勘違いしてないか?

Sub foo()
  Dim data(0) As Currency
  data(0) = 1.23456
  Debug.Print data(0)
End Sub

結果: 1.2346
0322デフォルトの名無しさん2015/11/25(水) 20:34:25.57ID:GSr8zJ+4
>>320
そのまま四捨五入するとExcelの関数とVBAでは丸め方が違うからその差が出てるんじゃない?

詳しくはWebで
0323デフォルトの名無しさん2015/11/26(木) 13:24:16.18ID:Oi+4AKMW
ありがとうございます。
割り切れない小数点同士の割算をさせるとき、誤りが出る可能性があるんですね。
0324デフォルトの名無しさん2015/11/26(木) 14:23:11.88ID:K8Py7wqE
>>323
Excel側の都合で誤差が出ることもあるし、計算は正しいのに見た目が違うだけの場合もある

実際の数字は小数点以下が20桁ぐらいあるのに書式によって一部しか表示されてないとか、
セルの幅によって表示桁数が自動的に変わるなんてことは割とよくある
0325デフォルトの名無しさん2015/11/26(木) 14:37:15.59ID:wjty/3s6
>>323
> 割り切れない小数点同士の割算をさせるとき、誤りが出る可能性があるんですね。
今回のケースでは通貨型を使ったのが丸められた原因で、
なおかつ、通貨型は小数点以下第5位以下が五捨六入される

そういうことじゃないのか?
0326デフォルトの名無しさん2015/12/03(木) 18:05:47.92ID:/h+G/URd
通貨型ってなんの得があるんだろうな
0327デフォルトの名無しさん2015/12/03(木) 18:21:57.99ID:jUS2N3R7
浮動小数点の誤差がでない
0328デフォルトの名無しさん2015/12/03(木) 19:13:33.78ID:9IIGTedn
金に縁がない人には一生分からんだろ
0329デフォルトの名無しさん2015/12/03(木) 20:14:08.33ID:6hyvlQba
BCD
コボル
0330デフォルトの名無しさん2015/12/03(木) 21:18:37.38ID:srgQPG9D
Longより大きな数が扱えて誤差が出ない
doubleの上位非互換
0331デフォルトの名無しさん2015/12/04(金) 09:42:47.69ID:7C0cNGgl
Longより大きな額を扱う人にはおなじみ
■ このスレッドは過去ログ倉庫に格納されています