[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 05/30 05:22 / Filesize : 296 KB / Number-of Response : 978
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Excel VBA 質問スレ Part23



1 名前:既定のプロパティさん mailto:sage [2012/01/29(日) 00:05:13.16 ]
01 pc11.2ch.net/test/read.cgi/tech/1054356121/
02 pc11.2ch.net/test/read.cgi/tech/1168308855/
03 pc11.2ch.net/test/read.cgi/tech/1180192018/
04 pc11.2ch.net/test/read.cgi/tech/1189814602/
05 pc11.2ch.net/test/read.cgi/tech/1197448064/
06 pc11.2ch.net/test/read.cgi/tech/1205231499/
07 pc11.2ch.net/test/read.cgi/tech/1212587819/
08 pc11.2ch.net/test/read.cgi/tech/1219673793/
09 pc11.2ch.net/test/read.cgi/tech/1228372971/
10 pc12.2ch.net/test/read.cgi/tech/1235332603/
11 pc12.2ch.net/test/read.cgi/tech/1241885130/
12 pc12.2ch.net/test/read.cgi/tech/1247566074/
13 pc12.2ch.net/test/read.cgi/tech/1254281104/
14 pc12.2ch.net/test/read.cgi/tech/1262748898/
15 pc12.2ch.net/test/read.cgi/tech/1271261239/
16 hibari.2ch.net/test/read.cgi/tech/1280045912/
17 hibari.2ch.net/test/read.cgi/tech/1289182437/
18 hibari.2ch.net/test/read.cgi/tech/1298240666/
19 hibari.2ch.net/test/read.cgi/tech/1305754555/
20 hibari.2ch.net/test/read.cgi/tech/1312435844/
21 hibari.2ch.net/test/read.cgi/tech/1316931607/

前スレ:
Excel VBA 質問スレ Part22
toro.2ch.net/test/read.cgi/tech/1322400978/


113 名前:デフォルトの名無しさん mailto:sage [2012/02/08(水) 03:01:53.56 ]
>>112
順番は逆だが気にするな
中学か高校の情報の授業なんだろうが先生が期待している回答ではないかと

Sub チェック()
With Selection
  .Interior.Pattern = xlNone
  .SpecialCells(xlCellTypeBlanks).Interior.Color = RGB(255, 255, 0)
End With
End Sub


114 名前:デフォルトの名無しさん mailto:sage [2012/02/08(水) 03:16:33.90 ]
>>112
Sub チェック()
  Selection.Interior.Color = -4142
  Selection.SpecialCells(4).Interior.Color = 65535
End Sub

115 名前:デフォルトの名無しさん [2012/02/08(水) 04:11:01.60 ]
>>111
スレチの質問にヒントありがとうございます。
しかし実際は>>104なので、"物"とすることができません。
具体的には2ちゃんのレス番、名前欄手前に3つ改行を入れたいのです。

Sub TEST()
With Selection.Find
.MatchSoundsLike = False
.MatchFuzzy = False
.MatchWildcards = True

.Text = "[0-9]{1,3} :* ??:??:??.?? ID:????????"
.Replacement.Text = vbCr & vbCr & vbCr & "ここに何か".
.Execute Replace:=wdReplaceAll
End With
End Sub

検索結果をそのまま持ってくるような関数は無いでしょうか?
上記"ここに何か"部分にそれを入れれば上手く動きそうな気がします。

116 名前:デフォルトの名無しさん mailto:sage [2012/02/08(水) 07:28:55.58 ]
>>115
>>97

117 名前:デフォルトの名無しさん [2012/02/08(水) 16:02:40.64 ]
>>113,>>114
ありがとうございます!

118 名前:デフォルトの名無しさん [2012/02/08(水) 16:14:10.84 ]
>>116
ありがとうございます。>>111さんに教えて頂いたmougにて有用な回答を得て解決出来ましたので
エクセルでも応用が利くかもしれないので、方法を貼っておきます。

.Replacement.Text = "^p^p^p\1"

とすることで、\1が置換後の文字列をそのまま使ってくれる事を教わりました。
これで解決することが出来ました。

以上です。ご回答頂き本当にありがとうございました。

119 名前:デフォルトの名無しさん mailto:sage [2012/02/08(水) 23:04:47.66 ]
お邪魔します。
OS:WinXP-SP2
Ver:Excel2002です
目的:シートAとBの特定範囲を一括して印刷プレビュー

Sheets(Array("A", "B")).Select
Range("A1:F59").Select
Selection.PrintPreview
Sheets("C").Select

と入れてシートAとBのA1:F59の印刷プレビューを開きたいのですが
この命令を実行するとシートAのA1:F59のプレビューしか開けません。
シートAとBを一括してプレビューさせるには何が足りないのでしょうか?

120 名前:デフォルトの名無しさん mailto:sage [2012/02/08(水) 23:58:52.00 ]
>>119
ActiveWindow.SelectedSheets.PrintPreview

121 名前:デフォルトの名無しさん mailto:sage [2012/02/09(木) 00:17:23.02 ]
>>119
Worksheet オブジェクト(普通のシート)には PrintPreview メソッドが存在する、よってシートを選択してプレビューできる
sheets オブジェクト(複数のシートを保持できる)には PrintPreview メソッドが存在する、よって複数のシートを選択してプレビューできる
range オブジェクトには PrintPreview メソッドが存在する、よって範囲を選択してプレビューできる
range オブジェクトは同一シート内なら複数の範囲を保持できる、よって同一シート内なら複数の範囲をプレビューできる

ただし、Excel には複数のシートをまたがる複数の Range を保持できるオブジェクト自体が存在しない
そのため、それに対応する PrintPreview メソッドも存在しない

たぶん



122 名前:デフォルトの名無しさん mailto:sage [2012/02/09(木) 00:36:45.70 ]
>>119
PageSetupを変更して良いなら
↓はどう?

Sheets("A").PageSetup.PrintArea = "A1:F59"
Sheets("B").PageSetup.PrintArea = "A1:F59"
Sheets(Array("A", "B")).PrintPreview

123 名前:119 mailto:sage [2012/02/09(木) 11:32:11.25 ]
>>120-122
ありがとうございました。
最終的にこうなりました。

Sub 印刷プレビュー()
'セルB55の数値からシート印刷か部分印刷かを判断
If Range("B55") <> "" Then
'B55に数値が存在するならばシート印刷
Sheets(Array("請求書", "見積書")).PrintPreview
Else
'B54に数値が存在しなければ部分印刷
Sheets("請求書").PageSetup.PrintArea = "A1:F59"
Sheets("見積書").PageSetup.PrintArea = "A1:F59"
Sheets(Array("請求書", "見積書")).PrintPreview
'印刷範囲を初期化
    Sheets("請求書").PageSetup.PrintArea = "A1:F119"
Sheets("見積書").PageSetup.PrintArea = "A1:F119"
End If
End Sub

124 名前:デフォルトの名無しさん [2012/02/09(木) 17:07:00.03 ]
Dim 変数 as Range
このようにオブジェクト変数を使いセルを代入すると
その情報の中にそのセルの上位のシートやブックも一緒に保存されてるんですか?

125 名前:デフォルトの名無しさん mailto:sage [2012/02/09(木) 18:46:47.98 ]
>>124
たしかParentプロパティとかに入ってたと思う。

126 名前:124 [2012/02/09(木) 19:08:28.56 ]
Parentプロパティって何でしょうか?
つまりそのRange型変数には入ってるってこと?

その特定のセルの場所を保存するには
ブック型変数(Dim〜as Workbook)、シート型変数(Dim〜as Worksheet)、セル型変数(Dim〜as Range)の3つが必要かと思ってたけど
セル型ひとつで済むならかなり楽だけど、違うのかな?

127 名前:125 mailto:sage [2012/02/09(木) 19:41:53.50 ]
たとえば、こんな風にやってみると
レンジ型変数からシート名とブック名も取得できる
でもこんなことするより
シートやブックもオブジェクト変数に代入しちゃう方が早くないか?

Sub test()
Dim Rng As Range
Set Rng = ThisWorkbook.Sheets(1).Cells(1, 1)
Debug.Print Rng.Parent.Name
Debug.Print Rng.Parent.Parent.Name
End Sub

128 名前:125 mailto:sage [2012/02/09(木) 19:49:11.26 ]
>>126
ごめん、後半読んでなかった
セル範囲の指定をRange型変数ひとつでできないか、という話だったのね。
Range型変数に代入されたセル範囲はRange型変数だけで特定できるから
そういう意味ではWorkBook型やWorkSheet型の変数は不要だよ。

てっきりブックやシートの指定もレンジ型一つで全部済ませたい
ってことかと思ってたよ
(>>127で書いたとおりそれもできることはできるけど、
記述が長くなるからあんまりメリットを感じない。)

129 名前:デフォルトの名無しさん [2012/02/09(木) 22:17:32.76 ]
バイナリファイルを読み込んでデータの中の文字列を探したいと思ってます。
バイト配列と文字列を比較するためにしなくてはいけないのですが、
型を合わせる方法がわかりません。 バイト配列から文字列、また
文字列からバイト配列に変換する方法を教えてください。

よろしくお願いします。

130 名前:デフォルトの名無しさん mailto:sage [2012/02/09(木) 23:42:11.88 ]
>>129
バイナリファイルを文字列に変換して処理する例(すべてのバイトをを &H0000〜&H00FF のUnicode文字として変換)

Const adTypeBinary = 1
Sub Foo()
 bin = LoadBin("D:\misc\a.txt")
 n = GetBinSize(bin)
 Text = ""
 For i = 0 To n - 1
  Text = Text + ChrW(CodeAt(bin, i))
 Next
 index = InStr(Text, ChrW(&HFF))
 MsgBox "最初に見つけた &HFF の位置: " + CStr(index)
 index = InStr(Text, "hello")
 MsgBox "最初に見つけた hello の位置: " + CStr(index)
End Sub
Function LoadBin(path)
 Set stm = CreateObject("ADODB.Stream")
 stm.Type = adTypeBinary
 stm.Open
 stm.LoadFromFile (path)
 LoadBin = stm.Read()
 stm.Close
End Function
Function GetBinSize(bin)
 GetBinSize = LenB(bin)
End Function
Function CodeAt(bin, index)
 CodeAt = AscB(MidB(bin, index + 1, 1))
End Function

131 名前:デフォルトの名無しさん mailto:sage [2012/02/09(木) 23:44:26.34 ]
>>129
>ANSI 形式のバイト型配列を文字列に変換する場合は、StrConv 関数を使用してください。
>Unicode 形式の配列を変換する場合は、代入式を使用してください。
以上 StrConv 関数のヘルプから

それ以外の文字コードだった場合はVBAだけで簡単にやる方法は多分ない



132 名前:デフォルトの名無しさん mailto:sage [2012/02/10(金) 00:19:32.83 ]
文字コードによるけど、バイナリファイルだって最初っからテキストモードでオープンすりゃええがな

133 名前:126 [2012/02/10(金) 00:29:11.59 ]
>>127>>128
すばらしい解説ありがとうございます。
なるほど、Rangeでもシートやブックの情報を裏で持ってたんですね。
頭スッキリしました。
こういうスッキリ感がプログラムという複雑化しやすいことを扱うにはものすごく重要ですしね。
ということはRangeのオブジェクト変数はものすごく便利ですね。

134 名前:デフォルトの名無しさん mailto:sage [2012/02/10(金) 00:53:51.04 ]
間違ってた
○ChrW
×Chr

135 名前:デフォルトの名無しさん mailto:sage [2012/02/10(金) 00:55:28.19 ]
>>134>>130についてです

136 名前:129 [2012/02/10(金) 01:23:07.49 ]
>>130>>134>>135
具体的なサンプルありがとうございます。
SJISの場合はChrでUTFの場合はChrW
を使えばよいのでしょうか?

>>131
たしかSJISだったと思うのでStrConvを使えば
比較できるということですね。
ヘルプを確認してみます。

>>132
テキストモードでオープンすると正しく取得できない
値があるのでバイナリモードでオープンする方法を検討しています。

137 名前:130 mailto:sage [2012/02/10(金) 01:44:11.61 ]
>>136
>SJISの場合はChrでUTFの場合はChrW
違う
ChrWは単なる間違い

130の例で Shift_JIS の "あ" を検索したいなら、
Chr(&H82) + Chr(&HA0)
を検索する必要がある
面倒だけど、その代わりバイト並びさえ分かっていれば変換による情報落ちの心配なしにどんなコードでも処理できる、という例

138 名前:デフォルトの名無しさん [2012/02/10(金) 11:13:23.28 ]
VBAの基本的な文法はマスターしたのですが
Error処理のしかた
プロシージャのCallの呼び方
きれいなコードの書き方
イミディエト窓の使い方
バグフィックスのしかた

など、普通の入門書にはほとんど書かれていないこともマスターしたいです
そのためのいい本はありますか?

139 名前:デフォルトの名無しさん [2012/02/10(金) 13:05:03.46 ]
これは正しいですか↓

-------------------------------------------------
LoadするとInitializeイベントが発生して、
ShowでActivateイベントが発生する。
HideするとDeactivateイベントが発生して、
UnloadでTerminateイベントが発生する。

LoadしないでShowすると自動的にLoadされてShowするし、
HideしないでUnloadしても自動的にHideされてUnloadする。


140 名前:デフォルトの名無しさん [2012/02/10(金) 13:07:14.91 ]
>>139
神!

こういう整理された情報こそ実用的であり非常に有用。
みんなも>>139みたいな情報を共有しあうために貼り付けようじゃないか!

141 名前:デフォルトの名無しさん mailto:sage [2012/02/10(金) 13:34:27.98 ]
すくなくとも
>ShowでActivateイベントが発生する。
>HideするとDeactivateイベントが発生して、
は正しくない
Showした結果アクティブになればActivateイベントが発生するし
Hideした結果アクティブじゃなくなればDeactivateイベントが発生する
HideしたからってかならずDeactivateが発生するわけじゃない



142 名前:デフォルトの名無しさん [2012/02/10(金) 14:42:14.40 ]
Workbooks(x)のxを
そのworkbookの名前から取り出す方法を教えてください。

143 名前:デフォルトの名無しさん mailto:sage [2012/02/10(金) 15:20:21.90 ]
取り出す必要なんてない。

144 名前:デフォルトの名無しさん mailto:sage [2012/02/10(金) 16:14:52.80 ]
>>142
WorkbookオブジェクトにはIndexプロパティがないので直接求めるのは無理
Workbooksコレクションをループで順番に見ていくしかない

けど>>143の言う通り、インデックス番号なんかわからなくてもプログラムは書ける
何がやりたいの?

145 名前:142 [2012/02/10(金) 16:31:35.11 ]
長いコードを短くしたいの。

146 名前:デフォルトの名無しさん [2012/02/10(金) 16:33:32.37 ]
コピペをVBAコードて書く場合、
なぜ対象オブジェクトはシートなんですか?
普通に考えてセルであるべきだ。
納得される説明・理由が聞きたいのですが。

147 名前:デフォルトの名無しさん mailto:sage [2012/02/10(金) 17:11:39.81 ]
>>145
短くしたいなら、
dim book as workbook
set book = workbooks("bookname.xls")
'以降bookを使ってコードを書く

の方が良くない?

148 名前:デフォルトの名無しさん mailto:sage [2012/02/10(金) 17:34:20.86 ]
>>145
それならオブジェクトを変数に入れた方がいい
短くなるだけでなく、処理も少し軽くなる
具体例は>>147

コードを短くする方法はいくつかあって、Withを使うのも効果的

149 名前:デフォルトの名無しさん mailto:sage [2012/02/10(金) 19:10:47.12 ]
>>146
そんなことをここで聞かれてもな
マイクロソフトに聞け

ただ、おまえが普段どんなコードでコピペしてるかしらんが
少なくとも俺はコピーするときはRangeが対象なことがほとんどだし
Rangeに張りつけたければPasteSpecialも使えるぞ

150 名前:デフォルトの名無しさん [2012/02/10(金) 19:38:29.05 ]
VBAでVLOOKUPのようなことをしたい場合どうしてますか?

151 名前:デフォルトの名無しさん [2012/02/10(金) 19:41:55.38 ]
VBAで改行を文字列にするにはどうすればいいですか?



152 名前:デフォルトの名無しさん mailto:sage [2012/02/10(金) 19:49:24.89 ]
>>150
あなたはどうしてますか

153 名前:デフォルトの名無しさん mailto:sage [2012/02/10(金) 19:50:09.64 ]
>>151
ん?

154 名前:デフォルトの名無しさん [2012/02/10(金) 19:57:04.82 ]
>>152
使い方をしらないからまだ使ったことない。
>>151
vbLINEかvbCRみたいなのなかったっけ?

VBAでワークシート関数を使いたいとき、Application.WorkSheetFunctionを使えばいいと書いてあるけど
どんな関数でもVBAでも使えるのですか?
さらにWorkSheetFunctionのあとは単にワークシート関数の単語を書けばいいだけ?

155 名前:デフォルトの名無しさん [2012/02/10(金) 20:04:05.38 ]
ワークシートとVBAで混乱するもの

FindとInstr
TextとFormat
DateとToday
その他多数

これみんなどうやって記憶してるの?

156 名前:デフォルトの名無しさん mailto:sage [2012/02/10(金) 20:08:37.99 ]
>>150
VBAでもVLOOKUP関数は普通に使える

157 名前:デフォルトの名無しさん mailto:sage [2012/02/10(金) 20:09:39.85 ]
>>154
オブジェクトブラウザで、WorksheetFunctionオブジェクトを見れば良い。
Application.WorksheetFunctionプロパティが返してくるのがこいつだから。
別にExcel固有の記述とかそういうものじゃない。

158 名前:デフォルトの名無しさん mailto:sage [2012/02/10(金) 20:09:50.18 ]
>>151
vbCr
vbLf
vbCrLf

159 名前:デフォルトの名無しさん mailto:sage [2012/02/10(金) 20:09:57.92 ]
なんだか真面目に質問しているようにみえないんだが
気のせい?

160 名前:デフォルトの名無しさん mailto:sage [2012/02/10(金) 20:12:30.38 ]
>>155
使ってれば自然に覚える
間違えばエラーが出るから、それを見て直す
忘れたらヘルプを見る、Googleで検索する

せっかくコンピューターが色々と助けてくれるんだから
完璧に暗記することよりも、それを活用する方法を考えた方が応用範囲が広くなる

161 名前:デフォルトの名無しさん [2012/02/10(金) 20:20:58.66 ]
>>156
ありがとう。それはWorksheetFunctionを使って?
>>157
ありがとう。はじめオブジェクトブラウザを見てみた。たくさん入ってる関数は全部ワークシートの関数なんだね。
でも例えば単純なSum関数だとActivecell=Application.WorksheetFunction.Sum("A1:E5")と書けば
そのセルに”=Sum("A1:E5")”と入力されるってことで合ってます?
>>158
ありがとう。それだ。
>>159
今後仕事でVBA使うので復習中。
>>160
確かにそうですね。丸暗記はやめます。しかし例えば6か月くらいBAを全く使わないと基本機能すら忘れるね。
その忘れたときに思い出すための対策(例えば基本機能のメモと特殊的機能の一覧をノートにまとめるとか)は何かしといたほうがいいと感じてます。



162 名前:デフォルトの名無しさん mailto:sage [2012/02/10(金) 20:25:47.45 ]
>合ってます?

聞く前に試せば済むこった

163 名前:デフォルトの名無しさん [2012/02/10(金) 20:30:50.24 ]
あなたの回答力も試したいと思って。

164 名前:デフォルトの名無しさん mailto:sage [2012/02/10(金) 20:34:24.98 ]
やはりそうでしたか

165 名前:デフォルトの名無しさん [2012/02/10(金) 20:34:45.43 ]
>>162
試してもエラーが出るんですけど。エラいこっちゃ。

166 名前:デフォルトの名無しさん mailto:sage [2012/02/10(金) 20:36:28.19 ]
>>165
WorksheetFunction.Sum(Range("a1:e5"))

167 名前:デフォルトの名無しさん [2012/02/10(金) 20:37:47.13 ]
Activecell=Application.WorksheetFunction.Sum(Range("A1:E5"))
ならうまくいきました。
しかもセルには数式じゃなく結果の数値のみが表示されてる。

もしVBAでセルに数式そのものを入力したい場合はどうすればいいの?

168 名前:デフォルトの名無しさん mailto:sage [2012/02/10(金) 20:38:30.47 ]
>>167
ActiveCell.FormulaLocal = "=Sum(A1:E5)"

169 名前:デフォルトの名無しさん [2012/02/10(金) 20:38:34.59 ]
>>166
1分19秒先を越された・・・・・・

170 名前:デフォルトの名無しさん [2012/02/10(金) 20:39:38.10 ]
>>168
ありが十匹。
ところで単にActiveCell= "=Sum(A1:E5)"、または、ActiveCell.Value= "=Sum(A1:E5)"、でも問題ないですか?

171 名前:デフォルトの名無しさん mailto:sage [2012/02/10(金) 20:41:56.18 ]
>>170
試してみたらどうだ



172 名前:デフォルトの名無しさん mailto:sage [2012/02/10(金) 21:32:09.71 ]
あなたのVBA力と回答力を試しているんですが

173 名前:デフォルトの名無しさん [2012/02/10(金) 21:47:11.33 ]
ワークシート関数のSumと
VBaのApplication.WorksheetFunction.のあとのSumでは
そのあとに続くコードが微妙に違うの?
Vlookupの場合は?
まさか関数ごとに全部覚えないといけないの?

>>171
できた。

174 名前:デフォルトの名無しさん mailto:sage [2012/02/10(金) 21:52:43.03 ]
>>173
> Vlookupの場合は?

試してみたらどうだ

175 名前:デフォルトの名無しさん [2012/02/10(金) 22:03:27.91 ]
VBAのコードを使って、ファイルやフォルダを自由自在に操ってみたいと思ってます。

[ファイル]と[フォルダ]のそれぞれ2つについて、
[移動][コピー][削除][名前の変更]の4つはどうコードで記述すればいいか(つまり2x4=8個について)、
どなたか教えていただけませんか?
それが載ってあるサイトのURLでもいいです。

(*[フォルダ]の[削除]は、もしその中にファイルやフォルダがあったらそれも含めて全部削除するとします)

176 名前:デフォルトの名無しさん mailto:sage [2012/02/10(金) 22:09:50.59 ]
>>175
VBA力と回答力を試しているんですか

177 名前:デフォルトの名無しさん mailto:sage [2012/02/10(金) 22:22:14.32 ]
>>175
んなもん、それぞれぐぐっていけばいいだけの話だろうが

Office TANAKA - トップページ
officetanaka.net/
officetanaka.net/excel/vba/filesystemobject/index.htm

あたり読めば?

178 名前:デフォルトの名無しさん mailto:sage [2012/02/11(土) 07:56:33.53 ]
あなたの検索力を試したんですよ
まあまあですね

179 名前:デフォルトの名無しさん [2012/02/11(土) 17:49:13.59 ]
>>178
くやしいのうwwwwwwwwwくやしいのうwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww

180 名前:デフォルトの名無しさん [2012/02/11(土) 19:00:02.04 ]
"w" も使い過ぎると逆効果だなあ。

181 名前:デフォルトの名無しさん mailto:sage [2012/02/11(土) 22:54:53.04 ]
図形を含んだシートのコピーに関して教えてください。
セル範囲を指定してコピー、別シートに貼り付けをしているのですが、
コピー自体はできるのですが図形の大きさが変わったり、印刷した時の大きさが違ったり
してしまいます。
全く同じにコピーするにはどうすればいいのでしょうか?
シート自体のコピー挿入の方がいいのでしょうか?
よろしくお願いします。



182 名前:デフォルトの名無しさん mailto:sage [2012/02/12(日) 00:28:06.43 ]
>>181
図形の生成はマクロでやってる?
そうならコピペせなんでも生成時のアドレス変えてもう一つ作ればいいんじゃ?
もし、マクロで生成したものでない図形を〜って話なら
図形のプロパティでセルの移動とかにあわせて大きさを変えないようにすればいけるかと。
ペースト先セルの列の幅やら行の高さやらがコピー元と違うと大きさ修正されちゃうし。

183 名前:デフォルトの名無しさん mailto:sage [2012/02/12(日) 03:55:14.43 ]
エスパー(マクロでやってないな)

184 名前:デフォルトの名無しさん mailto:sage [2012/02/12(日) 14:52:49.17 ]
こんにつわ、他人から貰ったExcelファイルがどういうコードで動いてるか見るにはどうすればいいのじゃ?

185 名前:デフォルトの名無しさん [2012/02/12(日) 14:59:31.37 ]
>>184
Alt+F11

186 名前:デフォルトの名無しさん mailto:sage [2012/02/12(日) 15:19:23.68 ]
ありがとうちゃん

187 名前:129 [2012/02/12(日) 23:35:21.88 ]
>>137
全角文字、たとえば”あ”を&H82 + &HA0に変換する場合は
どうすればよいのでしょうか?
以下のように記述を比較してみましたが一致しませんでした
ご教授おねがいします。

msg = Chr(Asc("あ"))
msg2 = Chr("&H82") + Chr("&HA0")

188 名前:デフォルトの名無しさん mailto:sage [2012/02/12(日) 23:40:08.67 ]
>>187
MsgBox Hex(Asc("あ"))


189 名前:デフォルトの名無しさん [2012/02/12(日) 23:52:57.06 ]
他Bookに記述してるマクロを実行(あるいはSubやFunctionを呼び出し)することって
できる?
頻繁にやるのは望ましくない?

190 名前:デフォルトの名無しさん mailto:sage [2012/02/13(月) 00:22:53.83 ]
>>189
たとえばBook1.xlsmのThisWorkbookにあるsub testを呼び出すなら
Application.Run "Book1.xlsm!ThisWorkbook.test"
でできる
頻繁どころか、アドインでもない限り他ブックのマクロ実行させるのはまったく好ましくない

191 名前:デフォルトの名無しさん [2012/02/13(月) 00:23:18.72 ]
マクロでコントロールを状況に応じて増やしたいんだけど
そういうことってできる?

たとえば5と入力したら別Window(Form)を開いて
そこに5つのラベルとテキストボックスを挿入したいの。



192 名前:デフォルトの名無しさん mailto:sage [2012/02/13(月) 00:26:32.22 ]
なんでマルチポストすんの?

193 名前:デフォルトの名無しさん mailto:sage [2012/02/13(月) 00:57:04.90 ]
>>189
もちろんできる
複数のブックから使用するマクロを別ブックにしたり、
複数のブックのマクロを呼び出すメニュー用のブックを作ったり、
xlsxのファイルで使用するためのマクロを別ブックにしたり、
いろいろ

ExcelVBAの考え方としては、データを置くワークシートと、
プログラムを置く標準モジュールをどう配置するか


194 名前:187 [2012/02/13(月) 01:11:58.07 ]
>>188
ありがとうございます。

MsgBox Hex(Asc("あ"))  は 82A0と表示されましたが
MsgBox Hex(Asc(Chr(&H82) + Chr(&HA0))) が 8145になってしまいましたが
MsgBox Hex(Asc(Chr(&H82A0)) では 80A0と表示されたのでこちらとは一致させることができました。

全角文字の場合には &H80A0 のような書きかたが正しいのでしょうか?

しかし >>130 のコードで
”あいうえお”を検索したく
msg = Chr(&H82) + Chr(&HA0) + Chr(&H82) + Chr(&HA2) + Chr(&H82) + Chr(&HA4) + Chr(&H82) + Chr(&HA6) + Chr(&H82) + Chr(&HA8)
InStr(Text, msg)
とした場合には検索できるのですが
msg = Chr(&H82A0) + Chr(&H82A2) + Chr(&H82A4) + Chr(&H82A6) + Chr(&H82A8)
InStr(Text, msg)
のような書きかたをした場合には検索できませんでした。

”あいうえお” を検索する場合にはどういう書きかたをすればよいのでしょうか?

195 名前:デフォルトの名無しさん mailto:sage [2012/02/13(月) 02:04:05.27 ]
「あいうえお」と書かれたテキストファイルを
>>130のコードに突っ込めば直ぐ解る。

196 名前:187 mailto:sage [2012/02/13(月) 02:53:20.17 ]
>>195
きさま、舐めとんかゴルァ

197 名前:デフォルトの名無しさん mailto:sage [2012/02/13(月) 19:33:16.74 ]
保存ダイアログが出たときに、特定のフォルダーが出るように下記の様に
書いたのですが、Win7 32bitでは希望通りの動きなのですが、64bitだと
マイドキュメントが選択された状態で表示されてしまいます。

xlAPP.GetSaveAsFilename(InitialFileName:=SaveDir & FileName)

64bit版でも指定したフォルダーを選択状態にさせるにはどうすればいいですか?
よろしくお願いします。

198 名前:デフォルトの名無しさん mailto:sage [2012/02/13(月) 19:57:03.92 ]
すみません。
コピーし忘れがありました。
一度保存すると、その時のフォルダーを保存しておいて、2回目からは
SaveDirに記憶したフォルダーを選択するようにしています。

SaveaDir = CurDir

そのために上記の様にして記憶するようにしています。
(このスレを読んで参考にしました。)

32bit版は変数の中身が変わるのですが、64bit版ではブックを読みだしたフォルダーから
変更されない感じです。
よろしくお願いします。

199 名前:デフォルトの名無しさん mailto:sage [2012/02/13(月) 20:18:43.27 ]
>>198
省略しすぎ。もう少しコードを見せられないの?

200 名前:デフォルトの名無しさん mailto:sage [2012/02/13(月) 21:24:43.24 ]
>>197
ディレクトリだけ?
ファイル名は正しく表示されるの?

201 名前:デフォルトの名無しさん [2012/02/14(火) 15:30:51.13 ]
VBAについて質問させてください! OS Windows7 2003使ってます。

下記のプログラムでYAHOO競馬からラップタイムって物だけをダウンロードしてきてるんですが、今は
1Rづつしか持って来れてないんで、これを全レース(最大で1日36R)一回の作業でダウンロードしてくる
プログラムに直せませんか?

宜しくお願いいたします!

Sub test()
Dim ie As Object
Dim elements As Object
Dim i As Integer
Cells.Clear
Set ie = CreateObject("InternetExplorer.Application")
ie.Visible = True
ie.Navigate "keiba.yahoo.co.jp/race/result/1206010512/"
Do While ie.Busy Or ie.ReadyState <> 4: DoEvents: Loop
Set elements = ie.Document.getElementsByTagName("div")
For i = 0 To elements.Length - 1
If elements(i).innertext Like "ラップタイム*" Then
Set elements = elements(i).getElementsByTagName("td")
Exit For
End If
Next
For i = 0 To elements.Length - 1
Range("B" & i + 1).Value = elements(i).innertext
Next
ie.Quit
Set ie = Nothing
End Sub





202 名前:デフォルトの名無しさん mailto:sage [2012/02/14(火) 17:43:32.49 ]
>>197
& "\" &

203 名前:デフォルトの名無しさん mailto:sage [2012/02/14(火) 21:01:01.46 ]
>>197
32ビット版なので確認できないが、
64ビット版だとSaveDirに関係なくいつもマイドキュメントが開くってことか

Sub test()
Const FileName = "test.xlsx"
Const SaveDir = "C:\"
Dim fname

MsgBox CurDir
fname = Application.GetSaveAsFilename(InitialFileName:=SaveDir & FileName)
MsgBox CurDir

End Sub

204 名前:197 mailto:sage [2012/02/14(火) 22:05:33.85 ]
皆さん、レスありがとうございます。
どうも、CurDirの返り値が32bit、64bitで違うみたいです。
32bitの時は保存したり、読み出したりした時のフォルダーが返ってくるのですが、
64bitの時は読み出したフォルダーが返ってくるみたいです。

'保存
Save_NAME = xlAPP.GetSaveAsFilename(InitialFileName:=Save_Name)

'保存先フォルダー記憶
File_Name = Dir(Save_NAME)
Save_dir = Replace(Save_NAME, File_Name, "")

こんな感じでできるようになりました。

205 名前:デフォルトの名無しさん mailto:sage [2012/02/14(火) 22:07:08.20 ]
× Save_NAME = xlAPP.GetSaveAsFilename(InitialFileName:=Save_Name)
○ Save_NAME = xlAPP.GetSaveAsFilename(InitialFileName:=Save_dir)
です


206 名前:デフォルトの名無しさん mailto:sage [2012/02/15(水) 00:10:13.68 ]
>>201
いらん機能までゴテゴテ付けたら改行が多すぎるって怒られちったお

Sub test()
Dim ie As Object, elements As Object
Dim i%, url$, n%, y%, m%, d%, r%
Dim name As Variant
Dim flg As Boolean
Dim j As Variant
name = Array("札幌", "函館", "福島", "新潟", "東京", "中山", "中京", "京都", "阪神", "小倉")
url = "keiba.yahoo.co.jp/race/result/"
j = Application.InputBox("開催地、年月日をすべて2桁の数値で入力" & vbCrLf & _
"札幌=01,函館=02,福島=03,新潟=04,東京=05,中山=06,中京=07,京都=08,阪神=09,小倉=10", "下記の順にデータを入力してください", , , , , , Type:=2)
If j = False Then Exit Sub
If Len(j) <> 8 Then Exit Sub
n = Left(j, 2): y = Mid(j, 3, 2): m = Mid(j, 5, 2): d = Mid(j, 7, 2)
With ThisWorkbook.Sheets(1)
.Cells.Clear
.Cells(1, 1) = y & "年" & m & "月 " & name(n - 1) & d & "日目"
For i = 1 To 11
.Cells(1, 1).Offset(i).Value = "^" & i * 200
Next i
Set ie = CreateObject("InternetExplorer.Application")
ie.Visible = True


207 名前:206の続き mailto:sage [2012/02/15(水) 00:10:51.20 ]
For r = 1 To 37
flg = False
ie.navigate (url & y & Format(n, "00") & Format(m, "00") & Format(d, "00") & Format(r, "00") & "/")
Do While ie.Busy Or ie.readyState <> 4: DoEvents: Loop
Set elements = ie.document.getElementsByTagName("div")
For i = 0 To elements.Length - 1
If elements(i).innerText Like "ラップタイム*" Then
flg = True
Set elements = elements(i).getElementsByTagName("td")
Exit For
End If
Next i
If Not flg Then
.UsedRange.EntireColumn.AutoFit
Exit For
End If
For i = 0 To elements.Length - 1
.Cells(1, 1).Offset(, r).Value = r & "R"
.Cells(2, 1).Offset(i, r).Value = elements(i).innerText
Next i
Next r
Set elements = Nothing
ie.Quit
Set ie = Nothing
End With
End Sub


208 名前:206 mailto:sage [2012/02/15(水) 00:15:06.33 ]
個人的には
ie.visible=true
はFalseのほうが画面の切り替えがなくて好きだけど、
非表示にしとくとIEのアクセスでエラーが出てるときの
エラーメッセージも表示されなくなるんだっけ?

209 名前:206 mailto:sage [2012/02/15(水) 00:19:14.69 ]
連投スマソ
入力する年月日のうち、日は日付じゃなくて開催何日目かなので
そこんとこよろしく
(たとえば、06120105は中山競馬場、2012年1月の開催5日目の意味)

210 名前:デフォルトの名無しさん mailto:sage [2012/02/15(水) 00:31:34.64 ]
それだと一つの競馬場で36レースやらないと全レースのデータは拾えないんじゃね?
多分、一つの競馬場では1日に12レースしかやらないと思うよ。
同じ日に最大で3カ所開催するから3*12で36レースってことじゃないかな?

211 名前:206 mailto:sage [2012/02/15(水) 00:54:42.24 ]
>>210さん
えーと、
ご指摘ありがとうございます・・・orz
私は競馬やったことないんで知りませんでした。

そうすると、開催地の変更もループ処理に掛けないといけないですね。

でも、ちょっと調べたところ、
keiba.yahoo.co.jp/schedule/list/2012/?month=1
ここを見たら同じ日でも場所によって開催何日目かがまちまちなので、
単純に場所だけを変えても上手くいかなそうです。
(データを取り込むURLが
[年][場所][月][開催何日目][何レース]の組み合わせですので、
日付から開催日を知る方法がないとすべてのデータが取り込めません。)
同じ日に開催する場所や日数に何か規則性があるなら良いのですが、
私は競馬のことをよく知らないので見当も付きません。
力不足で申し訳ないです。




212 名前:デフォルトの名無しさん [2012/02/15(水) 02:52:59.70 ]
皆さんホントこんな初心者の為に考えてくださってありがとうございます!

何か別な方法考えてみます!

213 名前:デフォルトの名無しさん mailto:sage [2012/02/15(水) 03:05:01.57 ]
>>212
丸投げじゃなく自力でがんばってみる気があるなら

keiba.yahoo.co.jp/schedule/list/2012/?month=1
↑のページからURL情報を取得すればできると思うぞ

開催年と開催月 は↑のURL にあるし
開催日はページ内にあるから対象日の 開催名のリンク先URLを取得して
レースNoを付加してやればいいと思う






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<296KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef