Excel VBA 質問スレ Part21at TECH
Excel VBA 質問スレ Part21 - 暇つぶし2ch50:デフォルトの名無しさん
11/09/28 04:05:46.87
>>45
いや、最初無いと思ったんですが、>>16で質問してisといわれたので、isで不等号使って
望みどおりできるのかなと。ちょっとやってみたら出来た気がして

意味はわからなかったんですが、これでいいのかなと。
でも詳しく使ってみると、思ってた用途と全然違って、再度質問しました。

ほとんど初心者なんです。
>"2011_09_27osaka晴"って文字列は"tok"より小さいからね。
これも意味がわからないです。文字数という意味でなら前者の方が大きいと思うんですが
この場合何の大小の比較になるんでしょうか?

51:デフォルトの名無しさん
11/09/28 07:09:23.17
>>46
InStrでもLikeでもどっちでもいいんだよ。
たいがいの人は両方使えるよ。

52:デフォルトの名無しさん
11/09/28 07:23:39.95
>>50
バイナリモードの文字列の大小はまず先頭の文字の文字コードで大小比較する。
先頭の文字が同じときは次の文字で大小比較する。
それも同じときはそのまた次の文字で大小比較する。
"2011_09_27osaka晴"と"tok"ではまず"2"と"t"で比較する。
"2"の文字コードは"t"の文字コードより小さいから"2011_09_27osaka晴"は"tok"より小さい。
"a12"と"a3"の比較なら"a12"が小さい。

53:デフォルトの名無しさん
11/09/28 08:25:32.72
>>52
ありがとうございます。文字コードの大小だったんですね。
それだと確かに全然思い通りに分けられないですね。
理解しました。ありがとうございます。

54:デフォルトの名無しさん
11/09/28 10:23:57.30
>>48
プロパティ=変数
メソッド=関数

55:デフォルトの名無しさん
11/09/28 16:49:01.67
なんとなく理解できた

56:デフォルトの名無しさん
11/09/28 17:26:18.01
今居るセルの1つ下の列から始めて
同じ列に文字が入力されているセルまでをloopで見つけたいのですが
Do
a = a + 1
Loop While Cells(a, 1) Like "*"
と考えてみたのですが駄目無限ループしていまします。
どなたか分かる方お願いします。

57:デフォルトの名無しさん
11/09/28 17:47:26.99
文字が入力されているかどうかならこれで良いと思うんだけどなんで、わざわざLikeを使ってんの?

Loop Until Cells(a, 1) <> ""



58:デフォルトの名無しさん
11/09/28 19:11:04.73
文字とか数字とかの区別が必要なのかどうかわかんないけど、
セル(a,1)から下方向にセルが空欄かどうかを調べるだけなら
.cells(a,1).end(xldown).row
のほうが早くない?

59:デフォルトの名無しさん
11/09/28 20:00:04.92
まさかとは思うが下方向に空欄しかないんじゃ
それと列って言ってるけど行のことだよね

60:デフォルトの名無しさん
11/09/28 20:10:41.09
1つ下の行の同じ列ってことか
(a,b)
(a+1,b)

61:デフォルトの名無しさん
11/09/28 20:17:08.39
>>56
Like "*"
だと セルが空欄でも(入っていても) 常に True になるよ
Likeの文字パターン * は任意の数の文字(=文字数0も含む)だから

62:デフォルトの名無しさん
11/09/28 20:33:46.80
nなんでこんな知識が偏ってるんだ・・・・

63:デフォルトの名無しさん
11/09/28 21:23:42.51
execl2000です
前スレでpictureはhtmlで保存して抽出するのが一般的と教えてもらったものですが
SaveAsを使ってhtmlにしたら自分自身が保存したhtmlになってしまいます
エクスポートするような形でhtmlファイルに保存するにはどのようにしたら良いでしょうか

64:デフォルトの名無しさん
11/09/28 21:46:35.71
>>63
前スレにそれらしき質問が見当たらないんですが、
どんな質問だったのですか?
(前スレを全部開いて「html」と「picture」と、ついでに「jpeg」でスレ内検索しました)

65:デフォルトの名無しさん
11/09/28 22:18:38.38
pictureをエクスポートする方法を質問しました

66:デフォルトの名無しさん
11/09/29 01:21:03.34
>>4

67:デフォルトの名無しさん
11/09/29 08:05:31.43
ああ前スレじゃなかったですね

68:デフォルトの名無しさん
11/09/29 08:21:44.17
あーそれhtmlで出さなくてもjpg出力できるわー
今ちょっと時間ないしどうやったか忘れたけど昔やったわー

69:デフォルトの名無しさん
11/09/29 11:03:53.95
>>63
これなんか参考にならない?
URLリンク(vbatips.blog37.fc2.com)

あと、質問するなら名前欄に最初のレス番かなにか入れてよ
もちろんHNとかトリップとかでもいいけど
ここID出ないんで誰のレスなのか分かりにくいから


70:デフォルトの名無しさん
11/09/29 15:34:38.90
>>69
できました
ありがとうございます

71:デフォルトの名無しさん
11/09/29 23:55:22.48
Win7、Excel2010なんだけど、
IEのダイアログを操作する方法ってないかな?
ウィンドウハンドルとIHTMLDocumentは取得できるんだけど
ここから、フォームに入力したり、ボタンとかクリックする方法がないかな?

72:デフォルトの名無しさん
11/09/30 10:51:15.62
Excel2007

デジタル署名をVBE→ツール→デジタル署名から作ってみたのだけど、
[証明書の表示]を見ると、

このCAルート証明書は信頼されていません。信頼を有効にするには
この証明書を信頼されたルート証明機関のストアにインストールして
ください。

とあります。この「ルート証明機関のストアにインストール」する
にはどうすれば良いの?

(全く個人用なので公開とかするつもりは全っ然ないのですが)


73:デフォルトの名無しさん
11/09/30 13:35:30.72
>>71
数年前にVB6で同じようなものを作ったが、ウィンドウハンドルは必要ない。

74:デフォルトの名無しさん
11/09/30 20:18:17.14
windows2000、Excel2003

質問です。
ある一つのユーザーフォームを呼び出すプロシージャが2つあるのですが、
どっちのプロシージャから呼び出されたか判定出来るようにしたいです。
何かヒントだけでもいいので、教えてください。

75:デフォルトの名無しさん
11/09/30 20:33:35.98
>>72
VBEで証明書つくれるようになったのか?手順教えてくれ
まあどこで作った証明書でも良いんだが、証明書ファイルを(エクスプローラで)
ダブルクリックしたらインストールできなかったか

>>74
フォームにそれ用のフィールドなり変数なり作って呼び出し元のプロシジャで値をセットする
グローバルな変数をつかう
どっかのシートにどっちが呼び出したか書く

76:デフォルトの名無しさん
11/09/30 20:53:25.48
>>75

72です

作ったのは
Windowsのスタートメニュー
→Microsoft Office
→VBAプロジェクトのデジタル署名
で出てくる[デジタル証明書の作成]
に名前を入れてみたんですが
(ちなみにOSはXP)

77:74
11/09/30 20:57:22.20
>>75
シートに書くという基本的な事が頭から抜けてました。
ありがとうです。

78:デフォルトの名無しさん
11/09/30 21:11:16.23

With Selection
.Replace what:=Worksheets("sheet1").Cells(3, 2),
replacement:=Worksheets("sheet2").Cells(3, 2).Value,
Lookat:=xlwhole,searchorder:=xlbyrows,matchcase:=false,matchbyte:=false
End With

この部分で構文エラーと出ます。何がいけないんでしょうか?

79:デフォルトの名無しさん
11/09/30 21:14:38.11
>>76
いつの間にか証明書作れるようになってたんだな
それで作ると勝手に個人用ストアに作られてるみたいなんで、管理コンソールで移動すれば良いんじゃないかな
やり方はスレチなんで、MMC 管理コンソール 証明書 あたりでググって

80:デフォルトの名無しさん
11/09/30 21:37:12.80
>>79
72です。出来ました。ありがとう!

81:デフォルトの名無しさん
11/10/01 00:49:33.54
2、3日前に初挑戦したバカですが、どうかお相手お願いします。
LCLICK 1215,176
KEY [Ctrl]++
KEY [End]
KEY [Ctrl]--
LCLICK 709,441
KEY [Ctrl]++
KEY V
KEY [Ctrl]--
LCLICK 723,753

このような簡単なものを作ったのですが、何度も何度もペーストしてしまいます。
一時停止にはDELAYコマンドを使うといいという記事も見たのですが
どうもDELAY 3000 等でも3秒止まってくれません、記述の仕方に問題があるのでしょうか?
お願いします

82:81
11/10/01 00:51:31.71
ごめんなさい、記述し忘れました。ループ操作を実行した時にペーストが数度繰り返されてしまいます。
どうか、お助けください

83:デフォルトの名無しさん
11/10/01 00:54:08.83
スレタイ2000回読んだ方がいい

84:デフォルトの名無しさん
11/10/01 01:00:10.36
>>78
それその位置で改行してるのか?
VBAはどこでも改行していい言語じゃないぞ

>>81
ここ、何のスレか解ってるのか?

85:デフォルトの名無しさん
11/10/01 01:00:31.41
uwsc??

86:81
11/10/01 01:04:24.72
>>83申し訳ないです。VBAに関するスレッドが見つからなかったもので、書き込んでしまいました。
>>84申し訳ないです。質問スレ等が見つからなかったのでお邪魔な書き込みをしてしまいました。
許してください・・
>>85
KMmacroというのを使っております


87:デフォルトの名無しさん
11/10/01 01:34:52.43
それVBAじゃないみたいだけどVBAってなんだか分かってる?

88:81
11/10/01 01:38:05.77
>>87そうなんですか!?オフィス上で自動化の作業をマクロを組んでおけば自動化してくれるものだと思っていました。


89:81
11/10/01 01:58:45.57
81です、すごくお邪魔になるので自分はここから出て行きます。ご迷惑おかけしました。

90:デフォルトの名無しさん
11/10/01 07:22:16.86
もう見てないだろうけどスレどころか板違い

こっちね
URLリンク(hibari.2ch.net)

91:デフォルトの名無しさん
11/10/01 11:22:43.57
OS:Windows 7 (64bit)
Excel: Excel 2007

officetanaka.net/excel/vba/tips/tips20.htm
クリップボードの使い方自体が分からなかったので、ここの
ダイレクトに格納/取得するを見てコピーできるようにはできたのですが、
Windowsのメモ帳でテストしてOKだったので、ペーストしたいソフトの方に
ペーストをしてみたら何もペーストされませんでした。

調べてみたところ、下の通り普通のテキスト?ではないようなので、
Unicode非対応のソフトにテキストをペーストできるようにしたいのですが、
UnicodeからShift-JISへの変換はどのようにすればいいのでしょうか?
dzone.sakura.ne.jp/blog/2009/12/excel-vba.html

よろしくお願いします。

92:デフォルトの名無しさん
11/10/01 11:57:32.58
>>91
そこまで分かってるなら普通にUnicodeからShift-JISに変換するだけ

Msgbox LenB("a") '結果は2

Msgbox LenB(StrConv("a", vbfFromUnicode)) '結果は1

93:91
11/10/01 22:43:50.50
>>92
レスありがとうございます。
その、UnicodeからShift-JISへの変換が分からないのです。

たとえば、A1のセルに「あいうえお」と入力されていて、
下記のようにしても、ペーストできるようにはなるのですが、
?????という文字になってしまいます。

Dim buf As String
Dim CB As New DataObject
Dim myStr

myStr = Sheet1.Cells(1, 1)
buf = StrConv(myStr, vbFromUnicode)

With CB
.SetText buf ''変数のデータをDataObjectに格納する
.PutInClipboard ''DataObjectのデータをクリップボードに格納する
End With

度々すみませんが、よろしくお願いします。

94:デフォルトの名無しさん
11/10/01 23:53:57.89
クリップボードってWin32APIレベルではデータの種別も持つようになってるんだけど
DataObjectってその辺設定するプロパティないよね
もしかしてunicode固定なんじゃないの?

95:デフォルトの名無しさん
11/10/01 23:59:05.29
ClipboardFormats

96:デフォルトの名無しさん
11/10/02 00:04:00.73
それは読み取り専用プロパティでしょ

97:デフォルトの名無しさん
11/10/02 00:45:21.02
>>91 >>93
関係あるかわからないけど
VB6の記事だけど こんなんみつけた

Microsoft Formsでのクリップボード操作のバグ?
URLリンク(hanatyan.sakura.ne.jp)

98:デフォルトの名無しさん
11/10/02 02:34:12.80
>Forms 2.0 の MSForms.DataObject の SetText メソッドを用いていた場合、
>CF_TEXT 形式のデータが正しく出力されないようです。

だめぽいね

99:デフォルトの名無しさん
11/10/02 10:11:04.04
WindowsVista
Wxcel2007
おはようございます。VBA歴半年の初心者です。
ユーザーフォーム上に配置した4つのチェックボックスのONOFFによって、
同じユーザーフォームに配置したリストボックスに表示されたデータにソートをかけて表示させる処理を作ったのですが、どういうわけか、この処理が実行されるたびに、リストボックスのサイズ(Height?)が少しずつ下から減っていきます。
理由が分からず、対応方法が思いつきません。
識者の方々、ご指導願います。

100:デフォルトの名無しさん
11/10/02 10:15:48.44
以下チェックボックス操作時に実行されるプロシージャです。
このコードの中にリストボックスのサイズに影響を与える要素があるとは思えないのですが…
Sub ステータスチェック更新()
(略)
'リストボックス再表示
Call UserForm9_OK
'リストボックスの値を recordC へ取得
recordC = UserForm8.ListBox1.column()
ReDim recordD(8, UBound(recordC, 2))
k = 0
(続きます)

101:99
11/10/02 10:18:29.77
(続き)
'レコードごとに処理
For i = 0 To UBound(recordC, 2)
For l = 0 To 3
If recordC(0, i) = Sstr(l) Then
If Scheck(l).Value = True Then
'条件を満たしたレコードを recordD へ順次格納
For j = 0 To 8
recordD(j, k) = recordC(j, i)
Next j
k = k + 1
(続きます)

102:99
11/10/02 10:20:31.50
(続き)
End If
End If
Next l
Next i
'リストボックスへ recordD のデータを表示
UserForm8.ListBox1.column() = recordD
End Sub

長々と申し訳ありません。
どなたかよろしくお願い致します。

103:99
11/10/02 10:23:51.40
すみません。これではわからないですね。宣言部分を一部追記します。
Dim Scheck(3) As Object
Set Scheck(0) = UserForm8.CheckBox1
Set Scheck(1) = UserForm8.CheckBox2
Set Scheck(2) = UserForm8.CheckBox3
Set Scheck(3) = UserForm8.CheckBox4

Dim Sstr(3) As String
Sstr(0) = "完了"
Sstr(1) = "報告可能"
Sstr(2) = "調査依頼中"
Sstr(3) = "調査中"

104:99
11/10/02 11:00:48.73
リストボックスのHeight値を250以下に設定したら、減らなくなりました。
それ以上、300とかに設定すると250ぐらいまで少しずつ減りだすようです。
できれば450ぐらいで使用したいのですが。
これはバグなのでしょうか…?

105:デフォルトの名無しさん
11/10/02 12:17:17.43
リストボックスの IntegralHeight がTrueになっていると、高さが自動調整されるので、
それをFalseにすればいいと思う。

Trueでも、設定するたびにどんどん短くなるのは、おかしな現象ですが、
フォントサイズによってなったりならなかったりします。

バグかもしれないし、最初からその程度の精度しかないのかもしれません。



106:99
11/10/02 13:02:56.05
>>105
リストボックスのプロパティは全部調べたつもりでしたが、ご指摘の項目はうっかり漏れていました。
IntegralHeightをFalse に設定した所、サイズが変わらなくなりました。
どういう条件でリストボックスのサイズが少しずつ短くなるのかは、msdnのページにも書かれてないっぽいですが、
とにかく明確な対処方法が分かってスッキリしました。
ありがとうございました!

107:デフォルトの名無しさん
11/10/04 07:42:22.19
例えばシート1の、1行目のどこかに"新宿"と書かれたセルがあれば、シート2の適当な場所
に"東京"と書き込むみたいなスクリプトを作りたいのですが、それでfindメソッドを
使うのかなとやってみたところ
sub hoge()

Set Obj = Worksheets("sheet1").Rows(1).Find("新宿")

   If Obj Is Nothing Then
msgbox "存在しない"

  else
 シート2の任意の場所に"東京"を貼り付け

  end if
end sub
こういう感じで一応出来るとはわかったんですが、マニュアルページで"find"は条件に合致
するものが見つかったときにtrue とか false を返すのではなく、そのセルの場所か
nothingという値を返すからこのやり方じゃないといけないと書いてあったんですが

できれば検索条件に合致するものが見つかったらtrueになって、IFとかselect caseに
そのまま直接(Worksheets~)を組み込んだりして何かの行程を実行するみたいな風に
したいんですが、そういうやり方できる方法って無いのでしょうか?

なぜしたいかというと、この例でいうと、1行目のセルの中に、新宿、中野、練馬・・・・
などの多種類の条件のうちから、合致するものがあったら、それにちなんだステートメントを
実行するみたいな作業をしたいのですが

この上の文を使って、何回も書けば、それでできないことはないかなと思うのですが
出来ればスマートに出来るようになりたいんですけど、何か方法、あるいは他の
メソッドなりを使って出来ないものでしょうか?

108:デフォルトの名無しさん
11/10/04 08:10:15.10
>>107
そういう時は自分で関数を作る。たとえば

Function FindB(SearchString As String) As Boolean
  Set obj = Worksheets("Sheet1").Rows(1).Find(SearchString)
  If obj Is Nothing Then
    FindB = False
  Else
    FindB = True
  End If
End Function

これなら

  If FindB("新宿") And FindB("渋谷") Then ~

みたいに使える

109:デフォルトの名無しさん
11/10/04 08:24:02.11
>>108
ありがとうございます。そんな風に書き換えるとでもいうような
方法があったんですね。勉強してみます。ありがとうございました。

110:デフォルトの名無しさん
11/10/04 11:14:51.67
自作のDLLを呼び出そうとしています。
複数ある関数の中で、1個だけ以下の様に関数名と()の間にスペースが自動で入ってしまうのですが、
これはどういう意味なのでしょうか?

Sub1(...)
Sub2 (...)
Sub3(...)

エクセルのVBAエディタです。



111:デフォルトの名無しさん
11/10/04 21:36:44.63
普通は入ります
入らないのがおかしい
var = Sub1()とかしてんじゃねえの?

112:デフォルトの名無しさん
11/10/05 08:24:03.92
変数内の文字列を抽出して別の変数に指定することは出来ますか?
たとえばaには"1234567890"が入っていて、その中から
bには"5678"を入れたいのですが。

113:デフォルトの名無しさん
11/10/05 09:33:14.10
文字列から抽出??一部を抜き取るの?
そりゃあ無理だから希望の文字列を変数に代入してください


114:デフォルトの名無しさん
11/10/05 09:44:33.78
>>111
普通は入らんのでは?
Callの有無で意味合いが変わってくるから気をつけてね

115:デフォルトの名無しさん
11/10/05 09:47:55.06
>>113
やはり、無理なんですか。
一度aをセルに入れてMID乃関数でbに入れないと無理ですかね?


116:デフォルトの名無しさん
11/10/05 09:52:43.61
コードレベルじゃなくて、何がやりたいの?
それを聞いた方が良いアドバイス出来そうだけど。

117:デフォルトの名無しさん
11/10/05 10:17:18.92
excel2007なんだけど、IE操作するのに必要なInternet Controlsに
参照設定しようと思ってVBEのツールから参照設定をしようとすると
Internet Controlsが見当たらないorz

URLリンク(www.dotup.org)
こういう場合どうすんの?


118:112
11/10/05 10:20:56.45
>>116
Sub 確認_Click()

Dim 転記元 As Worksheet
Dim a As String
Dim Obj As Object

If Worksheets("MAIN").Range("Q23").Value = 2 Then
Set 転記元 = Worksheets("オーダー①")   
   a = Worksheets("MAIN").TextBox1      ’①
Else
Set 転記元 = Worksheets("オーダー②")
   b = Worksheets("MAIN").TextBox1   
a = 'bの文字列の中の一部分を入れたい    ’ ②
End If

Set Obj = 転記元.Cells.Find(a)
If Obj Is Nothing Then
MsgBox "見つかりませんでした。"
Else

MsgBox "見つかりました。"
Obj.Select

End If
End Sub

119:デフォルトの名無しさん
11/10/05 10:25:01.11
>>116
解りにくいかもしれないですが↑の様な感じです。
①の時は変数aでそのまま検索出来るのですが、
②の時にTextBox1の中の文字列の一部分で検索しないといけないのです。

TextBox1はシート上のフォームです。
この場合はやはり、一度変数bをセルに代入してMIDで一部を抽出しaに
入れ直さないといけないのでしょうか?

120:117
11/10/05 10:33:30.63
自己解決

Microsoft Browser Helpersにチェックを入れるんだって
IEが動作したのはこれで確認


121:デフォルトの名無しさん
11/10/05 11:06:40.66
>>119

>>112の例だと
b = Mid(a, 5, 4)
じゃだめなの?

122:デフォルトの名無しさん
11/10/05 11:49:45.66
>119
VBAの関数使えばセルに代入しなくても可能
一部を抽出するための、一部の部分を判定するルールどうなってるんだ?

123:デフォルトの名無しさん
11/10/05 14:39:41.41
>>121,122
おっしゃる通り、関数と同じやり方で出来ました
まさかこんな簡単に出来るとは思いもよりませんでした
ありがとうございました


124:デフォルトの名無しさん
11/10/05 21:51:15.79
VBAってインターフェースも実装できるんだね。
初めて知った。

125: 忍法帖【Lv=13,xxxPT】  【東電】 【東電 70.3 %】
11/10/05 23:43:30.70
EXCELでマクロを組みたくてVBAの勉強したいんだけど、オススメの本とかある?

126:デフォルトの名無しさん
11/10/06 01:03:27.61
>>114
普通は入るだろ
どうして試しもしないで言ったの?

127:デフォルトの名無しさん
11/10/06 01:59:10.85
>>125
定番の回答だが、書籍に限らず解説の類は、本人の理解力や解説方法の好み
予備知識(VBAはもちろん、他の言語経験があるかとか)などでどれが良いかは変わってくるので
自分で書店に行って実際に読んでみて、自分の理解力や好み、レベルに合った物を探すのが一番

あと、ここみたいにその時その時で偶々スレ見てる人が回答する掲示板でオススメ聞くと、
質問した時スレに居た数人個々の独断と偏見で世間的にはあまりオススメとは言えないものを
奨められることも多いので、質問したときに偶々居合わせた人だけの意見ではなく
ネット書店のレビューや評価など、書籍に対する意見や評価のみが長きに渡り蓄積されたものを
見た方が参考になるよ

128:デフォルトの名無しさん
11/10/06 08:47:43.15
シート上のドロップダウンリストで選択した内容を
変数に収める事は出来ますか?
Dim a as String
a = ActiveSheet.ドロップ2.value
End sub
では無理でした。
変数に収めなくても、別のセル(B2)等に直接コピーでも
よいのですが。

129:デフォルトの名無しさん
11/10/06 11:11:16.44
>>128
ドロップダウンリストがセルA1にあった場合

変数 = Range("A1").Value

別セルにコピー

=A1

130:デフォルトの名無しさん
11/10/06 12:47:30.43
>>129
ドロップダウンリストはセルではなくてフォームなのです。
その場合はリンクさせているセルに表示される数字から
検索するしか方法はないのでしょうか?

131:デフォルトの名無しさん
11/10/06 14:15:39.09
>>130
シートに直接フォームコントロールを挿入したなら
Sheet1.Shapes("Drop Down 2").ControlFormat.Value
とか

フォームコントロールはShapeオブジェクトとして追加される
その時にNameがついてて、Shapesで指定してるのがその名前(この場合なら"Drop Down 2)なんだが
この名前を画面上で知る方法はよくわからん
これでエラーでるようなら、全Shapeの名前列挙してそれっぽいの探してくれ

132:デフォルトの名無しさん
11/10/06 14:51:53.79
>>131
試した見たのですが、ドロップダウンリストの入力範囲の
数字(順番?)が取得されて入力内容【リストの内容)は無理でした。
直接選択したリスト内容(解りにくくてすみません)を取得したいのですが

133:デフォルトの名無しさん
11/10/06 15:43:30.44
>>132
ValueじゃなくてTextってことか

134:デフォルトの名無しさん
11/10/06 15:55:31.13
>>132
コントロールへの参照は略すけど、
 .ControlFormat.List(.ControlFormat.ListIndex)
で、選択されているリスト項目の内容を取得できる。
ただし、非選択時(ListIndex=-1)時はリストが取れないので場合分けして処理すべし。

135:132
11/10/06 18:10:13.06
>>134
ありがとうございます
望んでいたものが出来ました!

136:デフォルトの名無しさん
11/10/06 22:49:31.10
エクセルがRC形式かどうかって分かりますか?

137:デフォルトの名無しさん
11/10/06 23:10:26.03
>>136
マクロの記録で
R1C1形式にすると

Application.ReferenceStyle = xlR1C1

って出てきて、それをヘルプで見たら

使用例


次の使用例は、現在設定されている参照形式を表示します。

Visual Basic for Applications
If Application.ReferenceStyle = xlR1C1 Then
MsgBox ("Microsoft Excel is using R1C1 references")
Else
MsgBox ("Microsoft Excel is using A1 references")
End If

って出てくる(Excel2007)

138:デフォルトの名無しさん
11/10/06 23:43:57.75
交換法のプログラムについて

Cells(1, 1) = 2
Cells(1, 2) = 5
Cells(1, 3) = 3
Cells(1, 4) = 1
Cells(1, 5) = 4

Sub 交換法()
For i = i To 4
Cells(1, i).Interior.Colors = RGB(255, 0, 0)
For j = i + 1 To 5
Cells(1, j).Interior.Colors = RGB(255, 255, 0)
Application.Wait (Now + TimeValue("00:00:01"))
If Cells(1, i) > Cells(1, j) Then
Cells(1, j).Interior.Colors = RGB(0, 255, 255)
a = Cells(1, j)
Cells(1, j) = Cells(1, i)
Cells(1, i) = a
End If
Cells(1, j).Interior.Colors = RGB(0, 255, 255)
Next j
Cells(1, i).Interior.Colors = RGB(0, 255, 255)
Next i
End Sub

エラー400が表示されるのはなぜでしょうか?
修正お願いします。

139:デフォルトの名無しさん
11/10/07 00:57:01.87
>>138
Sub 交換法()
  For i = 1 To 4
    Cells(1, i).Interior.Color = RGB(255, 0, 0)
    For j = i + 1 To 5
      Cells(1, j).Interior.Color = RGB(255, 255, 0)
      Application.Wait (Now + TimeValue("00:00:01"))
      If Cells(1, i) > Cells(1, j) Then
        Cells(1, j).Interior.Color = RGB(0, 255, 255)
        a = Cells(1, j)
        Cells(1, j) = Cells(1, i)
        Cells(1, i) = a
      End If
      Cells(1, j).Interior.Color = RGB(0, 255, 255)
    Next j
    Cells(1, i).Interior.Color = RGB(0, 255, 255)
  Next i
End Sub

140:デフォルトの名無しさん
11/10/07 18:16:41.05
>>126
試すとかじゃなくて普通じゃないの、君のは。

括弧の前にスペースが入るのは
戻り値を取得せず、Callも書かない場合。
これは普通じゃないぞ?
動き違うから勝手に省略しちゃだめだぞ?

141:デフォルトの名無しさん
11/10/07 23:23:54.88
>>140
>>110みてみろ
もろ「戻り値を取得せず、Callも書かない場合。」やってるだろ
だからこれやった場合普通はスペースが入るって言ってんだ


142:デフォルトの名無しさん
11/10/08 00:49:51.32
>>141
複数ある関数のうち1つだけって時点で>>110はバグとしか思ってない。
オレは「普通」について否定されたから根拠を示しただけなんだが。

143:デフォルトの名無しさん
11/10/08 02:15:17.26
>>140
Callの有無で意味が変わるって、どういう事?
Callは単なるサブルーチン呼び出しで、
記述上は省略可能で、その有無によらず
同じ意味だと理解していたのだけど、
違いがあるの?
今までずっと、Letみたいに無くても困らない
ものだと思ってた…


144:143
11/10/08 06:42:49.91
ゴメン、調べたらすぐ出た。
 URLリンク(www.gizcollabo.jp)
にもあるように、引数argが1個のサブルーチンAをCall省略で呼び出す時に()を付けると
サブルーチンコールの引数リストを示す意味の()ではなく、
第1引数を示す式中の演算子として()が評価され、Aには(arg)という式を評価した結果が渡される。
つまり、引数が右辺値を示すものになり意図によらず値渡しされる動作になる、という事ですね。

A (arg) '(arg)という式の演算結果を値渡し
A arg 'argそのものを引数として渡す(渡し方はAの定義次第)
Call A(arg) 'argそのものを引数として渡す(渡し方はAの定義次第)

断続的にVBを10年近く使ってたけど、たまたまこういうシーンに出くわさず、
知りませんでした…

145:デフォルトの名無しさん
11/10/08 07:43:09.99
>>144
いや、>>140もそうなんだけど、
この質問主が聞きたいのは
スペースが入る理由なんだよね。
だからそれに対する回答をしなちくゃいけない。

>>110に対する適切な回答:
引数を持つ関数を呼ぶ場合、関数名()のみ記述した場合はスペースが入る。
これはビジュアルベーシックエディターの仕様である。

これだけでオッケー。
動作が違うとかは質問に対する回答になっていない。

146:デフォルトの名無しさん
11/10/08 11:05:47.73
Round関数がVBAとワークシート関数で仕様が違うのとかも結構な落とし穴だよね

147:複乳
11/10/08 11:23:53.27
>>146
どう違うのだ?

148:デフォルトの名無しさん
11/10/08 11:49:15.17
これに対して VBA の Round 関数は "銀行型" の丸め処理を行います。
"銀行型" の丸め処理の場合は ".5" は、結果が偶数になるように丸め処理が行われ、
切り上げられることも、切り捨てられることもあります。

URLリンク(support.microsoft.com)


149:デフォルトの名無しさん
11/10/08 12:54:11.14
>>145
スペースが入る理由はそれでオッケーだとして
じゃあsub1と3はスペースが入らない理由は?って話になるんだが

とりあえず>>110はエクセルのバージョンとDeclareの部分を晒せ

昔なんか似たような現象を見た気がするんだが、
その時は非公開なエクセルで定義済みの名前とかぶってたの原因だったような

150:デフォルトの名無しさん
11/10/08 13:13:48.65
110もそんなに気にしてないんじゃない?

昔なんか似たような現象を見た気がするんだが、
その時はブック再作成で直ったような

151:デフォルトの名無しさん
11/10/08 13:48:59.53
>>149
だから>>111で聞いた
>>110からは返答ないけど

152:デフォルトの名無しさん
11/10/09 09:26:18.32
質問させてください。
WinXP、Excel2003です。

自作マクロのプロジェクトにパスワードを設定しました。
①次に設定ファイルを読み取り、
  自身に含まれるマクロを作成・入れ替えするマクロを組みました。
②さらに下記サイトを参考(丸写し)に、パスワードをマクロで入力するものを作りました。
URLリンク(home.att.ne.jp)

①②はそれぞれ単独では正常に働きます。
しかし、マクロ①の最初でマクロ②で呼び出したり、マクロ①中に②を組み込んでも正常に動かない。
正確には、ワークシート相手にパスワードを打ち込む
→マクロ①は動作しない(保護に関する実行エラーも出ない)という状態です。

別々に動かせばいいだけなのですが、マクロ②の後にVBEにアクセスできる状況が不安です。
①②を上手く連動させる方法はないでしょうか。
よろしくお願いします。

153:デフォルトの名無しさん
11/10/09 14:27:07.89
すいません、ちょっと意味が分からないです。
でも面白い事してますね~
自分も昔、同じように自身のコードを追加、変更し実行するというマクロを作りました。
その時は変更内容が開き直さないと反映されない事と、
2007以降のデフォルト設定ではVBEに対するアクセスが出来ない為諦めましたが。

154:デフォルトの名無しさん
11/10/09 15:00:16.65
読み直してみましたが、
2の呼び出しコードは動的に生成されますか?
であればコードがロードされていないのでは?

こういう回答はあまりしたくありませんが、やり方変えた方が良いかもしれません。
マクロ書き換えって結構問題があると思います。
まずファイルにゴミが貯まって行く事。
書き換え頻度が不明ですが、徐々にファイルサイズが増えて行くはずです。
次にバージョン管理(コード修正)がしにくい事。
自分用であればあまり問題となりませんが、エクセルブックはデータを含むのでバージョンアップが難しいです。
色んな人が使うとなるとお手上げです。
最後はセキュリティの話ですね。

自分だったら、パスワード保護が必要なコード(機能)はアドインに実装。
ブックの生成機能はそこに持たせますかね。

155:152
11/10/09 17:56:29.14
少し長くなりますが…。
「CSVファイルを計算シートに張り付けて、抽出されたデータを記録シートに張り付ける」
という作業を自動化させたものです。
私自身が独学であることに加え、他の人間は完全に素人です。
また、仕事で使うものですから最低限のセキュリティは設けたい為にロックしました。

しかし、このままでは私以外設定の変更ができない。
かつ、割と半端ない構造をしているのでコードが長大です。
なら設定変更すら自動化すればいい、という結論に。

アドイン案もあったのですが、とりあえず完成させた後に分離させるというのが一つ。
ファイルが2つ以上に分かれると、移動などで欠損しやすいかなというのが二つ目の理由です。
むろん勉強不足もありますが…。

156:152
11/10/09 18:02:52.72
Sub マクロ1()

Call ロック解除

Worksheets("Sheet1").Activate
Cells.ClearContents
With ThisWorkbook.VBProject.VBComponents("UserForm1").CodeModule

    .DeleteLines .ProcStartLine("分類マクロ", 0), .ProcCountLines("分類マクロ", 0)
    'マクロが重複するので削除  

    Call 書き出し_分類マクロ
    '文字列の切り貼りで、Sheet1に「Sub~EndSub」を書き出します。

    Worksheets("Sheet1").Activate
    最終行 = Range("A65535").End(xlUp).Row
        For i = 1 To 最終行
        .InsertLines 2, Cells(最終行 - i + 1, 1).Value
        '一行目は「Option Explicit」 2行目にお尻から挿入していきます。
        Next i

End With

'最後に上書きして閉じ、パスワード保護を復活させる。
End Sub


157:152
11/10/09 18:11:55.55
Public Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, _
  ByVal dwFlags As Long, ByVal dwExtraInfo As Long)

Private Sub ロック解除()

'パスワードは仮で「a」にしています。

Call sendkeybd_event(vbKeyMenu, vbKeyT)
Call sendkeybd_event(vbKeyM)
Call sendkeybd_event(vbKeyV)
Call sendkeybd_event(vbKeyMenu, vbKeyT)
Call sendkeybd_event(vbKeyE)
Call sendkeybd_event(vbKeyA)
Call sendkeybd_event(vbKeyReturn)
Call sendkeybd_event(vbKeyReturn)
Call sendkeybd_event(vbKeyMenu, vbKeyF4)
AppActivate "Microsoft Excel"

End Sub


Public Sub SendKeybd_event(arg1 As Integer, Optional arg2 As Variant)
'ここが完全に丸写しです。
'内容も完全に理解できていません。
       '書き込みが長大になるので、上記アドレスからコピーをお願いします。
End Sub


以上が該当部分のマクロです。
実際設定変更を掛ける部分は6カ所くらいあります。

158:154
11/10/09 18:58:59.05
ん~PGとしては、パスワード設定の部分は「無い」ですね。
ワークシート上のボタンで起動するマクロであれば、
For i = 0 to 30000
DoEvents
Next i
で処理開始を遅らせ、その間にVBEを前面に持ってくれば動きません?
これはキーボードをエミュレートしているだけですので。

仮に、メインの処理が長引き、
ユーザーが違うウィンドウを前面に設定してしまった場合、
そのせいでパスワードがメモ帳に貼り付いてしまったりという事が考えられます。
AppActivateに指定するのもアプリ名ではなくウィンドウタイトルだったような・・・

159:154
11/10/09 19:20:36.03
>.InsertLines 2, Cells(最終行 - i + 1, 1).Value
これは分類の定義をコード上に書いているのでしょうか?

>「CSVファイルを計算シートに張り付けて、抽出されたデータを記録シートに張り付ける」
抽出ロジックに、CSVという"データ"とは別に"分類"というメタデータが必要なので、
それをコード上に記録する為、コード自体を書き換えるようにした。
という感じでしょうか?

であれば別シートに定義するのが良いと思います。
パスワード解除も不要ですし。

160:デフォルトの名無しさん
11/10/09 20:40:38.02
シートの行番号を引数に持つSubを作り、そのSubに
「1列目の値がある数値以上であれば、引数で指定した行の背景色とフォントの色を変更する」
という内容を書いて、呼び出し元からFor文などで、任意の行の範囲に対して繰り返し呼び出しをする
処理をやっています。

現在のところ対象の行の数は50ほどで、このSubによる処理はすぐに終わるんですが、ページ設定や
印刷プレビューなどを実行した後では、この50回ほどのSubの処理が非常にもたつくようになり、
その間は、無限ループを行っているように画面がちらつきます。
同時に起動している他のシートであっても、印刷に関する処理を行った後には必ず発生するため、
少々困っています。何か対策のようなものはありますでしょうか?
ちなみに、このマクロで処理をしているシートは、印刷するものではありません。環境はExcel 2003です。
よろしくお願いします。

161:デフォルトの名無しさん
11/10/09 21:27:13.77
>>160
Application.ScreenUpdating=Falseってやってる?
呼び出し元って何?イベント?
Subの処理は常に50回しか実行されないの?確認した?
条件付書式で出来そうだけど出来ないの?

162:152
11/10/09 21:33:32.14
>AppActivate
ググってみると、「同一のタイトルが存在しない場合は、引数titleで指定された文字列で始まるタイトルを探します」とありました。
複数のエクセルを開く必要があれば、正確に指定する必要がありますね。
構造を変えることがあれば注意したいと思います。


>DoEvents
少し動作が変わりました。
別プログラムをアクティブにしていると、裏で保護に関する実行エラーが出るようになりました。
やはりVBEがうまくアクティブになってないのが原因な気がします。
入れる場所を変えて実験したいと思います。
後念のためAppActivateでVBEも呼び出すべきか。


>これは分類の定義をコード上に書いている
>抽出ロジックに、CSVという"データ"とは別に"分類"というメタデータが必要なので、
>それをコード上に記録する為、コード自体を書き換えるようにした。
たぶんその認識であっていると思います。説明不足ですいません。


初期のマクロは、「計算シート(IFCOUNT等)を2つ開いて、CSVを2つ開いてそれぞれ貼り付け、ペーストを20回以上する」
という手動操作の模範でした。
さらに3つめのCSVはその程度では分類不可。
こんな回りくどい方法よりも、VBAのメモリ上で直接処理したほうが早いと改良。
実際、時間短縮にも成功し、最後の手動作業も膨大な分岐を利用して強引に完成させました。

この頃になると、VBAが膨大になりコンパイルエラーの可能性が出てきたので、
一部をFunction化などで分離したものが1個前のヴァージョンです。
今回のマクロは、この部分の修正が目的です。
合わせて入力フォームを作成して、徹底的にエクセル操作からの隔離を目指しています。

長い&分かりにくくて申し訳ありません。

163:デフォルトの名無しさん
11/10/09 22:50:41.22
レスありがとうございます。
Application.ScreenUpdatingについては存じませんでした。処理の前後に切り替えを挟んで
みて、試してみます。
呼び出し元はイベントです。
Subの呼び出しの増減はありうるんですが、たとえば10回程度の呼び出しであっても、
前述のページ設定などの実行がなされた後だと、エクセルを再起動しない限り完了までに
数秒はかかっていました。
Subでは、その他の処理もやっていましたが、問題の箇所を条件付書式で解決できるようで
あれば、分離させようと思います。
「その他の処理」が原因でないことは確認しています。

164:163
11/10/09 22:51:32.10
>>163>>161あてです。すいません。

165:154
11/10/09 23:40:58.60
>>162
ごめんなさい、やっぱり分からないです。

その方法で突き進むんだったら、
sendkeybd_eventを完璧なまでに制御するしかないですね。
パスワード入力時、VBEが開かれるんですよね?
であれば、ツールウィンドウが開かれているかとか、
最前面ウィンドウが何かとか、
いろいろチェックかけないと安定動作は難しいように思います。
あとはウィンドウハンドル指定でsendkeybd_eventを実行するとか。
あと、最悪ESCで止まるようにしておかないと、こういったアプリは何をするかわからないです。

166:152
11/10/10 00:14:27.17
>>165

>こういったアプリは何をするかわからないです
そう思って直前にバックアップしておかないと、作動しないように保険を掛けています。

色々回答ありがとうございます。
もう少し自分で弄繰り回して、それでもダメでしたら類似マクロの可能性にかけたいと思います。
最後はパスワード廃止か、自分で手動変更するか…。

167:デフォルトの名無しさん
11/10/10 11:38:55.06
配列(100,100)の
配列(1,0)から配列(10,0)を範囲指定して
一括して値を入れることは可能なのでしょうか?
それとも1個ずつ指定するしかないのでしょうか?

168:デフォルトの名無しさん
11/10/10 12:56:40.19
>>167
URLリンク(officetanaka.net)

こういう事か?値はいいけどセルのプロパティとかは無理

169:デフォルトの名無しさん
11/10/10 16:02:47.04
値でも無理だろ
>>167は               という配列の中の               の範囲だけを指定して
      ┌─┬─┬─┬─┬─┐          ┌─┬─┬─┬─┬─┐値を入れたいってことだろうから
      │  │  │  │  │  │          │  │  │  │  │  │
      ├─┼─┼─┼─┼─┤          ┏━┓─┼─┼─┼─┤
      │  │  │  │  │  │          ┃  ┃  │  │  │  │
      ├─┼─┼─┼─┼─┤          ┣━┫─┼─┼─┼─┤
      │  │  │  │  │  │          ┃  ┃  │  │  │  │
      ├─┼─┼─┼─┼─┤          ┣━┫─┼─┼─┼─┤
      │  │  │  │  │  │          ┃  ┃  │  │  │  │
      ├─┼─┼─┼─┼─┤          ┗━┛─┼─┼─┼─┤
      │  │  │  │  │  │          │  │  │  │  │  │
      └─┴─┴─┴─┴─┘          └─┴─┴─┴─┴─┘
でもさ、無ければ作れば良いのがプログラム
そもそも一括した処理なんてのは、元を辿れば1個ずつの処理を関数化してるだけで
その関数の中身がコンパイル済みのライブラリの中に隠れて見えないか、
自分で作った関数故に見えるかの違いでしかない

Split関数なんかも、分割した文字列を配列に一括して入れてるように見えて
その実、Split関数の中では、1個ずつ指定して入れてるだけだからな

因みに、具体的に何がしたいのか書いてないから有効かどうかは解らないが
この手のことでは、二次元配列ではなく、配列の配列や、配列のコレクションが便利な場合もある
つまり、「配列(100, 100)」ではなく「配列(100)(100)」ってわけだ

配列(0, 0) 配列(0, 1)
配列(1, 0) 配列(1, 1)

配列(0)(0) 配列(0)(1)
配列(1)(0) 配列(1)(1)

170:デフォルトの名無しさん
11/10/10 17:23:43.76
>>169
あーそういう事か
そりゃ配列のレンジ指定して0フィルとかnullで埋めるとかでもしないとね
ジャグとか面倒そう

つーか図に感動したw

171:デフォルトの名無しさん
11/10/10 18:14:32.53
>>25
レジストリに書けばいけんじゃね?

172:デフォルトの名無しさん
11/10/10 18:37:20.11
>>167-170
Office TANAKA にはこんなやり方も書いてある
URLリンク(officetanaka.net)

173:デフォルトの名無しさん
11/10/10 19:03:35.08
>>172
それは知ってるけど、全く関係ない話じゃん

174:172
11/10/10 19:19:00.20
え?
これでできるんじゃないの?


175:デフォルトの名無しさん
11/10/10 19:24:15.71
「配列→セル」、コード的には「セル=配列」なら>>172すら必要ない
「セル→配列」、コード的には「配列=セル」だと>>172は役に立たない

んで今回は後者

176:167
11/10/10 22:19:00.50
すいません
出かけてる間に色々と申し訳ないです

まさに>>169のようなことだったのですが
やはり標準機能では無理なのですね

図に感動しましたし
貴重な意見もいただけ勉強になりました
ありがとうございます

177:デフォルトの名無しさん
11/10/11 09:51:36.18
L = Range("A1").Value
Cells(5, 5).FormulaR1C1 = "=SUM(R20C" & L & ":R20C1)"

Dim L As Integer を入れなくても動いたのですが、これはこれで大丈夫なんですか?

178:デフォルトの名無しさん
11/10/11 10:24:45.09
Option Explicit
入れてないんでしょ

今はそれでよくてもいずれ痛い目にあうよ

179:デフォルトの名無しさん
11/10/11 10:26:05.03
>>177
Variant型になるだけで今はおかしくないけど、
凡ミス時にちゃんとエラー吐かせたいなら、
なるべくOption Explicit設定しといた方が良いと思う。


180:152
11/10/12 00:49:55.27
>>165

「DoEvents」の入れる場所とループ回数を施行実験した結果、
パスの一時解除とVBEの操作ができるようになりました。

お陰様でマクロを完成できそうです。
改めてお礼を言わせてください。
駄文にお付き合いくださって本当にありがとうございました。
頑張ります!

181:デフォルトの名無しさん
11/10/12 11:23:46.66
おめでとう
あとは完成したとき、バグはありませんとか言わないように

182:デフォルトの名無しさん
11/10/14 07:18:13.37
素朴な質問なんですけど、
if とかの制御文で、判定要素を Or とかでつなぐときに、
Or の数が数十個とか百個とかの量に増やしても判定要素を大多数にしても問題は無いんでしょうか?

183:デフォルトの名無しさん
11/10/14 07:33:07.23
Orも単なる演算子。+で沢山繋ぐのと何ら変わりは無い。
ただ、それだけ増やすなら全部の式を本当に評価する必要があるか、
再検討はしたほうがいいとは思うけど。
VBAにはOrElseが無いからなあ。

184:デフォルトの名無しさん
11/10/14 07:41:26.00
ありがとうございます。実際には5個未満ぐらいにはなりそうな作業なんですが
気になったもので。

OCRソフト表のある文書をPDFからエクセルに転写したもので、OCRソフトで文字の誤読が割りと発生するので
その誤読による文字化けのようなものを正しい情報に戻すという作業の際にorで文字化けの種類分を
対応するという作業でした。

185:デフォルトの名無しさん
11/10/14 11:51:42.25
ExcelVBEで行番号を表示する方法ってありません?(Excel2007)

今は行番号を知りたいとき、エディタにコピペで持ってって、エディタの機能で行番号を表示させてんですけど。


186:デフォルトの名無しさん
11/10/14 13:48:35.20
>>185
無理
エディタにコピペするしかない

187:デフォルトの名無しさん
11/10/14 14:47:54.63
>>185
メニューの下に表示されてない?

188:デフォルトの名無しさん
11/10/14 15:29:47.14
VBAで行番号振れよ

189:デフォルトの名無しさん
11/10/14 15:46:43.29
>>186
だろうかな、、、、とは思ったんですが

>>187
まぁそれを見れば良いんでしょうけど、他のエディタみたいにパッと見て判るようにできれば、、、と
思ったんですがw



190:デフォルトの名無しさん
11/10/14 21:12:16.25
ところで行番号が必要になるってのはどういう状況なんだろう。


191:デフォルトの名無しさん
11/10/14 21:23:19.88
err.LineNumber
から特定したいんだろ

192:デフォルトの名無しさん
11/10/14 23:32:25.94
プログラム生産量を行数で報告させられる。

193:デフォルトの名無しさん
11/10/15 01:03:07.29
エクセル2003 XPです。

ファイルからデータ読み込んで、セルに書かずに
記憶してグラフにするにはどうすればいいですか?

194:デフォルトの名無しさん
11/10/15 01:53:25.82
セルに書かずにグラフにする

それは出来なくはないけどExcelの仕事じゃない
故にスレ違い

195:デフォルトの名無しさん
11/10/15 02:02:19.32
なぜに?


196:デフォルトの名無しさん
11/10/15 04:22:04.80
良く知らないんだけど、グラフのデータソースって、
セル範囲以外も指定出来るもんなの?

197:デフォルトの名無しさん
11/10/15 07:51:59.24
非表示シートに書き込んでおけば良いじゃない

198:デフォルトの名無しさん
11/10/15 08:28:17.58
>>193
できない…と思ってたけど
X・Yの数値を配列に入れてグラフのオブジェクトに
セットする方法があるみたいね。

chart.seriescollection.newseriesでググって
一番上に出てきたサイトの中の
5 数値を直接コードからに指定してグラフを作成するには?
にそのサンプルコードがある。

199:196
11/10/15 09:23:43.85
>>198
をを、感謝!
193じゃないけど、家に帰ったら早速ためしてみる。

200:193
11/10/15 10:52:17.41
ありがとう
必ず、グラフ用にデータが並んでるとは限らないから
配列からグラフにできたら、規則性はあるけどグラフ用に
並んでいない場合とかにも応用できるので、もし出来るのら
知りたかった。

201:デフォルトの名無しさん
11/10/15 15:27:00.72
EXCEL2007ですが以下を実行すると、”ABC"はmytxt(1)の中のmytxt(1,1)に入ります。
mytxt(1,1)に”ABC"が入るようにするにはどうしたらいいでしょうか?

Public Function test_a()
Dim mytxt As Variant
mytxt = test_b(1, 10)
Debug.Print UBound(mytxt, 1) & ":" & UBound(mytxt, 2)
End Function
Public Function test_b(y, x)
Dim mytemp As Variant
ReDim mytemp(y, x)
mytemp(1, 1) = "ABC"
test_b = mytemp
End Function


202:デフォルトの名無しさん
11/10/15 16:02:50.70
>>201
Debug.Printでmytxt(1, 1)を表示させればわかるけど、mytxt(1, 1)は"ABC"が入ってるぞ

>mytxt(1)の中のmytxt(1,1)に入ります
どういう状態が希望でどういう状態になってるって言いたいんだ?

203:201
11/10/15 16:19:21.24
>>202

debug.print mytxt(1,1) とするとエラーになり、
調べてみたらなぜかmytxt(1)(1,1)に"ABC"が入ってました。

コードの書き方が悪いのかと質問してみたのですが、
EXCEL起動し直してやってみたら希望の動作になってました。

原因は不明ですが、このコードに問題はなさそうですね。
ありがとうございました!

204:デフォルトの名無しさん
11/10/15 20:48:15.04
積極的にバリアント使うのが問題かな

205:デフォルトの名無しさん
11/10/15 21:10:01.20
そのコードそのままでその結果になるわけはないから
違うコード書いてたんだろ。さもなくばVBAが誤動作してるってことになる

どうせmytxtを配列で宣言したとかそんなオチだろ

206:デフォルトの名無しさん
11/10/16 05:07:34.87
●を含む文字列を検索して削除、さらにこの動作を●を含む文字列がなくなるまで繰り返すvbaを作ってます。
以下のプログラムだと実行エラー424となってしまいますが、解決方法は無いでしょうか?どなたか教えてください。

Dim x As Range
Set x = Sheets("test").Cells.Find("●", After:=Range("A1"))

If Not x Is Nothing Then
Do While Not x Is Nothing
x.Delete
Loop
End If

207:デフォルトの名無しさん
11/10/16 07:54:45.29
VBAに関数オブジェクトなんて無いぞ。
Deleteした時点でxが無効な状態になってそれっきりじゃん。

208:デフォルトの名無しさん
11/10/16 07:58:32.85
>>206
まず制御が分かってないな
[F8]キーでステップ実行してみるといいよ

分からないメソッドはヘルプ参照するなり
ググるなりして

209:デフォルトの名無しさん
11/10/16 10:02:01.15
Dim x As Range
Set x = Sheets("test").Cells.Find("●", After:=Range("A1"))

If Not x Is Nothing Then
Do While Not x Is Nothing
x.Delete
Set x = Sheets("test").Cells.Find("●", After:=Range("A1"))
Loop
End If

こうだな

210:デフォルトの名無しさん
11/10/16 14:56:45.02
>>209
何も解ってない初心者を騙すのは良くないぜ

211:デフォルトの名無しさん
11/10/16 18:32:08.05
>>206
Sub 全部消せ()
  Dim x As Range
  Do
    Set x = Sheets("test").Cells.Find("●")
    If Not x Is Nothing Then x.Clear
  Loop Until x Is Nothing
End Sub

212:デフォルトの名無しさん
11/10/17 06:01:38.76
こいつも制御が分かってないな

>   Do
>     Set x = Sheets("test").Cells.Find("●")
>     If Not x Is Nothing Then x.Clear
>   Loop Until x Is Nothing
制御以前に不適切なコードではあるが、このやり方で行くなら普通は

  Do
    Set x = Sheets("test").Cells.Find("●")
    If x Is Nothing Then Exit Do
    x.Clear
  Loop
という制御にするよな。なんかDo...Loopには、WhileかUntilで条件書かないと気が済まない初心者大杉。
こいつは、「x Is Nothing」を2回連続で判定することにバカらしさ、正確には冗長性を感じないのかねぇ?

それと、なんで皆FindNext使わないの?質問者はまだしも、2人出てきた回答者まで揃って…
極狭い範囲では大差ないけど、広い範囲で何度も検索繰り返すと、FindとFindNextでは10倍以上の差がでることもあるのに。

まあ正確に言えば、FindとFindNextの差じゃなくて、オプション引数Afterを適切に指定して、前検索結果位置以降から
検索再開させるか否かの差だが、これをやるためにはループに入る前に、最初の検索結果をxに代入しておく必要があり
それやるならループの前と中両方Findにするより、前はFind、中はFindNextにした方がいい。

これやると、ループの前にもFind処理が入り、コード記述量自体は多くなるが、処理の冗長性、処理の内容的には少なくなる。
プログラムに置いては、自分だけが使う「使い捨てマクロ」でない限り、コードの表面的な記述量を減らすより、冗長な処理を無くして
処理量を減らすのが基本だよ。「x Is Nothing」の連続判定も、After無し、あるいは>>209みたいな固定値のAfterでのFind繰り返しも、
冗長極まりない。初心者はコード量が少ないのが優れたプログラム、コード量が少なければ処理量も少なくなると勘違いしてそうだが、
そういう認識でコード書いてたら、いつまで経っても成長できないよ。

更に言うなら「『文字列』を検索して『削除』」なので、ClearではなくClearContentsが正解。

213:デフォルトの名無しさん
11/10/17 06:58:50.28
いるよなあ。
コードを見ると反射的に最適化しまくる香具師ってw
>>206の質問の意図も、元のコードをできるだけ残して
最小限の変更で動くようにしてあげた>>211の配慮も
まるでわかってないんだろう。

プログラムばっかりやっていて対人関係を疎かにしていると
こういう空気を読めないコミュ障になるから気をつけよう。

214:デフォルトの名無しさん
11/10/17 20:19:29.71
同じようなコードは俺も考えたけど、
Do-Loopの両方に抜け出し条件を付けないのも、
それはそれで嫌な感じなんだよなあ。
あと、質問者のコードはClearじゃなくてDeleteだから。

215:デフォルトの名無しさん
11/10/17 20:28:23.92
わかっててDeleteを使ってんならいいけど、なんとなくわかってない気がするんだよなあ>質問者
元ソースの書き方だと詰める方向を明示しても良さそうなのに書いてないし

216:デフォルトの名無しさん
11/10/17 20:54:56.39
いるよなぁ
>>213みたいに上から目線で得意げになっちゃう子。

プログラムばっかりやっていて対人関係を疎かにしていると
こういう空気を読めないコミュ障になるから気をつけよう。

217:デフォルトの名無しさん
11/10/18 00:55:59.46
ちょいと聞きたい。
料理のレシピなんかを管理したいときって、ExcelでVBA使うのとACCESS使うのどっちがいいんだろうか。
(料理名で検索したり、逆に使用している材料で検索したりしたい)

218:デフォルトの名無しさん
11/10/18 01:08:39.49
Access

219:デフォルトの名無しさん
11/10/18 01:37:32.04
>>218
サンクス!やっぱアクセスか。
値段が高いからExcelで済ませたかったんだが仕方ない。

ついでに聞きたいんだが、VBAの用途ってどんなものがある?
やっぱ計算メイン?DBと接続とか出来た気もしたんだが。

220:デフォルトの名無しさん
11/10/18 01:44:02.45
>>217
とりあえずExcel

テーブル設計ができているのならAccessだろうが
料理のレシピって、どんなテーブルを使うのか見当がつかない


221:デフォルトの名無しさん
11/10/18 01:52:45.70
>>220
検索重視ならAccessだな
材料とかジャンルとか調理方法とか、テーブルの作り方次第でどうにでもどきる

222:デフォルトの名無しさん
11/10/18 01:53:25.19
まぁ対人関係のよいっていうか人格者にはキレのあるコードを書けるやつが少ないのは確かだ。

223:デフォルトの名無しさん
11/10/18 02:38:17.16
>>212はClearContentsでよければ
Set x =範囲.Find(********)
Do Until x Is Nothing
  x.ClearContents
  Set x =範囲.FindNext(x)
Loop
ってなるって教えりゃいいのに...。
あと書式が設定されてなきゃClearでも問題ないからな。
その方が早いし。 

224:デフォルトの名無しさん
11/10/18 02:40:37.27
あとDeleteならFindNextはちょっと面倒になりそうだな。

225:デフォルトの名無しさん
11/10/18 02:42:20.44
そもそも>>223みたいなのはReplaceメソッドを使うべきだな。

226:デフォルトの名無しさん
11/10/18 02:50:09.29
コードだけ書いたんじゃ、知識のない奴には、どの回答が一番良いのか
どのコードにどういう問題があるのか解らなくて混乱する
奴の書き方は確かに諄いけど、間違ったこと書いてないし
他の回答者から見たらカチンとくるかもだけど、質問者から見たらむしろ
ありがたいだろうな

227:デフォルトの名無しさん
11/10/18 02:53:47.59
>>226
>>212>>223>>225まで気づいてたのかねぇ。
まぁFindメソッドのヘルプの添削だから知ってるかも知らんが。

228:デフォルトの名無しさん
11/10/18 03:04:41.25
ちなみにDo Loopの制御構造をよく理解できてない人は下のように書きがちだ。
Set x =範囲.Find(********)
If Not x Is Nothing Then
  Do
    x.ClearContents
    Set x =範囲.FindNext(x)
  Loop Unitil x Is Nothing
End If

229:デフォルトの名無しさん
11/10/18 03:05:14.60
Sub あああ()

Dim a As Variant
Dim b As Variant
Dim c As Variant
Dim d As Variant
Dim e As Variant

a = 2

Do While Cells(a, 1).Value <> ""

If Cells(a, 3) = Cells(a - 1, 3) And Cells(a, 2) >= 15 Then

Cells(a - 1, 5) = b

End If

c = WorksheetFunction.SumIf(ActiveSheet.Range("f2:f288215"), "b = 1 ")

d = WorksheetFunction.CountIf(ActiveSheet.Range("e2:e288215"), "b > 0")

a = a + 1
Loop

e = c / d

Cells(8, 8) = e

End Sub

230:229
11/10/18 03:10:11.71
>>229

● 「C列のアクティヴセルとその1こ上が同じ名前」かつ「B列」が15以上の時、

1・E列がセルない「1」の数

2・ 1の時、F列の数値の合計

3・  「1/2」を算出したい

● オーバーフローになる

● エクセルの反応がなくなる

んですがどうすればいいでしょうか?

231:196
11/10/18 08:27:09.75
>>230
きれいな日本語で書き直して。

232:デフォルトの名無しさん
11/10/18 09:14:55.40
>>219
>値段が高いからExcelで済ませたかったんだが仕方ない。


RDBにするならMySQLやPostgreSQLでもいいやん
自分で使うぶんには無料だし

233:デフォルトの名無しさん
11/10/18 10:26:15.56
無料のSQLserverでもええやん

234:デフォルトの名無しさん
11/10/18 10:32:08.13
>>230
変数bの内容が最初から最後までずっと0のまま
まずはそこを直せ

235:229
11/10/18 12:43:14.94
>>234
やり方がわかりません・・・

確かにF列の該当セルが空欄になっちゃいます・・

236:229
11/10/18 13:32:57.52
書き直しました

Sub あああ()

Dim a As Long
Dim b As Long
Dim c As Long
Dim d As Long
Dim e As Long

a = 2
Do While Cells(a, 1).Value <> ""

If Cells(a, 3) = Cells(a - 1, 3) And Cells(a, 2) >= 15 Then

b=Cells(a - 1, 5)

c = WorksheetFunction.SumIf(ActiveSheet.Range("f2:f200"), "b = 1 ")

d = WorksheetFunction.CountIf(ActiveSheet.Range("e2:e200"), "b > 0")

End If

a = a + 1

Loop

e = c / d

Cells(8, 8) = e

End Sub

237:229
11/10/18 13:33:34.74
>>236を実行すると「オーバーフローしました」というエラーが出てしまいます

238:デフォルトの名無しさん
11/10/18 13:50:54.13
>>237
レス直前に、変数bとRANGE修正してたか。

とりあえず、「SumIf」「CountIf」の使い方も間違ってる気がする。
変数c,dがゼロになるから、変数eの計算をゼロで除算してる。

239:229
11/10/18 14:11:01.15
>>238
>変数c,dがゼロになるから、変数eの計算をゼロで除算してる。
問題点がわかりました。
ありがとうございます

240:これでなぜ、エラー1004ですか
11/10/18 15:04:40.77
Sub 入力ボタン_Click()
Worksheets("転載部分").Activate

Dim e As String
Dim f As String
Dim g As String
Dim h As Integer

Dim nexter As Long

' 改行の動作が、これ。

nexter = ActiveSheet.Cells(3, 1).End(xlDown).Row

e = 有利な特徴.Value
f = 分野.Value
g = レベル.Value
h = ポイント.Value
Worksheets("転載部分").Cells(nexter + 1, 1).Value = e

途中まで、転載しました。この最後の行で、止まります。もう、謎です。たすけて。

241:デフォルトの名無しさん
11/10/18 15:16:29.11
>>240
エラーが出た時、変数nexterがいくつになってるか確認

242:これでなぜ、エラー1004ですか
11/10/18 16:07:44.33
65536になってます。本当はこれ、3のはずなんです。

243:これでなぜ、エラー1004ですか
11/10/18 16:10:28.52
4行目が空白セルで、この空白セルの一つ上のセルを自動的に見つけてくれるはずなんです。

244:これでなぜ、エラー1004ですか
11/10/18 16:13:51.14
nexter = ActiveSheet.Cells(2, 1).End(xlDown).Row

にしたら、下の行へ下の行へと行かず、4行目のセルばかりをセレクトするようになります。
後半部を下にペーストします。

Cells(nexter + 1, 2).Value = f
Cells(nexter + 1, 3).Value = g
Cells(nexter + 1, 4).Value = h
Range(Cells(nexter + 1, 1), Cells(nexter + 1, 4)).Select
(罫線のところ中略)
ActiveCell.Offset(1, 0).Select

End Sub

245:デフォルトの名無しさん
11/10/18 16:27:24.33
A列の最終行

246:これでなぜ、エラー1004ですか
11/10/18 16:27:58.40
自己解決しました。

いったん、セル改行をされなくなるようにしてから動作させて、
再び元に戻したら、アプリケーションやオブジェクトの問題が起きなくなりました。

謎は残ります。自己解決とはいえ、なぜこうなるのかご存知でしょうか。

247:これでなぜ、エラー1004ですか
11/10/18 16:42:31.46
また、問題がぶり返しました。コンボ・ボックスを追加したら、先程の手順でも効果がなくなりました。

248:これでなぜ、エラー1004ですか
11/10/18 16:45:33.72
とりあえず、初期状態の文字入り(.value有り)のセルを2行の厚さにしました。これも、応急処置です。

249:これでなぜ、エラー1004ですか
11/10/18 16:55:39.81
スポーツ界も格闘界も芸能界もIT業界もヤクザが幅を利かせてると
聴きましたが、興業はともかく、なんでITもなんでしょうか。

250:952
11/10/18 20:05:28.96
関数にdll使うのって、vbaのみで作った場合と比較して
計算速度としては優位になるのでしょうか。
目くそ鼻くそ?

251:デフォルトの名無しさん
11/10/18 20:24:07.43
>>248
>初期状態の文字入り(.value有り)のセルを2行の厚さ
nexter = ActiveSheet.Cells(2, 1).End(xlDown).Row
では これが最善策じゃないかな

今回の場合、このコードだと
Cells(2, 1)を含めて2行以上の連続した文字入りセルがないと .End(xlDown)は希望する
セル位置にはならないよ
とりあえず
.End(xlDown) は CTRL+↓ と基本同じ動作なので手動でテストしてみる事をお勧めするよ

んで自分なら
nexter = ActiveSheet.Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Row
とするかな

252:デフォルトの名無しさん
11/10/18 20:28:56.25
>>250
作って比較すりゃ分かるじゃん。
俺のはdllの方が速いよ。


253:デフォルトの名無しさん
11/10/18 20:34:34.30
>>249
人身売買は893の専売特許

254:デフォルトの名無しさん
11/10/18 23:16:59.36
速度をやたら気にする人間はこれでテストすれば良い。

'ミリ秒単位での時間の計測
Declare Function GetTickCount Lib "kernel32.dll" () As Long

Sub うんたらかんたら()
Dim startTime As Long
Dim endTime As Long

'処理の先頭で現在時刻を取得
startTime = GetTickCount

'何らかの処理

'処理の末尾で現在時刻を取得し、その差分を調べる
endTime = GetTickCount
MsgBox "経過時間は " & Format(endTime - startTime, "#,##0") & "[ミリ秒]"

End Sub


255:デフォルトの名無しさん
11/10/19 01:01:18.89
ご冗談を…

256:デフォルトの名無しさん
11/10/19 03:05:26.89
常識的に考えれば、DLLで行う処理が(呼び出しのオーバーヘッドも含めて)VBAで行う処理より早ければDLLが早いし
そうじゃないならVBAの方が早いって結果になるんだが
そこに有利も不利もないだろ

257:デフォルトの名無しさん
11/10/19 09:09:30.57
そういえばVBAにもコンパイルってあったよな
それも比較してみたら?


258:デフォルトの名無しさん
11/10/19 11:11:51.04
>>251
>んで自分なら
>nexter = ActiveSheet.Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Row
>とするかな

nexter = ActiveSheet.Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Row

nexter = Cells(Rows.Count, 1).End(xlUp).Row
の違いって何なのでしょうか
同じだったら短いほうが読み易い気もするんですが。

259:デフォルトの名無しさん
11/10/19 13:46:08.73
>>258
コードが標準モジュールにあるなら一緒 好きな方にすればいい
コードがシートモジュールにあった場合
nexter = Cells(Rows.Count, 1).End(xlUp).Row
の処理対象シートは シートモジュールのシートになる(ActiveSheetではない)

260:デフォルトの名無しさん
11/10/19 23:29:39.97
行番号を求めてるうちはSelectするレベルと大差ない。
下くらい書けるようになってやっと脱初心者。
書けてもけっして上級者ではない。
Dim nexter As Range
Set nexter = Range("A" & Rows.Count).End(xlUp).Offset(1)
nexter.Offset(, 1).Resize(, 3).Value = Array(f, g, h)
nexter.Resize(, 4).Select
'(罫線のところ中略)
nexter.Select

261:デフォルトの名無しさん
11/10/19 23:33:55.17
なるほど、そういう違いがあったのですか。
教えてくださってありがとうございます。
標準モジュールしか使ったことがないので分かりませんでした。

もう一個、まったく別件の質問なのですが
FileSystemObjectってあるじゃないですか。
あれって皆さんどんな風に使ってるのでしょうか。
私はパブリック変数で FSO as Object を宣言して
最初のプロシージャで
Set FSO = CreateObject("Scripting.FileSystemObject")
ってやってますが、
パブリック変数はあまり使わないほうが良いらしいので、
他にもっと良いやり方があるなら教えてほしいです。

(参照設定でMicrosoft Scripting Runtimeにチェックを入れるやり方は
別PCで実行するときに面倒なのであまり良いやり方とは思えません。)

262:デフォルトの名無しさん
11/10/19 23:40:28.38
>>261
グローバル変数を使わない方法だと、別の手続きを呼び出すときには、いちいちオブジェクトもパラメータとして渡すってのが
まあ、正当と言えば正当かな

Call File_Sub_1(FSO, Data1, Data2)

みたいに

263:デフォルトの名無しさん
11/10/20 01:38:14.59
パブリックな変数はあまり使わない方がいいってのは、変数の有効範囲は狭い方が良いというのが基本的な考え方
FSOで考えれば、ほんとにFSO(のインスタンス)を使いまわす必要があるのか考えた方がいい
あとパブリックかどうかと、参照設定するかCreateObjectするかは別の話なんだが解ってるのか?

264:デフォルトの名無しさん
11/10/20 02:11:51.13
>>262
>>263
インスタンスを使いまわすとかそういう事は考えてなくて
単純に宣言とか一回で済むほうが楽だというか、
グローバル変数使うと引数で渡さずに済むんで楽でいいな、
という程度の認識しかないです。
参照設定についてはとにかくマクロのコードの中以外で完結してない事が
やっぱり面倒だという認識で敬遠してます。
CreateObjectと参照設定の件についてはあんまり意味が分かってないです。
参照設定にするとオートコレクトが使えるんでしたっけ?
という程度です。


265:デフォルトの名無しさん
11/10/20 19:33:18.65
>>264
自分は未熟だし、いつどのようなプログラム例を見つけるか不明なので、
最初はPublicで書き連ねていく。
マクロを作りながら、そこにコメント付けて分類したりして纏めていく。
完成と言えるものができたら、
データ型の見直しとか、適切な場所への移動を行う。
まぁ、趣味でやっててヘルプファイルとグーグル先生が教師だからこんなもんだ。

266:VBA初心者
11/10/20 20:28:33.52
ファイルのカスタムプロパティにDSO
support.microsoft.com/kb/224351/ja
を利用して、値を書き込もうとしています。
下のソースで、対象ファイルがExcelやWordなら書き込めるのですが、
SolidWorksというCADのファイルだと書き込まれません。
(OnErrorでも反応なし。ちなみにASCIIコードや半角カタカナ,全角文字は
1文字は書き込めます。)
やはり、SolidWorkerの販売元に聞かないといけないでしょうか?

Set objDSO = CreateObject("DSOFile.OleDocumentProperties")
objDSO.Open ファイル名
objDSO.CustomProperties.Add "項目1"
Set objProperty = objDSO.CustomProperties.Item("項目1")
objProperty.Value = "あい"
objDSO.Save
objDSO.Close
Set objDSO = Nothing

どなたか、わかる方いましたらご教授お願いします。


267:デフォルトの名無しさん
11/10/21 09:27:50.30
グローバル変数あるとデバッグとメンテが大変なんだよね。
使用箇所は検索出来てもそれがどんな順番で実行されるか分からないし。
メソッドが変数について状態を前提としているかも分からないし。
逆に、一度初期化した後は読み取り専用って使い方はアリだと思う。

268:デフォルトの名無しさん
11/10/21 11:21:40.33
土素人ですいません。文系の学生で、できなくて困ってます。
VBAでCLEAN関数を使って、列一行改行を全部取りたいです。

SUB HOGE 

なんたら CLEAN ("A:A")

END SUB

みたいにできるでしょうか?縦一列の、改行を全部削除できたらいいです。



269:デフォルトの名無しさん
11/10/21 11:55:45.10
>>268
Clean関数は文字列しか処理できない(Rangeは受け付けない)ので、
自分で繰り返すように作る

For r = 1 To ActiveSheet.UsedRange.Row
Cells(r, 1) = Application.WorksheetFunction.Clean(Cells(r, 1))
Next

270:デフォルトの名無しさん
11/10/21 12:31:44.69
>>268-269
たとえば
With Range("A1",Range("A"&Rows.Count).End(xlUp))
  .Value=Application.Clean(.Cells)
End With
実際は文字列は一旦消してから書き出すのが鉄則なので、Variant型変数に取得して
範囲を消してから書き出す。

271:デフォルトの名無しさん
11/10/21 12:39:12.00
質問です
nmcファイルに関する質問はここでいいでしょうか

272:デフォルトの名無しさん
11/10/21 12:53:13.58
>>271
だめです

273:デフォルトの名無しさん
11/10/21 13:22:22.50
そうですか
では受付しているスレがあったら教えてください

ダウンロードしたツールのヘルプに書いてあるexeの実行について
説明がよくわからなく、自分で追加していいのか教えてほしいのが趣旨です
よろしくお願いします

274:デフォルトの名無しさん
11/10/21 13:37:52.79
>>273
>>1を100万回読んでね

275:デフォルトの名無しさん
11/10/21 14:24:15.02
>>269-270

ほんとにありがとーーーーーーーーーー!(涙)涙出るほどうれしいよ。

こうやって合体させたよ。
Sub Macro2()
For r = 1 To ActiveSheet.UsedRange.Row
Cells(r, 1) = Application.WorksheetFunction.Clean(Cells(r, 1))
Next
With Range("A1",Range("A"&Rows.Count).End(xlUp))
  .Value=Application.Clean(.Cells)
End With
END SUB

詳しいコード内容はわからないが、
これでA列がクリーンされた。

関数によって簡単にVBAに組み込めないものもあるのだろうか?
ほんと感謝



276:デフォルトの名無しさん
11/10/21 14:27:56.50
明日エキスパート(スタンダード)の試験でレジストリ関係の処理をテストしてるんですが、
↓のコードがコンパイルエラーになります。(DeleteSettingステートメント)
メッセージは「引数の数が一致していません。または不正なプロパティを指定しています」
これでなぜコンパイルエラーになるのか誰か説明してくれませんか?
もう2時間も足踏みしている

'登録名:Application
pos = InStrRev(ThisWorkbook.Name, ".") - 1
APPNAME = Left(ThisWorkbook.Name, pos)

  'データ削除
DeleteSetting APPNAME

MsgBox "レジストリ掃除完了"

277:デフォルトの名無しさん
11/10/21 15:08:45.89
Functionoプロシージャか他のユーザー定義関数で、関数を格納したセルの値が
参照するセルの値の変更に伴い、自動的に再計算されて正しい数になるプロシージャはないでしょうか。

例:セルA4の値=3 セルA5の値=5 セルA6の関数の値=20
左の値を3から30に変える、左のセルから他のセルへ移った瞬間、セルA6が40になる。

※例のセルA6には、ifやselect等で作られた独特なユーザ定義関数が入っているものとする。

278:デフォルトの名無しさん
11/10/21 16:49:52.72
>関数によって簡単にVBAに組み込めないものもあるのだろうか?

WorksheetFunctionクラスのメソッドでは提供されてないものもある
CODE関数とか
まぁ他にもいろいろあるんだろうけど。


279:デフォルトの名無しさん
11/10/21 20:23:24.18
×
 For r = 1 To ActiveSheet.UsedRange.Row
   Cells(r, 1) = Application.WorksheetFunction.Clean(Cells(r, 1))
 Next


 For r = 1 To ActiveSheet.UsedRange.Rows.Count
   Cells(r, 1) = Application.WorksheetFunction.Clean(Cells(r, 1))
 Next


 For Each x In ActiveSheet.UsedRange.Columns(1).Cells
   x = Application.WorksheetFunction.Clean(x)
 Next

280:デフォルトの名無しさん
11/10/21 20:25:17.58
>>277
日本語おかしいけどユーザ定義関数で解決する話じゃないの?


281:デフォルトの名無しさん
11/10/21 21:00:16.85
>>277
自分のVBA関数内でApplication.Volatileを記述すると幸せになれるかも。

282:デフォルトの名無しさん
11/10/21 21:04:37.70
>>279
なんでループ回すの?
>>270読んだ?

283:デフォルトの名無しさん
11/10/21 21:11:31.57
ループ回すにしてもUsedRange.Columns(1).Cellsは下手だわな。
UsedRange.Resize(,1)とすればセルの集合になるし。

284:デフォルトの名無しさん
11/10/21 21:39:40.87
>>276
再現できない

レジストリエディタ見ながら
1行ずつ試してみれば?



285:デフォルトの名無しさん
11/10/21 22:17:30.54
>>279>>270の間違いを正しただけだな。
For r = 1 To ActiveSheet.UsedRange.Rowは明らかな間違いだし。

286:デフォルトの名無しさん
11/10/21 22:20:19.40
すまん>>270じゃなく>>269の間違いを正したってことね。


287:デフォルトの名無しさん
11/10/21 22:30:26.40
>>285-286
なるほど、そういえばそうだな。

288:デフォルトの名無しさん
11/10/21 23:25:21.00
Excel2010でグラフを表示させるマクロを組んでます。
下のコードでは、実行したときに「ApplyCustomeTypeメソッドは失敗しました: '_Chart'オブジェクト」とエラーが出ます。
ネットにも割と転がってる書き方なんですが、何が原因なんでしょう?

Dim ChartObj As ChartObject
Dim ch As Chart
Set ChartObj = ActiveSheet.ChartObjects.Add(100, 100, 100, 100)
Set ch = ChartObj.Chart

ch.ApplyCustomType ChartType:=xlAnyGallery, TypeName:="折れ線"

'実際にはユーザー定義のグラフを作成します。
'このあと実際のデータ系列を追加していきます。

289:デフォルトの名無しさん
11/10/22 01:40:03.91
>>288
2007で試したけど、TypeNameにテンプレートに保存されてる名前指定しないとエラーになるな

290:デフォルトの名無しさん
11/10/22 01:56:30.15
>>283
コードの可読性って知ってる?

291:デフォルトの名無しさん
11/10/22 06:15:39.57
可読性はどっちも変わらないよ。

292:デフォルトの名無しさん
11/10/22 06:21:27.04
そういえばOffset(,1)とすると可読性が落ちるとかいう先生がいたな。
Offset(0,1)としなさいみたいな。
Resizeの第一引数がないから可読性が落ちると思ってたりして。


293:288
11/10/22 08:42:11.99
>>289
ためしにグラフのテンプレートを作ってそれを指定したらうまくいきました。
thx!

294:デフォルトの名無しさん
11/10/22 09:03:09.96
>>291
残念、ハズレ

295:デフォルトの名無しさん
11/10/22 09:57:19.71
最近vb.netやってて久しぶりにVBA でちょこっとPG組んでみたけどなんか凄い違和感を感じた。
やっぱりあまり入力補完が効かないせいかな。

可読性は大事だね。変数名とかにも拘れば、その分
説明のコメントを省略出来たりすることもあるしね。


296:デフォルトの名無しさん
11/10/22 11:01:55.28
可読性なんてのはその人のレベルで違う。

297:デフォルトの名無しさん
11/10/22 11:05:35.02

欲しいのは1列目のセル集合

① 使用範囲 の 列(1) の セル

② 使用範囲 の サイズ変更(,1)

はてさて、、、

298:デフォルトの名無しさん
11/10/22 11:08:08.95
>>295
VBAでは入力補完が効く書き方が概ねセンスのよい書き方だ。
入力補完が効かない場合でもきちんと固有の型の変数に一度代入すれば入力補完が効く。
たとえばWith ActiveSheetとやっても駄目だが、Worksheet型の変数に
Set sh = ActiveSheet
With sh
とすれば入力補完が効く。


299:デフォルトの名無しさん
11/10/22 11:10:30.77
>>297
その人のレベル。

300:デフォルトの名無しさん
11/10/22 11:12:30.41
欲しいのは1列目のセル集合
① 使用範囲 の 列(1) の セル
② 使用範囲 の サイズ変更(,1)
はてさて、、、

301:デフォルトの名無しさん
11/10/22 11:13:33.15
どっちも同じ

302:デフォルトの名無しさん
11/10/22 11:15:55.78
① 使用範囲 の 列(1) の セル
② 使用範囲 のセル集合のサイズ変更(,1)
だな。
UsedRangeはセル集合を最初から返すから、セルの集合のまま使った方が手っ取り早い。

303:デフォルトの名無しさん
11/10/22 11:42:21.69
> UsedRangeはセル集合を最初から返すから、セルの集合のまま使った方が手っ取り早い。
> UsedRangeはセル集合を最初から返すから、セルの集合のまま使った方が手っ取り早い。
> UsedRangeはセル集合を最初から返すから、セルの集合のまま使った方が手っ取り早い。
> UsedRangeはセル集合を最初から返すから、セルの集合のまま使った方が手っ取り早い。
> UsedRangeはセル集合を最初から返すから、セルの集合のまま使った方が手っ取り早い。


304:デフォルトの名無しさん
11/10/22 11:46:00.34
>>303
分かり切ったことを5回も書かなくていい。
つまり
①セル集合の使用範囲の列集合の列(1) のセル集合
②セル集合の使用範囲のサイズ変更(,1)
ってことだろ?

305:デフォルトの名無しさん
11/10/22 12:34:59.89
┐(´ー`)┌

306:デフォルトの名無しさん
11/10/22 13:45:11.77
Sheet1の使用範囲の2列目のセル集合なら
Sheet1.UsedRange.Columns(2).Cells
Sheet1.UsedRange.Resize(,1).Offset(,1)
などがあり、とりたてて後者を推奨するわけではないが、1列目に限れば
Sheet1.UsedRange.Resize(,1)がすっきりしてるわな。
上級者ほどResizeを使うだろうな。

307:デフォルトの名無しさん
11/10/22 14:06:46.59
失礼、
上級者ほどResizeを使わないだろうな。
の誤りです。

308:デフォルトの名無しさん
11/10/22 14:16:01.87
>>307は下手くそな成りすまし
>>306ではない
おまえは下手を自覚した方がいい。

309:デフォルトの名無しさん
11/10/22 14:29:00.56
話反れるけどVBA上級者ってどんな人?
PGならVBから入った人が多くて、そっちの機能で大体の事は出来ちゃうと思うし、
現場で使う人は、機能は知っててもプログミングの基礎知識が無いだろうし。

自分の周りに上級者が居ないので気になりました。

310:デフォルトの名無しさん
11/10/22 14:34:35.64
全くの素人です。あるフォルダ―の中のエクセルファイルがあります。
のファイルの中にはいろいろ個別のデータが書き込まれているのですが、
中身チェックのマクロとか組めば、各ファイルを開いて簡単に中身を読み込んで、
一覧表みたいなのはできるのでしょうか?

311:デフォルトの名無しさん
11/10/22 14:38:57.21
VBAで上級者はいない
これデフォ

312:デフォルトの名無しさん
11/10/22 14:46:31.92
できる事も、やれる環境も限られてるからな
プレハブで豪邸が建たないとの同じようなもんだ
プレハブにはプレハブのいい所があるんだから、そこを重視すべき

313:デフォルトの名無しさん
11/10/22 15:04:06.01
たまに、「うちの業務は全部この Excel 帳票でやってます」
なんてのがあるけど、物には限度ってものがあるよな。

314:デフォルトの名無しさん
11/10/22 15:18:10.23
>>310です。 ぐぐったら出てきました。 自己解決です。

315:デフォルトの名無しさん
11/10/22 15:29:52.56
「上級者ほど~を使う」というのは、上級者じゃないと把握出来ない
つまり「上級者ほど~を使う」というのは、「俺は上級者」と遠回しながらドヤ顔で言ってるのと同じ

しかも、自分の書いたものを、他人が上級者認定してるかのように自演してまで

うわぁ、痛すぎw

316:デフォルトの名無しさん
11/10/22 16:17:33.95
309だけど自演じゃないよ。
「プレハブ工法を知り尽くした男」に尊敬や憧れなんて無いし。
偉いとは思うけどね。
やっぱ上級者を育てる土壌がないのか、危険な言語だわ

317:デフォルトの名無しさん
11/10/22 16:28:19.27
上級者ほど道具を使って
マニアックになって行く

318:デフォルトの名無しさん
11/10/22 16:41:24.11
というか、想定用途が違うんだから、VBA 以外でやったら上級者とかいう話じゃないでしょ。
むしろ、VBA で済ますべきか他の方法を使うべきかを見極められるのが上級者。

319:デフォルトの名無しさん
11/10/22 16:53:54.68
> 1列目に限れば
条件を勝手に限定せず
条件が変わっても違和感無く柔軟に対応できる方法を使うのが上級者

特定条件での端的なすっきりさを優先して、1列目ならResize、2列目以降ならColumnsと
やりかたをコロコロ変えるのが初心者

320:デフォルトの名無しさん
11/10/22 17:21:01.86
だそうだ

321:デフォルトの名無しさん
11/10/22 18:51:17.38
実行時バインドのItemプロパティを多用する奴に上級者はいない。


322:デフォルトの名無しさん
11/10/22 18:59:45.85
>>316
プレハブの例え挙げたの俺だけど、>>318が正解
震災の仮設住宅設営で、一級建築士も宮大工も必要ない
言語は道具なんだから、きっちり使いどころを押さえているのが肝要

まぁプレハブ工法を極めるのもアリでしょ
かなりのスピードと精度を求められると思うが

323:デフォルトの名無しさん
11/10/22 19:01:05.96
おまいら1行目にいろんな処理をするときどちら使う?
その1
With Range("A1").CurrentRegion.Rows(1)
  .****.***
  .****.***
  .****.***
End With

その2
With Range("A1").CurrentRegion.Resize(1)
  .****.***
  .****.***
  .****.***
End With


324:デフォルトの名無しさん
11/10/22 19:18:38.01
Range(場所).Columns(1)

325:デフォルトの名無しさん
11/10/22 19:19:38.02
ああ、ColumnsじゃなくてRowsか

326:デフォルトの名無しさん
11/10/22 19:20:37.77
>>324
どちらへのレス?

327:デフォルトの名無しさん
11/10/22 19:22:30.80
ちょい遅かったか。
>>324-325は>>319か?

328:デフォルトの名無しさん
11/10/22 19:25:18.84
>>323
どちらが楽かと言われれば当然後者だわな。

329:デフォルトの名無しさん
11/10/22 19:36:40.52
分かってる人もいるにはいるんだな。

330:デフォルトの名無しさん
11/10/22 19:41:10.60
何故に自演してまで・・・

331:デフォルトの名無しさん
11/10/22 19:44:58.29
また始まったなw

332:デフォルトの名無しさん
11/10/22 19:52:23.38
>>324=>>319だったらかわいそうだな。

333:デフォルトの名無しさん
11/10/22 19:59:37.98
一方を書いたの俺だが、=はハズレなので可哀想じゃないわけだね

334:デフォルトの名無しさん
11/10/22 20:04:13.88
>>324-325ならどっちにしてもかわいそう

335:デフォルトの名無しさん
11/10/22 20:58:37.29
                           _,====ミミミヽ、
                         ,,==≡ミヽミヾミミミ、ヾ、
                       _=≡≡三ミミミ ミミヾ、ソ)),,》  .
                     彡彡二二三≡ミ-_ ミミ|ノノj )||ヽ, )、
                 __,,,,,,,,,/彡二二二    ,- __ミ|/ノ ノノノノ) ||
                -=二ミミミミ----==--'彡 ∠ミミ_ソノノノノ ノ
                  //>=''"二二=-'"_/   ノ''''')λ彡/
        ,,/ ̄''l       彡/-'''"" ̄-=彡彡/ ,,-''",,,,,,,ノ .彡''"
       (,  ,--(      彡 ,,-- ===彡彡彡"_,-_   ヽ Υ
       ヾ-( r'''''\    //=二二''''''彡ソ ̄ ∠__\ .\ソ  .|
         \;;;;  \   Ζ彡≡彡-'''',r-、>   l_"t。ミ\ノ,,r-v   / ̄ ̄ ̄ ̄ ̄ ̄
           \;;;;  \  彡""彡彡-//ヽ" ''''''"" ̄'''""(エア/  /
            \;;  \'''''')彡ヽ// | (tv   /|  , r_>'|  < 一体(ry
             \;;;  \'"  \ ,,"''-,,ノ,r-", /  r'''-, .j   \
               \;;;  \ /,,>--'''二"''' r-|   二'" /  __  \______
                \;;r'""彡_l:::::::::::::::::::::: /./_   " / ̄ ̄"===-,
                  )''//rl_--::::::::::::::::/:/ヽ"'=--":



336:デフォルトの名無しさん
11/10/22 21:04:01.01
アホと戦うのも疲れるよ。


337:デフォルトの名無しさん
11/10/23 01:58:17.38
VBAスタンダードクラウン日本第1号講師のVBA講座 - YouTube
www.youtube.com/watch?v=ZNx8aq9ZIvI

これの Test4_1_6のプロシージャなんだけど
制御がひどくないか

Worksheets("Sheet1")がWorksheets("Test")より左にあったら
実行時エラーだし

VBAに関わらず、こんな制御を書く人間はプログラミングしないでくれ


338:デフォルトの名無しさん
11/10/23 02:48:03.74
>>337
何この上から目線
人が何書こうが勝手だろうに

339:デフォルトの名無しさん
11/10/23 07:29:17.41
>>337
ループの回し方の講座だろ?
Worksheets("Test")はない前提だから別にいいんだよ。
そもそもシート名を書き換えるなら普通はループは回さないし。
またコードなんか隅々まで考慮に入れて書いてたら2~3倍の記述量になるから講義にはならん。

340:デフォルトの名無しさん
11/10/23 09:41:01.03
厨房でも設問の「ただし空気抵抗は考慮しない」云々の但し書きに
あーだこーだぬかす奴がいるでしょ
それと同じだよ
問題の本質を捉えられない馬鹿は普通にいる

341:デフォルトの名無しさん
11/10/23 10:10:32.61
擁護がひどいな

VBAスタンダードクラウン日本第1号講師のVBA講座 - YouTube
www.youtube.com/watch?v=ZNx8aq9ZIvI
より、引用

Sub Test4_1_6()
 For i = 1 To Worksheets.Count
  If Worksheets(i).Name = "Test" Then
   MsgBox "既にTestシートが存在します"
   Exit Sub
  ElseIf Worksheets(i).Name = "Sheet1" Then
   Worksheets(i).Name = "Test"
   Exit For
  End If
 Next
End Sub

342:デフォルトの名無しさん
11/10/23 10:38:38.30
Sheet1が先に見つかったらエラーですかw

343:デフォルトの名無しさん
11/10/23 16:57:01.73
シート名の"Sheet1"と"Test"は共存しない前提だろ?
"Sheet1"を"Test"に変更すれば"Sheet1"はなくなるからね。
共存ありなら
Sub Test4_1_6()
Const FROM_NAME As String = "Sheet1"
Const TO_NAME As String = "Test"
Dim sh As Worksheet
On Error Resume Next
Set sh = Worksheets(TO_NAME)
On Error GoTo 0
If sh Is Nothing Then
  On Error Resume Next
  Set sh = Worksheets(FROM_NAME)
  On Error GoTo 0
  If Not sh Is Nothing Then
    sh.Name = TO_NAME
  End If
Else
  MsgBox "既に" & TO_NAME & "シートが存在します"
End If
End Sub
なんてなるんだろうけど。

344:デフォルトの名無しさん
11/10/23 16:58:43.47
ん?Testシートが既存の状態でsheet1が先に見つかったら同じ名前を付けようとしてエラーになるやん。

でも講座用なら別にこんなん普通やろ。>>340に同意だな。

345:デフォルトの名無しさん
11/10/23 17:06:56.96
おっと、たとえばグラフシートに"Test"とかあった場合上ではNGか。
shをObject型で宣言して
Set sh = Worksheets(TO_NAME)じゃなく
Set sh = Sheets(TO_NAME)だな。

346:デフォルトの名無しさん
11/10/23 18:12:07.64
普通のExcelの初期状態の新規ブックはSheet1とかSheet2って名前になってるよな。
別に>>341みたいに目くじら立てる問題じゃないな。
講義用ならありだと思う。
ほんまもんのプロが>>341みたいな不細工なコード書いてたらプロとして失格だが。

347:デフォルトの名無しさん
11/10/23 19:13:50.91
単純に、Forループを2回廻すとか、

Sheet1のインデックス取っておいて
Forループ出てからファイル名変更するとか、

すれば、講座の趣旨にも沿うだろ

>343とかw

348:デフォルトの名無しさん
11/10/23 20:21:54.46
スタンダードクラウンなんて資格は知らんが、大体資格なんてあてになるのか?
MVPなんかかなり酷いぞ。

349:デフォルトの名無しさん
11/10/23 20:25:29.08
訂正
全員ひどいってわけじゃないと思うが、ひどいのがいるって話ね。


350:デフォルトの名無しさん
11/10/23 21:55:11.31
そいつ前いた忍者ハッタリ君じゃね?

351:デフォルトの名無しさん
11/10/23 22:53:10.63
エラー処理ってどこまで配慮するかのサジ加減が良く分からない。
自分で使うマクロなら例えば数字の入力を要求するところに文字は入れないし、
エラーで止まっても原因の見当がつくから適当に書いちゃってる。
でも人に使わすものだと相手がどんな使い方するか分からないから
エラー処理きちんとやらないとあとで文句言われてめんどくさい。

352:デフォルトの名無しさん
11/10/23 23:49:30.14
MVPはサイトを立ち上げてティップスをいっぱい並べておけば誰でもなれる。
ティップスの質は関係ないよ。

353:デフォルトの名無しさん
11/10/24 00:04:04.69
そのとおり
MVPはそもそも資格ではない

354:デフォルトの名無しさん
11/10/24 07:19:53.34
野球板でどうぞ

355:デフォルトの名無しさん
11/10/24 09:36:34.66
>>277です。Application.Volatileでも、ダメでした。

356:デフォルトの名無しさん
11/10/24 10:10:40.93
>>355
そもそも質問が意味不明
左の値ってなんだ?
なんでA4の3を30に変えるとA6の20が40になるのかも分からんし。
ユーザー定義関数なんてのは引数をきちんと渡せば、引数の変更で普通に再計算される。
Application.Volatileなんてものは書く必要なし。
そんなもの書いてる関数のほとんどは糞関数だ。

357:デフォルトの名無しさん
11/10/24 10:25:45.25
>>355
そもそも関数にSelect使っても動かんだろ?

358:デフォルトの名無しさん
11/10/24 10:32:23.54
selectは使っておりませんが、functionプロシでifを使ってます。
ユーザー定義関数でifは使えないんですか?

>なんでA4の3を30に変えるとA6の20が40になるのかも分からんし。
ユーザー定義関数で、数が変わるのを表現しました。

359:デフォルトの名無しさん
11/10/24 10:33:33.47
あと、プロシージャを標準モジュールに入れているのも、原因でしょうか。

360:デフォルトの名無しさん
11/10/24 10:44:41.45
きちんと引数を使ったら、自己解決しました。すみませんでした。

お礼に「9歳から14歳」を2ちゃんねる検索したらヌケる、この情報をお教えします。

361:デフォルトの名無しさん
11/10/24 12:28:08.39
すみません。素人です。

Sub B()
Dim i As Long
For i = 1 To 10
Cells(i, 1) = Mid(Cells(i, 11), 4, 6)
Next i
End Sub

という、A1からJ1へMIDで6文字取り出す式を立てたつもりなのですが、
なぜか結果をA列を縦に表示します。
Xにforで代入し、iが1,2,3…と変化したら、A1,B1,C1…と行方向横に表示すると思うのですが、
X値が変化して、なぜ縦に列で出るのでしょうか????

362:デフォルトの名無しさん
11/10/24 12:37:46.40
>なぜ縦に列で出るのでしょうか????

そらぁ縦に出るように指定してるからだろ w

363:デフォルトの名無しさん
11/10/24 12:45:59.69
cells(1,i)なら横に出るよ

364:デフォルトの名無しさん
11/10/24 13:07:58.71
行,列の考え方が逆

365:デフォルトの名無しさん
11/10/24 14:20:27.89
こういう、定義をあいまいなまま放置する人が6+5×3=33という計算をしちゃうのかねぇ?

366:デフォルトの名無しさん
11/10/24 14:27:46.55
>>362-364 ありがとうございます。デフォですかこれ。
Cells(y,x)と指定するんですね。

367:361
11/10/24 14:28:55.93
あれっ
6+5×3は195じゃないの?

368:デフォルトの名無しさん
11/10/24 14:56:33.92
x,yじゃなくてrow,colで考えれば自然

369:デフォルトの名無しさん
11/10/24 15:06:46.18
>>368
なぜ自然なのだ?

370:デフォルトの名無しさん
11/10/24 16:07:41.41
じゃあ自然じゃなくていいです。


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch