Excel VBA 質問スレ Part17

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:2011/02/13(日) 11:32:22
on Error Resume Next 難しいな
使わずに書こうと思ってたんだけど、使わないとどーしても避けれない処理がある
Range.Pastespecial を使うときに

 on error resume next
 range.pastespecial
 on error goto 0

ってon error で囲まないとエラー時の対応が出来ない(解らない)
どーしたもんか・・・
953デフォルトの名無しさん:2011/02/13(日) 11:44:20
open とかのファイルを扱う際のエラー処理にも必須だと思うが...。

> どーしたもんか・・・

書いてる通り on error で囲むだけだろ?
何が難しいのか、理解するのが難しいよ (w
954デフォルトの名無しさん:2011/02/13(日) 12:25:24
一つの元データのあるブックから、複数のブックにデータを
コピーしたいのですが、

Sub A08管理図の入力()

Dim OpenFileName As String 'ファイルオープン
Dim 転記元 As Workbook, 転記先 As Workbook
MsgBox "最初の管理図を開いてください"
ChDrive "D"
ChDir "D:\結果"
OpenFileName = Application.GetOpenFilename("Microsoft Excelブック,*.xls?")
If O <> "False" Then
Workbooks.Open OpenFileName
Else
MsgBox "キャンセルされました"
Exit Sub
End If
Set 転記先 = ThisWorkbook
転記先.Worksheets("確認").Select

としているのですが、
[ 転記先.Worksheets("確認").Select ]
のところで実行時エラー’9’
が出ます。
転記先のシートが複数あるのでそれぞれ選択するにはどうすればよろしいでしょうか?

ここで躓いて先に進めません。
955デフォルトの名無しさん:2011/02/13(日) 12:58:24
>>951
Trim かけて "" と比較するのがよくない?
大したコストじゃないでしょ。
956デフォルトの名無しさん:2011/02/13(日) 13:05:31
>>954
まず、エラーについて

元データブックを開いた段階で、転記先ブックがアクティブじゃなくなる

従って

Set 転記先 = ThisWorkbook
転記先.Activate
転記先.Worksheets("確認").Select

とする

次に複数のシートを選択するには、SelectのオプションReplaceを指定する

Worksheet オブジェクト.Select(Replace)

以下、Replaceについての引用
(シートでのみ使用) 既に選択しているオブジェクトの選択を解除して、
指定したオブジェクトのみを選択するには、True を指定します。
既に選択しているオブジェクトに加えて、指定したオブジェクトを選択するには、False を指定します。
957954:2011/02/13(日) 13:32:28
>>956さん
私の書き方が悪く申し訳ありません。
転記元ブックはもともと開いており、このコードを記述しています。

[OpenFileName = Application.GetOpenFilename("Microsoft Excelブック,*.xls?") ]
で開くのは転記先ブックです。

いま見直して気付いたのですが、[Set 転記先 = ThisWorkbook]
が間違っているとおもうのですが、どう修正したらよいでしょうか?

Worksheets("確認")は後から開いた転記先ブックにあり、

Set 転記先 = OpenFileName
転記先.Activate
転記先.Worksheets("硬質").Select

としてもエラーが出ました。

958デフォルトの名無しさん:2011/02/13(日) 14:42:46
>>951

If TextBox1.Text = "" Then

これじゃ拙いのか?
もしそうなら理由を請う!
 
959956:2011/02/13(日) 17:44:41
>>957
もう解決してるかもだけど

If OpenFileName <> "False" Then
Set 転記先 = Workbooks.Open(OpenFileName)
Else
MsgBox "キャンセルされました"
Exit Sub
End If

で、いいかなと

デバッグとかの使い方を練習した方が良いかと思う
960954:2011/02/13(日) 17:58:34
>>959
上手くいきました。ありがとうございました。

おっしゃる通りまだまだ勉強不足なので精進します。

助かりました!
961デフォルトの名無しさん:2011/02/13(日) 18:58:18
>>958
色々Bingってみたりしたけど、結論としては、
vbNullStringは、ポインタに変換すると必ずNULLになる空文字列、
って感じっぽいな。
つまり、文字列として扱っている分には、""と全く変わらない。
""がポインタに変換された時、必ずNULLにならないかどうかは知らん。
962デフォルトの名無しさん:2011/02/13(日) 19:11:44
TextBoxやComboBoxは未入力時は長さ0の文字列じゃなく値0の文字列を返すから
If TextBox1.Text = vbNullString Thenがベターではある。
If StrPtr(TextBox1.Text) = 0 Thenでもよいが。
963デフォルトの名無しさん:2011/02/13(日) 19:52:00
プログラムかいてると、
人間の判断力ってすげぇ
って思えてくる
964デフォルトの名無しさん:2011/02/13(日) 21:07:08
>>962
>TextBoxやComboBoxは未入力時は長さ0の文字列じゃなく値0の文字列を返す
これをはっきり示した資料あるか?

TextBox1.Textなんかだと、""代入してもvbNullStringになるっぽいが、
普通の文字列変数だとそうならないみたいだな

VBAでは通常NULLストリングとNULLポインタの区別をする必要はないんだし
API呼び出し等で明示的にNULLポインタである必要がある場合以外、vbNullStringは
使わない方がいいと思うが
965958:2011/02/13(日) 23:51:07
確かにstrptrでは0になるな

ただ、
TextBox1.Text = ""
TextBox1.Text = Empty
TextBox1.Text = vbNullString
これがみなTrueになるわけだから、
今回のことは知識として頭にいれとく程度でよさそうだな

それに、>>964も言っとるように、
またヘルプにも書いてあるように
vbNullStringは外部プロシージャの呼び出しで使うのがええような。。

何れにしろ、またまた勉強になった、ありがとな
966デフォルトの名無しさん:2011/02/14(月) 20:02:06
web上にあるファイルをダウンロードするのに何かないかなと思って
探したらURLDownloadToFileというのがあって使ってみたんだけど

URLDownloadToFile(0, "https://www.abc.com/123.xls", "c:\", 0, 0)

プロトコルがhttpならOKなんだけど、httpsでsslが入るとダメ。
これって何かいい解決方法はないでしょうか?

それともVBAでhttpsでファイルを落とすのは無理?
分かる方是非教えてください!
967デフォルトの名無しさん:2011/02/14(月) 21:28:34
>>966
MSXMLを使えば可能
968デフォルトの名無しさん:2011/02/14(月) 21:46:56
>>967
ありがとございます!
ちょっと調べてみたのですが

Dim objHttp as Object buf As String
Set objHttp = CreateObject("MSXML2.XMLHTTP")
objHttp.Open "GET", "http://www.abc.com/123.xls", False

こんな感じのコードで上のコードで「http」の部分が「https」でも
OKということでいいでしょうか?
ちょっと今実行環境がないので。。。
ありがとございます!
969デフォルトの名無しさん:2011/02/15(火) 11:55:32
ユーザーフォーム内でenterキーにhogeボタンを押したときと同じ動作をさせたいです
ググりながらやってみましたが何か根本的に間違ってるような気がしてきました
どうしたらいいのでしょうか?

Sub UserForm_Initialize()
   Application.OnKey "{Enter}", "hoge_Click"
End Sub

Sub hoge_Click()
   xxx
End Sub
970デフォルトの名無しさん:2011/02/15(火) 12:32:44
>>969
そのフォームの中にボタンが一個だけで、他に入力や選択を行うコントロールが一つもなければ
何も書かなくても自動的にEnter=ボタンクリックになる

あと、Application.OnKeyはEnterには使えない仕様
971デフォルトの名無しさん:2011/02/16(水) 09:22:58
>>970
enter以外を割り当てても反応しないので諦め、
ttp://okwave.jp/qa/q4178922.htmlで紹介されている方法は理解を超えていたので
Acceleratorプロパティで我慢することにしました
どうもありがとうございました
972デフォルトの名無しさん:2011/02/16(水) 18:19:07
もしスレチだったらすみません。

accessのVBAからADOでexcelに
データを書きだしているのですが、
文字列扱いの数字にエラーインジケータが
ついてしまいます。
これをVBAで解除することは
できるのでしょうか?
973デフォルトの名無しさん:2011/02/16(水) 20:08:04
>>972
最初からエラーチェックをしない設定には出来ないの?
974デフォルトの名無しさん:2011/02/16(水) 20:22:28
Excelのヘルプで『エラーインジケータ』を見ると
色々出ていると思う

ただ、データのコンバージョンでエラーが出た場合、
一応、すべて目を通さないとひどい目にあうかも?
975972:2011/02/16(水) 21:28:36
>>973
表示の有無設定ってツールオプションで行うので
ユーザの環境によって変わると思ってたんですけど
認識違いですかね?

>>974
ありがとうございます。
一度ヘルプも確認してみます。
976デフォルトの名無しさん:2011/02/18(金) 20:55:48
VBAもいいかげんアップデートしてくれないものか
せめて構造化例外とオーバーロードを・・・
977デフォルトの名無しさん:2011/02/18(金) 23:25:57
GetOpenFilename等でユーザーが指定したファイルのパスをUNCパスに置き換える方法を教えてください。
自分ではパワーシェル等でネットワークドライブの一覧を取得して
割り当てられているドライブ名をコンピュータ名に置き換えるという方法しか考えつかなかったのですが、
それ以外に何かやり方はないでしょうか?
978デフォルトの名無しさん:2011/02/19(土) 00:50:28
>>977
このへんが参考になるかな?
ttp://support.microsoft.com/kb/160529/ja
979デフォルトの名無しさん:2011/02/19(土) 08:57:23
IF文で判定させたいのですが、変数 i が
60から55、55〜50のような感じで条件をだしてマクロを組んで見たのですが
上手く判定してくれません。

Dim i AS Integer

i = Range("A1").Value
If 60 >= i > 55 Then
Range("B1").Value = "A"
ElseIf 55 >= i > 50 Then
.Range("B1").Value = "B"
END IF

どうしたら判定してくれるのでしょうか??

980デフォルトの名無しさん:2011/02/19(土) 09:17:51
977です
978>>
ありがとうございます!リンク先読んできました。
あるユーザーが指定したファイルを複数人で使う想定だったので
個人の環境に依存するネットワークドライブ名を使いたくなかったんです。
おかげさまでできそうです!
981デフォルトの名無しさん:2011/02/19(土) 09:32:47
リンクミスった
>>978さんありがとうございました!
982デフォルトの名無しさん:2011/02/19(土) 09:35:26
>>979
If (60 >= i) And (i > 55) Then
983デフォルトの名無しさん:2011/02/19(土) 10:00:34
>>982
上手く判定してくれました。
早いレスありがとうございました。

984デフォルトの名無しさん:2011/02/19(土) 16:02:02
エクセル2002を使ってます。

あるセルの値をクリアしたら、その行のZ列の値もクリアしたいのですが、

Dim jissibiRow As Integer
If Target.Value = "" Then 'あるセルの値をクリアしたら
jissibiRow = ActiveCell.Row 'そのセルの行番号を出して
Range("Z" & jissibiRow).ClearContents 'その行のZ列の値もクリアする

とすると、Z列の値は消えるのですが、消えるまでに5秒程度かかってしまいます。

If Target.Value = "●" Then 'あるセルに●を入力したら(実際はプルダウンで入力)
jissibiRow = ActiveCell.Row 'そのセルの行番号を出して
Range("Z" & jissibiRow) = "実施済み" 'その行のZ列に実施済み"と表示

の場合は直ぐに実施済みと表示されるので、セルをクリアした場合の判定が間違っていると
思うのですが、どのようにすればよろしいのでしょうか?
985984:2011/02/19(土) 17:15:15
>>984です。
少し状況が変わってきました。

Range("Z" & jissibiRow).ClearContents を

Range("Z" & jissibiRow) = "" にしても同じように時間が掛かったのですが、

Range("Z" & jissibiRow) = " " ”と”の間に半角スペースを入れると直ぐに反応するようになりました。

何も入れないと時間がかかるということは分かったのですが、やはり何も入れたくないです。
どのように修正すればよいかアドバイスお願いいたします。
986デフォルトの名無しさん:2011/02/19(土) 18:50:55
>>985
http://codepad.org/O5beUhFS
バージョンによってはClearContentsが遅いみたいだな、使わなければいいんでないの?
987デフォルトの名無しさん:2011/02/19(土) 20:55:50.87
>>985
部分的なコードを提示しちゃだめだぞぃ
Changeイベントを使っていると思うがそれだと

1.Range("Z" & jissibiRow).ClearContents
2.Range("Z" & jissibiRow) = ""
3.Range("Z" & jissibiRow) = " "半角スペースを入れる

上記1,2,3でもZ列のChangeイベントが発生する
そして、1,2では、
  If Target.Value = "" Then
これに引っかかるからエンドレスになる
(実際はある回数で止まる)ので遅くなる

3では、If Target.Value = "" Then
 に引っかからず即終了するから早くなる

●このようにChangeイベント内でセルに値を入れたら
そのセルのChangeイベントが発生するので
それを止めるコードを追加しなといけない

Application.EnableEvents = False  '▼イベントOFF
  Range("Z" & jissibiRow).ClearContents
Application.EnableEvents = True  '▲イベントON


それから、
jissibiRow = ActiveCell.Row は
jissibirow = Target.Row  の方がベター

988デフォルトの名無しさん:2011/02/19(土) 23:35:45.10
csvを読み込んだんですが、数字として認識されません(セルの左上に緑が付きます)
「文字列のセルを数字にする」or「数字として読み込む」方法はあるのでしょうか?
989デフォルトの名無しさん:2011/02/20(日) 00:47:49.86
990デフォルトの名無しさん:2011/02/20(日) 00:49:31.80
>>987
御指摘のとおりchangeイベント使っておりました。
的確な回答ありがとうございました。
イベントを止めるコード勉強になりました。
Target.RowとActivecell.Rowの違いも調べます。

>>986
ありがとうございました。
こういうやりかたもあるのですね。勉強になりました。
991デフォルトの名無しさん:2011/02/20(日) 10:39:21.74
 
992デフォルトの名無しさん:2011/02/20(日) 17:07:39.23

次スレお願いします
993デフォルトの名無しさん:2011/02/20(日) 20:11:38.84
自分で作ったユーザーフォームを実行中に、シートをいじれる状態にするにはどうすればいいですか
今はユーザーフォームが常に最前面に出てしまい、ユーザーフォームを消さない限りシートをスクロールすることすら出来ません
994デフォルトの名無しさん:2011/02/20(日) 20:27:26.56
>>993

Showメソッドの引数に、 0 又は、vbModeless を指定する

  UserForm1.Show 0  又は、vbModeless

詳しくはShowメソッドのヘルプをみれぃ
 
995デフォルトの名無しさん:2011/02/20(日) 20:48:48.73
>>994
どうもありがとうございました
996デフォルトの名無しさん:2011/02/20(日) 23:53:43.98

落ちる前に埋め
997デフォルトの名無しさん:2011/02/21(月) 00:33:04.04
998 冒険の書【Lv=2,xxxP】 :2011/02/21(月) 01:27:39.21
lv低すぎてダメ
999デフォルトの名無しさん:2011/02/21(月) 07:15:57.90
梅三郎
1000デフォルトの名無しさん:2011/02/21(月) 07:17:56.02
ありがとう。そして、さようなら。
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。