11/11/27 22:36:18.78
01 スレリンク(tech板)
02 スレリンク(tech板)
03 スレリンク(tech板)
04 スレリンク(tech板)
05 スレリンク(tech板)
06 スレリンク(tech板)
07 スレリンク(tech板)
08 スレリンク(tech板)
09 スレリンク(tech板)
10 スレリンク(tech板)
11 スレリンク(tech板)
12 スレリンク(tech板)
13 スレリンク(tech板)
14 スレリンク(tech板)
15 スレリンク(tech板)
16 スレリンク(tech板)
17 スレリンク(tech板)
18 スレリンク(tech板)
19 スレリンク(tech板)
20 スレリンク(tech板)
前スレ:
Excel VBA 質問スレ Part21
スレリンク(tech板)
2:デフォルトの名無しさん
11/11/27 22:37:24.79
ExcelのVBAに関する質問スレです
★1 質問テンプレ(雛形)は用意しませんが、OSとExcelのバージョンは必ず書きましょう。
★2 ExcelのVBA以外の部分に関する質問はNGです。
但し、VBA無しでも出来ることだが、あえてVBAでやりたいって物に関してはOK。
★3 ExcelのVBE(Visual Basic Editor)を使うとしても、VBAの分野以外に関してはスレ違いです。
VBAとは、『Visual Basic for Application』の略で
Application
├Workbooks
|└Workbook
| ├Worksheets
| |└Worksheet
というApplication以下のオブジェクトを、VB言語で操作するものを指します。
例えExcel付属のVBE(Visual Basic Editor)を利用しようとも、このApplication以下のブックやシート、
セルやオブジェクト等を操作するもの以外はVBA分野の話ではないので、ここでは聞かないでください。
★4 とりあえず、Excelのインスタンスを作らずにVB6で出来ることは全てスレ違いだと思ってください。
★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み、
コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。
ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。
★6 わからなければとりあえず「マクロの記録」(Alt, T, M, R)
3:前スレ980
11/11/27 22:40:56.31
初めてスレたてた。
URLとかテンプレとか間違ってたらごめん。
あと、話を遮って質問したけども、関係ない話はやめたほうがいい。
だって、俺がスレたてなきゃいけなくなtt(ry
4:デフォルトの名無しさん
11/11/27 23:19:04.69
>>1 乙
5:デフォルトの名無しさん
11/11/27 23:22:10.17
>>1乙
前スレの最後はうんこくんが荒らして大変だったねw
ILの直腸注入だったっけ
6:デフォルトの名無しさん
11/11/27 23:27:38.33
まだ、粘着してるよ。
スルー推奨 >> 各位
7:デフォルトの名無しさん
11/11/27 23:28:32.99
愛の直腸注入に付いては俺も聞きたいが
また荒れるからやめとけ
8:デフォルトの名無しさん
11/11/27 23:55:43.05
名前って値が増えても自動で拡張できないけどこれVBA使えばできるよね
やり方教えてくれ
A
1 100
2 200
3 300
ここで、A1~A3に「表1」という名前をつける
つぎにA4に、400という数値を入力すると
A1~A3の範囲だった「名前:表1」が自動的に「A4」まで拡張される
みたいなことやりたいんだけどどうやればいい?
9:デフォルトの名無しさん
11/11/28 00:20:00.95
セルの入力イベントで
名前の範囲をカレントリージョンのものに付け直せば?
10:デフォルトの名無しさん
11/11/28 00:31:53.27
>>8
Private Sub Worksheet_Change(ByVal Target As Range)
Dim r As Range
Set r = ActiveWorkbook.Names("表1").RefersToRange
If r.Column = Target.Column And r.Row + r.Rows.Count = Target.Row Then
ActiveWorkbook.Names("表1").RefersTo = "=" & Target.Worksheet.Name & "!" & r.Resize(r.Rows.Count + 1).Address
End If
End Sub
とりあえず適当に書いてみた
下に一つ増えるだけ。複数貼り付けとかどうなるかしらん
Worksheet_Changeイベントで、てきとうに範囲決めて、Names().RefersToで設定するだけ
すきな用に直してくれ
11:デフォルトの名無しさん
11/11/28 04:51:18.01
前スレで以下の質問をしたものなのですが
> 変数 X に例えばA1~A20の数値の和、合計を入れたいのですが。
という質問をして
> X = WorksheetFunction.Sum(Worksheets("Sheet1").Range("A1:A20"))
というアドバイスをいただいたのですが、この一文を経過したあとで、
ファンクションプロシージャで定義された語句を使うとエラーか、上手く作動しなく
なってしまうのですが、なにかそのようなルールがあるのでしょうか?
12:デフォルトの名無しさん
11/11/28 07:25:32.21
質問です。
Offset(,1)とOffset(0,1)ではどちらが一般的でしょうか?
13:デフォルトの名無しさん
11/11/28 07:30:48.54
>>11
うーん。
状況が見えないから何とも言えないけど、
①何か別に理由がある。
②合計対象セル範囲に足せない文字列とかが含まれている。
③合計対象セル範囲がシート枠を超えている。
④ILとの直交性
あたりが原因なんじゃないかな。
14:デフォルトの名無しさん
11/11/28 07:39:44.44
>>12
そこを省略しちゃうと、Offset知らない人に
NullやVbNullString辺りが入ることが許されるのか、
勝手に0が入るのかコードから見て取れないから、
前者は余り一般的とは呼べないと思う。
一般的、可読性が高いのは後者じゃない?
15:デフォルトの名無しさん
11/11/28 11:15:08.97
>>12
俺は0は書かないな。
こんな簡単なものに可読性もへったくれもないと思うし。
ところで省略を嫌う人ってResizeで
With Range("A1").Currentregion
.Resize( ,2)
End With
これを下のように略さずに書くのかな?
With Range("A1").Currentregion
.Resize(.Rows.Count ,2)
End With
16:デフォルトの名無しさん
11/11/28 11:30:47.07
>>8
Excelのバージョンは?
2007以降ならテーブル(構造化参照)使えばいいんじゃないの?
17:デフォルトの名無しさん
11/11/28 12:16:00.19
「仕事に役立つ ExcelVBA実用サンプルコレクション」の本は大人気。
amazonの中古で売れに売れて、もう高額の出品者からしか買えなくなりました。
すでにレアものです。
18:デフォルトの名無しさん
11/11/28 13:15:28.02
>>12,14,15
一般的って意味が、どう書く人が多いかって話なら
Offset(,1)やResize( ,2) って書く人が多いと思う
可読性に関して言えば、省略しない方が高いのはたしかではあるが
どっちにしろOffsetやResizeが何をするか、引数は何かが解らないと使えないので
大差がないと言えばまあその通り
だがたとえばこの例だと、Offsetは省略した値は0だけど、Resizeは省略した値はゼロではない
俺ならOffsetは0であることを明示的に示しときたいので省略しない
Resizeは変更しないことを明示的に示しときたいので、あえて書かない
19:デフォルトの名無しさん
11/11/28 17:53:47.27
>>17
新装版あるけど
20:17
11/11/28 19:39:03.82
>>19
新装版のことを言っておるにょだ
21:デフォルトの名無しさん
11/11/28 21:54:24.65
Dim s(0) as String
s(0) = "aaa"
Debug.Print s(0)
これがなぜ通るのか理解できません。
22:デフォルトの名無しさん
11/11/28 22:08:26.22
>>21
どこがどう問題だと思うの?
23:デフォルトの名無しさん
11/11/28 22:15:17.18
>>22
どこがどう問題と思ってると思う?
24:デフォルトの名無しさん
11/11/28 23:29:09.18
>>23
C言語に置き換えたらなんとなくわかるんじゃないか?
25:デフォルトの名無しさん
11/11/28 23:32:05.60
C言語の配列は個数を指定する
VBAの配列はインデックスの最大値を書く
Dim s(1)だとs(0)とs(1)の2個になる
26:デフォルトの名無しさん
11/11/28 23:32:32.36
>>17
つい、今確認したけど、普通に、Amazonで定価で買えるよ。
Amazonでは、常に人気書籍を定価以上の価格で出品している業者が張り付いている。
普段は売れないけど、たまたまAmazonの在庫が切れたときにアクセスして、、
「まずい、もうレアものになってしまったんだ」って勘違いして買う人が居るからだって。
27:デフォルトの名無しさん
11/11/29 00:42:34.48
>>26
そうでしたか。
それはすばらしいです。
ところでVBAじゃなくExcelの関数のほうも
こういうサンプルがた~くさん載ってる実用的な本は
ないものでしょうか?
28:デフォルトの名無しさん
11/11/29 07:58:26.67
>>25
ありがと、やっぱそうなのか。ググっても"要素数を指定"って書いてるのが多くて悩んだ。
久しぶりにVBA触ると色々謎仕様に直面して驚く。
29:デフォルトの名無しさん
11/11/29 17:54:00.68
一つのボタンで、画像と曲を変えていくものを作りたいです。
画像の部分はできたけれども、曲がだめぽ。
Dim cnt As Integer
Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long
Private Const FILE_NAME As String = "C:\menu.mp3"
Private Sub UserForm_Initialize()
cnt = 1
ImageChange
musicChange
End Sub
Private Sub CommandButton1_Click()
ImageChange
musicChange
End Sub
Private Sub ImageChange()
On Error Resume Next
With Worksheets(1)
If cnt > .OLEObjects.Count Then cnt = 1
Image1.Picture = .OLEObjects("Image" & cnt).Object.Picture
cnt = cnt + 1
End With
End Sub
Private Sub musicChange()
If cnt = 1 Then
Call mciSendString("play """ & FILE_NAME & """", "", 0, 0)
Else
Call mciSendString("close """ & FILE_NAME & """", "", 0, 0)
End If
End Sub
曲はここから入れ子にしたいのだけど、最初の曲が流れない・・・
30:デフォルトの名無しさん
11/11/29 19:15:51.93
cntが初期値1でImageChangeで+1されてからmusicChangeを呼び出してる
つまりcnt=1でmusicChangeを呼び出すことはないわけだが
31:デフォルトの名無しさん
11/11/29 21:31:14.11
Private Sub musicChange()
If cnt = 2 Then
Call mciSendString("play """ & "C:\アンパンマン.mp3" & """", "", 0, 0)
Else
Call mciSendString("close """ & "C:\アンパンマン.mp3" & """", "", 0, 0)
End If
If cnt = 3 Then
Call mciSendString("play """ & "C:\カレーパンマン.mp3" & """", "", 0, 0)
Else
Call mciSendString("close """ & "C:\カレーパンマン.mp3" & """", "", 0, 0)
End If
・・・以下 cnt=7 まで
End Sub
>>30 ありがとー。ちゃんと見直したらうっかりだった。
で、このif文。うーん、確実にmp3をクリックで消すのでこの処理だけど
もっとスマートにならんかのー。
32:デフォルトの名無しさん
11/11/29 21:39:18.52
ファイル名を配列に突っ込んでおけばいいじゃない。
んで、ループで回してcntに一致している奴だけplayで後は全部close。
33:デフォルトの名無しさん
11/11/29 21:42:18.96
初心者です。
実行時エラー1004が出ます。
どこを直せばいいのか教えてください。
windows7/excel2010
Sub SetRows()
With Worksheets("Sheet2")
.Activate
.Range(Cells(2, 2), Cells(5, 5)).EntireRow.Value = "hoge"
End With
End Sub
34:デフォルトの名無しさん
11/11/29 21:45:14.47
Cellsの出所が怪しいな。
35:デフォルトの名無しさん
11/11/29 22:53:27.13
>>33
標準モジュールに書いてれば糞コードだけど一応それで動くはず。
Sheet2以外のシートモジュールに書いてあればRangeとCellsの親(シート)が違うので動かない。
正しくは
Sub SetRows()
With Worksheets("Sheet2")
.Range(.Cells(2, 2), .Cells(5, 5)).EntireRow.Value = "hoge"
End With
End Sub
とCellsにもシートの修飾をつける。
36:デフォルトの名無しさん
11/11/29 23:39:35.49
>>35
なるほど、なるほど
ありがとうございます!!
Sheet2以外のシートモジュールに書いてます。
インターネットのサイトを見て勉強し始めた段階なので
糞コードなのは申し訳ないです。
勉強になりました!
37:デフォルトの名無しさん
11/11/30 22:44:11.50
VBAの入力補完機能だっけ?(Ctrl+Spaceのヤツ)
自分で定義したConstなどなどが
入力補完されることに今更気がついた。
しかも標準モジュールにつけた名前なんかも
入力補完の対象なのね。
処理時間は落ちるかもしれないけど、
標準モジュール名.モジュール名~などで
明確に定義付けすると意味が通ってメンテが楽になりそう。
38:デフォルトの名無しさん
11/12/01 10:32:45.43
VBAからデスクトップ上などになるtxtファイルの中身を操作(文字列の追加・書き換え・削除)することは可能ですか?
39:デフォルトの名無しさん
11/12/01 13:45:12.97
可能
40:38
11/12/01 15:48:27.73
どうするのかを聞いておるのだ、アホ
41:デフォルトの名無しさん
11/12/01 15:53:42.14
>>40
VBAでそういうコードを書けば良い
OK?
42:デフォルトの名無しさん
11/12/01 16:48:51.03
>>38 は可能かどうかを聞いてるだけだが? アホ?
43:デフォルトの名無しさん
11/12/01 22:06:18.25
ここはあえてOPENステートメントを推してみる。
How meny files? な世界も偶には良いよね。
44:デフォルトの名無しさん
11/12/01 22:28:00.06
Windows Script Host Object Modelへ参照設定して
Dim DesktopPath As String
Dim ShellObject As IWshRuntimeLibrary.WshShell
Set ShellObject = New IWshRuntimeLibrary.WshShell
DesktopPath = ShellObject.SpecialFolders("Desktop")
これでデスクトップのパスは得られるから、後は好きなようにやればよろし
45:デフォルトの名無しさん
11/12/02 00:53:27.34
FileSystemObject使ってファイルパスとってきてそれを開いてあなた色に染めてから閉じる
46:デフォルトの名無しさん
11/12/02 12:00:59.07
テキストファイルに色を付ける方法kwsk
47:デフォルトの名無しさん
11/12/03 11:02:53.92
そういうのスレ違いって>>2に書いてあるよ
48:46
11/12/03 11:15:11.77
そんなこと言わずに教えれ
49:デフォルトの名無しさん
11/12/03 15:46:49.14
>>48
これお勧めだよ。
URLリンク(ec2.images-amazon.com)
50:デフォルトの名無しさん
11/12/04 00:43:59.63
 ̄ ̄ ̄ ̄ ̄ ̄ ̄l/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
∧_∧
( ´・ω・`) ∧_∧
/ \ ( )何言ってんだこいつ
.__| | .| |_ / ヽ
||\  ̄ ̄ ̄ ̄ / .| | |
||\..∧_∧ (⌒\|__./ ./
||. ( ) ~\_____ノ| ∧_∧
/ ヽ 空気読めよ \| ( )
| ヽ \/ ヽ. オマエ馬鹿だろ
| |ヽ、二⌒) / .| | |
.| ヽ \∧_∧ (⌒\|__./ /
51:デフォルトの名無しさん
11/12/04 03:36:25.49
VBAで日付のシリアルの変数はIntegerで保管しておいて良い?
あるいはLongにしないとだめ?
あらまDate型もあるのね。絶対にDateにしないとだめ?
52:デフォルトの名無しさん
11/12/04 08:00:58.14
>>51
用途による
IntegerでもByteでもお好きな型をどうぞ
2011/12/4はシリアル値だと40881だけど、必要な範囲はプログラムの作者にしかわからないから
53:デフォルトの名無しさん
11/12/04 09:46:54.70
>>52
Integerだと32000位までじゃなかったか?
54:デフォルトの名無しさん
11/12/04 10:45:24.69
NumberFormatとNumberFormatLocalの違いは
なんですか?
55:デフォルトの名無しさん
11/12/04 11:08:24.36
activecell.offset(1,0).select
activecell=10
activecell.offset(1,0).activate
activecell=10
これ結果は同じですよね?どちらがどういう理由で好ましいですか?
56:デフォルトの名無しさん
11/12/04 11:23:59.67
>>54
NumberFormatLocalプロパティ
使用中のWindowsの国別情報に従った言語の書式記号が表示される
NumberFormatプロパティ
Exel既定の言語(英語)に従った言語の書式記号が表示される
基本、NumberFormatLocalを使っておけばOK
57:デフォルトの名無しさん
11/12/04 11:26:58.13
>>56
なるほどよくわかりました。
Localは地球の地域という意味でのlocalだったんですね。
Thank you.
58:デフォルトの名無しさん
11/12/04 14:20:50.44
時間を変数にするときも型はdateでOK?
あと、date型に日付だけを代入して使ってるときって時間の情報もたとえば0:00:00みたいなのがダミーで入ってるの?
逆の場合も疑問。(時間を代入したときは日付も入ってる?もしそうならそのときの日時は?)
59:デフォルトの名無しさん
11/12/04 14:25:25.95
やりたいようにやれよ
いちいち他人に聞いてたら
出来るもんも出来んよ
60:デフォルトの名無しさん
11/12/04 17:33:23.31
>>58
> あと、date型に日付だけを代入して使ってるときって時間の情報もたとえば0:00:00みたいなのがダミーで入ってるの?
> 逆の場合も疑問。(時間を代入したときは日付も入ってる?もしそうならそのときの日時は?)
なぜ試さん?
61:58
11/12/04 17:38:50.35
みんなのVBA力と回答力を試しているんですが
62:デフォルトの名無しさん
11/12/04 17:45:44.12
>>61
VBA力とか言ってる時点でみんなより自分が格下なのに気付けよ
63:58
11/12/04 18:27:48.04
わからないなら無理にレスしてくれなくていいよ?
64:58
11/12/04 19:36:00.70
>>63
こら、それはオレのセリフだ
ニセモノめが
65:デフォルトの名無しさん
11/12/04 21:03:36.56
ここまでおれのじえん
66:デフォルトの名無しさん
11/12/04 21:15:48.15
ツマンネ
67:デフォルトの名無しさん
11/12/05 15:49:51.74
セルに色が塗ってて、
その色をRGB(x,y,z)で表すときのx,y,zの値を取得するにはどうすればいい?
68:デフォルトの名無しさん
11/12/05 15:59:54.97
>>67
C = Range("A1").Interior.Color
R = C And &HFF
G = (C \ &H100) And &HFF
B = (C \ &H10000) And &HFF
69:デフォルトの名無しさん
11/12/05 23:11:21.16
スレ違いでしたらごめんなさい
Excelを用いてオークションのシミュレーションをしたいのですが、そのためには何について学ぶべきですか?
参考となる書籍やサイトをご存知でしたら教えていただきたいです
現在、どうやらExcelでオークションのシミュレーションができそうだ、ということを知ったレベルです
よろしくお願いします。
70:デフォルトの名無しさん
11/12/05 23:46:22.60
>>69
Sub オークションシミューション()
Dim a As Integer
a = Int(Rnd * 100 + 1)
If a <= 20 Then
ActiveCell = "あなたは入札に性交しました"
Else
ActiveCell = "あなたは入札に失敗しました"
End If
End Sub
71:デフォルトの名無しさん
11/12/05 23:54:05.05
>>69
> Excelでオークションのシミュレーションができそうだ、ということを知った
どこで知ったのか知らんけど、そこで聞けよ。
72:デフォルトの名無しさん
11/12/06 00:19:38.14
>>71
それはExcelでシミュレーションをできるということを知って、自分のやろうとしてることも恐らくできるだろうと判断しました
どこかの掲示板で聞いた、というわけではないんです
73:デフォルトの名無しさん
11/12/06 00:25:40.24
>>72
> Excelでシミュレーションをできるということを知って
だから、どこで知ったんだよ。
て言うか、他人と会話したことないのか?
74:デフォルトの名無しさん
11/12/06 01:00:52.64
>>69
まずオクのシミュレーションはどんな作りにしたいのかをフローにして、
その後VBAでどう言ったコードにすればいいかを
考えればいいんじゃないかな
75:デフォルトの名無しさん
11/12/06 01:21:45.52
>>74
何から手を付ければいいかわからなかったので、とても参考になりました
ありがとうございます
76:デフォルトの名無しさん
11/12/06 12:27:07.14
ネットワーク上の共有フォルダにアクセスしたいんですが
VBAからネットワーク認証を行うにはどうすればよいのですか?
77:67
11/12/06 13:35:25.49
>>68
あなた頭いいですな
脳ミソ詰まってる
わたしにも分けてくれ
78:デフォルトの名無しさん
11/12/06 21:38:46.64
別シートを操作するとき、そのシートをactivateしないとできないんだっけ?
でもできることもあるみたいだし。
でもそれを忘れてるか気にしないでいるとエラーが出ることもある。
どなたかこのしくみはどうなってるか教えてくれませんか?
非常に困っております。
79:デフォルトの名無しさん
11/12/06 21:55:14.09
Excelで実際に操作するのと同じ様に使えばほぼ問題は無い。
でも、同じ操作で無くてもある程度は融通が利くよ。
って感じじゃね?
うまく動かなくて困ったら実際の操作を真似させる、で十分かと。
深く悩んだところで、MSの中の人すら完全に理解しているかどうか怪しいし。
80:デフォルトの名無しさん
11/12/06 22:39:11.97
>>78
特定のシートオブジェクトを明示的に取得して、activate せずに、そのシートに対して操作することは可能
activate しないと使えない機能もあるが、どちらかというとレアじゃないかと思う
問題はマクロの記録とかで記録したコードについては activate前提のコードの書き方になっているということで、
記録したコードをそのまま使い回したいなら、アクティベートしたほうが無難だとは思う
81:デフォルトの名無しさん
11/12/06 23:47:01.44
個人用マクロブックを作ったら
Excelを[X]で閉じようとしたときに
2回ボタンを押さないといけなくなりやがった。
これを防ぐ方法ある?
82:デフォルトの名無しさん
11/12/07 06:47:38.01
最近vbaの勉強始めた
大村あつしさんの参考書使ってる
4月までには使えるようになりたい
プロ野球の選手成績を管理したいんだ
野球ゲームの成績まとめでも使いたいし
83:デフォルトの名無しさん
11/12/07 08:39:20.32
>>81
なんてメッセージ出てんの?
84:デフォルトの名無しさん
11/12/07 19:26:41.10
>>83
メッセージはなにも出ないんだ。
みんなも個人用マクロブックを作ってたらそうなってるんでしょ?
85:デフォルトの名無しさん
11/12/07 19:27:27.27
>>82
スレリンク(gamespo板:14-番)
あなたはこの人ですか?
86:デフォルトの名無しさん
11/12/07 20:52:36.60
>>78
activateしないとできないのは、copyメソッドとかpastespecialメソッドとかでしょ
他にもあったっけ
なぜできないのか、この辺の理屈がどうも分からないんだよな~
87:デフォルトの名無しさん
11/12/07 21:12:04.89
Pasteメソッドが、シートに対して行うというのも理解できない。
なぜそういう仕様になってるかおわかりのかたいらっしゃいますか?
88:デフォルトの名無しさん
11/12/07 23:17:29.91
お知恵を拝借させてください。
下のように右クリックメニューから選択範囲のセルを塗りつぶす、みたいなことがしたいのですが、
「引数は省略できません。」のエラーになります。
どうすれば引数(例:34)を渡せますでしょうか?
Sub addMenu()
Dim CB
Set CB = Application.CommandBars("Cell").Controls.Add()
With CB
.Caption = "塗りつぶし"
.OnAction = "setColor(34)"
End With
End Sub
Sub setColor(col As Long)
With Selection.Interior
.ColorIndex = col
End With
End Sub
89:デフォルトの名無しさん
11/12/08 00:05:42.28
>>88
パージョンいくつ?
.OnAction = "'setColor(34)'"
又は
.OnAction = "'setColor 34'"
じゃないかな?(シングルクウォートで括る。)
ちなみに複数の引数を渡したい時は、自分の知ってる限りでは
.OnAction = "'setColor 34,4'"
とかでうまくいくハズ
90:デフォルトの名無しさん
11/12/08 02:25:45.46
>>87
仕様の理由はわからんけど、動作見る限りエクセルVBAって
人が操作する動作をトレースしてるだけだから
手動で出来ないことはVBAでも出来ないってコトでいいんじゃね?
だからコピーもペーストもシートをアクティブにしないと出来ないと。
91:デフォルトの名無しさん
11/12/08 09:27:07.74
>>90
VBの機能も使えるから出来ることは同じじゃない
92:デフォルトの名無しさん
11/12/08 12:48:05.58
>>86,90
Sub test()
Sheet2.Activate
With Worksheets("Sheet1")
.Range("C1:C5").Copy
.Range("D1:D5").PasteSpecial _
Operation:=xlPasteSpecialOperationAdd
.Paste (.Range("E1:E5"))
End With
End Sub
別にシートがアクティブじゃなくても使えますが?
>>87
(この場合の)Pasteメソッドがシートのメソッドなんだから対象がシートなのはまあ当然
RangeにPasteメソッドが無い理由なら解らん。PasteSpecialはあるのにな
どうせ操作対象をちゃんと指定してないから、アクティブシートが対象になってるだけだろ
アクティブじゃないとできない操作の実例教えてくれ
93:デフォルトの名無しさん
11/12/08 14:00:27.28
Activateが必要だと思ってる奴はド素人
94:デフォルトの名無しさん
11/12/08 19:50:51.44
どうせExcelのバージョンで挙動が違うとかいうオチだろ。
実際に使われる環境で正しく動けば、それで良いじゃん。
95:デフォルトの名無しさん
11/12/08 22:05:52.74
>>89
できました!ありがとうございました。
バージョンは2003と2007です。
96:デフォルトの名無しさん
11/12/08 22:14:25.21
さまざまな処理を各プロシージャが担当させるようにし
本体プロシージャはシンプルそのもの、
そしてプロシージャから他のプロシージャを呼び出しまくるような
かっこいいプログラミングがしたいです。
そんなスキル (=プロシージャを呼び出しまくるスキル) を学ぶに特化した学習用の本があれば紹介していただけますか?
97:デフォルトの名無しさん
11/12/09 06:29:49.64
最近学習を始めたばかりの初心者です
わからないことがあったので質問させてください
VBAを使って
1、2500、5000、7500
の4つの数字をランダムで選ぶ
そしてこの動作を繰り返す
というプログラムはどうやって書けば良いのでしょうか
よろしくお願いします
98:デフォルトの名無しさん
11/12/09 06:43:25.56
丸投げいくない
99:デフォルトの名無しさん
11/12/09 06:54:05.47
>>98
すいません
できるか出来ないかだけでも教えていただけますか?
この4つをMT乱数を用いて選び出したいんです
そしてこの試行を繰り返す、という動作です
100:デフォルトの名無しさん
11/12/09 07:12:39.98
数字を配列変数に代入
乱数を取得
乱数の3の余剰を求める
前記余剰を配列番号に与えてアタイを撮る
101:デフォルトの名無しさん
11/12/09 07:17:25.61
数字を配列変数に代入
乱数を取得
乱数の3の余剰を求める
前記余剰を配列番号に与えてアタイを撮る
アタイをLogに出力
の上記をひたすら気が済むまでLoopする
102:デフォルトの名無しさん
11/12/09 07:46:34.64
>>97
0~3もしくは1~4の整数の乱数の出し方知ってる?
配列(0)に1
配列(1)に2500
配列(2)に5000
配列(3)に7500
に入れておいて0~3の乱数で3が出たら配列(3)の値を取得すればいい。
配列が分からなければCellsを使ってもいいだろう。
そんときゃA1~A4に希望する数値を入れて1~4の乱数を求め4が出たらCells(4,1)の値を取得すればいい。
最近は配列に入れないでCollectionに入れるDQNがいるけど。
103:デフォルトの名無しさん
11/12/09 07:52:19.50
>>99
もちろん「できる」
ところでVBAの乱数って内部アルゴリズムは公開されてたっけ?
MT乱数の使用が必須条件なら自分で乱数発生プログラムも書く必要があるかも
104:デフォルトの名無しさん
11/12/09 08:03:45.92
MT乱数 VBA
で
ヤホーでググればたくさん落ちてる
ちなみにワシは100-101だが
ボケてた。
3の余剰じゃなくって4の余剰だ
105:デフォルトの名無しさん
11/12/09 08:06:06.37
みなさんありがとうございます
C言語の基本的なことはわかるので、配列で出来そうです
乱数は自分でプログラム書かなくても大丈夫だったような……
わからないことだらけなのでまた質問することもあるかとは思いますが、その時はよろしくお願いします
今回は皆さんのおかげで解決出来ました
ありがとうございます
106:デフォルトの名無しさん
11/12/09 09:09:25.31
>>105
C言語の基本なことがわかってる奴が >>97 みたいな質問するのか?
と、思った奴は俺だけじゃないと思う。
107:デフォルトの名無しさん
11/12/09 10:43:42.62
>>103
正式には公開されてないけど、どこかで解析されてたぞ。
MT乱数ならExcelで使えるdllがある。
なんか64bitのWindowsでは使えないみたいだが。
PtrSafeかましてもうまくいかん。
108:デフォルトの名無しさん
11/12/09 10:46:17.93
うまくいかんのは64bitのExcelだった。
109:デフォルトの名無しさん
11/12/09 20:35:25.18
VBA上だと変数のビット数が足りなくて完全なMTは実装できないとかなんとか
110:デフォルトの名無しさん
11/12/09 21:43:02.26
'This is the Visual Basic for Applications (VBA) version of the MT19937ar,
'or "MERSENNE TWISTER" algorithm for pseudo random number generation,
'with initialization improved, by MAKOTO MATSUMOTO and TAKUJI NISHIMURA,
'of 2002/1/26.
'This translation to VBA was made and tested by Pablo Mariano Ronchi (2005-Sep-12)
URLリンク(www.math.sci.hiroshima-u.ac.jp)
111:デフォルトの名無しさん
11/12/10 01:13:56.71
>>106
すいません
実はVBA触るのは今回が初めてでなにが出来てなにが出来ないのかがまるでわかってないんです
基本Cと同じく考えて良いんですかね
112:デフォルトの名無しさん
11/12/10 01:31:07.91
>>111
まじめにCが普通に使える奴なら、VBA はマージン見ても一週間もあれば
それなりに使えるようになると思う。
ポインタは使えない (異論ある人もいるだろうけど、あえて言い切る) けど、
構造体もあるし、似たようなもんだと思っていい。
113:デフォルトの名無しさん
11/12/10 01:48:34.83
>>112
Cが使えるか?と言われると中々自信が無いですけどね
基本は学んだことがあるので、コードを見てなにが書いてあるか位なら何となくはわかるかと
おかげで少しやる気がでました
とりあえずやりたいことに関する参考書でも探してみようと思います
114:デフォルトの名無しさん
11/12/10 10:31:40.78
>>113
> コードを見てなにが書いてあるか位なら何となくはわかるかと
自分で書いたことはないってこと?
読めるのと書けるのの間はそれなりにある (例えば小説考えればわかるでしょ) ので、
一週間じゃ難しいかも。
幸いなことに VBA はネットにも本屋にも山ほど情報はあるから、じっくりがんばれ。
115:デフォルトの名無しさん
11/12/10 12:09:19.41
>>109
そんなわけあるか
「多倍長」でぐぐれ
116:デフォルトの名無しさん
11/12/10 12:10:05.05
文章と違ってコードは書くより読む方が難しいと思うんだけどなあ
117:デフォルトの名無しさん
11/12/10 12:35:07.22
大は小を兼ねるから
変数の型は
integerやlongやは使わず
すべてdoubleにしていいですか?
118:デフォルトの名無しさん
11/12/10 12:54:57.60
整数使いたいの?小数使いたいの?どっち?
119:デフォルトの名無しさん
11/12/10 12:58:11.55
>>117
プログラムが複雑になってくると、最小限に切り詰めた方が計算は速くなるんだけど
そういう質問をするレベルなら大したプログラムは作らんだろうから、たぶん大丈夫
120:デフォルトの名無しさん
11/12/10 13:03:28.16
すべてVariant使えばいいじゃん
121:デフォルトの名無しさん
11/12/10 14:11:46.85
>>116
>文章と違ってコードは書くより読む方が難しいと思うんだけどなあ
読むと言う意味が違うんじゃない?
俺は、例えば I = I + 1 がどういう動作かわかるのを読むと言ってて、
貴方はプログラム全体がどういう動作するかをl理解することを読むと
言ってるんじゃない?
122:デフォルトの名無しさん
11/12/10 15:52:32.15
そういえば変数じゃなくて定数は型宣言しなくていいんだっけ?
いま手元にあるVBAの本には定数のことについての説明が1ページもない。
変数は
Dim a as Integer
だけど、
定数は
Const a=3.14
みたいな感じ?
それとも
Const a as Double = 3.14
みたいに書くんだっけ?
123:デフォルトの名無しさん
11/12/10 16:43:38.17
↓自分で作って動かしてるもの w
Public Const shisuu As Integer = 0
Public Const sakimono As Integer = 4
124:デフォルトの名無しさん
11/12/10 16:48:13.30
Sendkeysステートメント(メソッド)を使って、他アプリケーションへの入力作業を行っています。
日本語入力の文字化け現象についてはVBAではどうにもならないと聞きました。
クリップボードを経由してもダメでした。
何か良い方法は無いでしょうか?
125:デフォルトの名無しさん
11/12/10 17:16:54.06
ファイルから読み込みしたら?
126:デフォルトの名無しさん
11/12/10 17:23:31.69
SendMessageすれば*
127:デフォルトの名無しさん
11/12/10 20:02:53.99
>>126
ありがとうございます。
SendMessageについて色々調べてみましたが、今一理解できません。
失礼は重々承知ですが、使い方を教えて下さいませんか?
とりあえず、Yahooトップページの検索ボックス(既にフォーカスされているものとして)に
下記の文字列を送信するコードを教えて下さい。
"日本語で入力します。"
よろしくお願いします。
128:デフォルトの名無しさん
11/12/10 20:36:01.01
定数はどうやって型宣言するんだっけ?
Const a=3.14
みたいな感じ?
それともこう?
Const a as Double = 3.14
129:デフォルトの名無しさん
11/12/10 20:41:52.19
>>0x80
>>0x7B
130:デフォルトの名無しさん
11/12/10 20:57:48.09
このスレ的には、
>>&H80
>>&H7B
じゃね?
131:0x81
11/12/10 21:30:56.65
すまぬのう
ExcelVBAで組み込みCの色々なテーブルとかマクロ作って生活の足しに
しているんでな。
つーかワークシートの位置指すのにヘキサで書く理由がわからないですが
そういう仕事の人はいますか?(居たら事例を聞きたい)
132:0x81
11/12/10 22:16:12.22
すまん、自分でも何言っているのかわからない。
まぁ、ワシのティンコは言うこときかないんですけどね。元気すぎて
133:デフォルトの名無しさん
11/12/10 22:36:49.98
>>127
Sub yahoo_search()
Dim objIE As Object
Set objIE = CreateObject("InternetExplorer.application")
objIE.Visible = True
objIE.navigate ("URLリンク(yahoo.co.jp)")
Do While objIE.ReadyState <> 4
DoEvents
Loop
SendKeys "日本語で入力します。"
SendKeys "{ENTER}"
End Sub
134:デフォルトの名無しさん
11/12/11 00:00:06.36
VBAのSendKeysは普通に日本語送れるけど
>>124はどういう状況なんだろう
135:デフォルトの名無しさん
11/12/11 00:13:24.16
2バイト文字入力で化けるソフトがあって、その入力支援が出来ません
ってことかな
表示がバグるだけで内部データは問題ないんじゃね
136:0x81
11/12/11 00:20:33.70
ADOと使って変換すればいけるの?
137:デフォルトの名無しさん
11/12/11 00:30:15.04
>>133
>>134
すみません!完全に私の記述ミス&勘違いです!!
エクセルファイルの各内容を変数に取得して、
社内システムにフォーカスを移して入力を試みています。
半角文字列や数字は問題なく入力できるのですが、
全角文字列(日本語)をSendkeysで送っても文字化けしてしまうのです…
文字化けしないようにするにはSendMessageを使う必要があるって聞きましたが、
使い方がよく分かりません。お手数掛けてすみませんが、ご教授お願いします。
138:デフォルトの名無しさん
11/12/11 00:31:36.91
>>135
え、そうなんですか?
月曜日に確認してみます!
ありがとうございます!!
139:デフォルトの名無しさん
11/12/11 00:46:38.45
>>137
全角文字とSendKyesの組み合わせだと、
入力したい全角文字列をクリップボートにコピーしてから、SendKeys で Ctro+V のみを送るって方法がある
140:デフォルトの名無しさん
11/12/11 00:54:48.00
>>139
ありがとうございます。
でも、 ^V って何故だか動作しませんでした…
141:デフォルトの名無しさん
11/12/11 00:56:06.62
>>139
なるほど
みんな苦労してるんだなあ
うちもツギハギのWEBアプリで四苦八苦してるよ
十何年もかけて機能の拡張やバージョンアップを繰り返してるから画面のデザインとか操作体系がめちゃくちゃになってる
支店が全国に一万店以上あるからうっかり大幅に変更すると再教育のコストもかかるしどうにもならなくなってきてる
142:デフォルトの名無しさん
11/12/11 01:15:47.91
うーん、確かにメモ帳だと SendKeys "^v" で貼り付けできるのにIEだとできないね
何度も試してるとできることもあるけど、再現条件がわからん
Sleepで待ち時間を入れてもDoEventsをはさんでも同じ
半角だと貼れるのに全角は貼れない
わけがわからん
143:デフォルトの名無しさん
11/12/11 01:19:34.66
VBAでDOSコマンド書いてそこから介入
144:デフォルトの名無しさん
11/12/11 01:45:06.76
できた
VBAのSendKeysではうまくいかないけど、VBSのSendKeysならうまくいくことがわかった
以下のサンプルはクリップボードにデータを設定する部分で警告が出るけど、そこは問題の本質じゃないので無視してくれ
Sub yahoo_search()
Set IE = CreateObject("InternetExplorer.application")
IE.Visible = True
IE.navigate ("URLリンク(yahoo.co.jp)")
Do While IE.ReadyState <> 4 '表示終了まで待つ
DoEvents
Loop
Set ws = CreateObject("Wscript.Shell")
IE.Document.ParentWindow.ClipboardData.SetData "text", "英語を貼り付ける。"
ws.SendKeys "^v"
End Sub
145:デフォルトの名無しさん
11/12/11 07:23:03.30
っていうか相手がIEだったら(>>124)
SendKeysなんか使わずにDOM操作した方がよくない?
例えば>>133のコードを拝借すると、SendKeysの2行をこんな風にする
objIE.Document.getElementById("srchtxt").Value = "日本語で入力します。"
objIE.Document.getElementById("srchbtn").Click
対象がすでに表示中のIEだと捕まえるのがちょっと面倒だけどね
146:145
11/12/11 07:25:19.85
うわ編集中に送ってしまった
1行目
っていうか相手がIEだったら(>>124)
↓
っていうか相手がIEだったら(>>124は「社内システム」としか書いてないからわからんけど)
147:デフォルトの名無しさん
11/12/11 09:07:00.03
環境 XP、Office2003
[Sheet1]
Private Sub Worksheet_Calculate()
Worksheets("Sheet1").操作()
End Sub
という事を実現したいが、シート名は可変です。
で、
Private Sub Worksheet_Calculate()
ActiveSheet.操作()
End Sub
という例を見かけますが、この場合 ActiveSheet が Sheet1 という保証はあるのでしょうか。
(手元にExcelがないのでコードは不正確かもしれません)
148:124
11/12/11 09:16:05.26
>>142-146
お返事が遅くなりすみません。
社内システムはIEではありません。
.exeファイルです。
…VBSのSendkeysとか想像もしてませんでした。
DataObjectでクリップボードに格納して、VBSのSendkeysを試してみます。
いずれにせよ、月曜日じゃないと確認できませんが。。。
何度もアドバイス下さり、本当にありがとうございます!
また、結果などをご報告いたします。
149:デフォルトの名無しさん
11/12/11 10:35:28.06
>>147
ブックの"Sheet1"という名前のシートに操作をするなら
For i = 1 To ActiveWorkbook.Sheets.Count
If ActiveWorkbook.Sheets(i).Name = "Sheet1" Then
操作
End If
Next
にしたらいかがでせうか
150:149
11/12/11 10:36:30.35
レスを良く見てなかったんで
取り消してくらはい
151:デフォルトの名無しさん
11/12/11 11:31:08.05
>>147
>という例を見かけますが、この場合 ActiveSheet が Sheet1 という保証はあるのでしょうか。
当然そんな保証はない。
「シート名は可変です。」と書いてあるが、ではソノシート名はいつどこで指定するのか?
あらかじめ指定しておくと言うなら、
Dim SheetName As String
Private Sub Setup( )
SheetName = "Sheet1"
End Sub
Private Sub Worksheet_Calculate( )
Worksheeets(SheetName).操作( )
End Sub
でいい。
Sheet1 がないケースなどがあるなら、適切なエラー処理が必要。
152:デフォルトの名無しさん
11/12/11 11:34:28.91
あと、本来名前でいろいろ参照するのはお勧めしない。
>>151 の例なら、
Dim TargetSheet As Worksheet
Private Sub Setup( )
Set TargetSheet = Worksheets("Sheet1")
End Sub
Private Sub Worksheet_Calculate( )
TargetSeet.操作( )
End Sub
の方が (個人的には) よりいいと思う。
153:デフォルトの名無しさん
11/12/11 11:40:53.64
>>147
Worksheet_Calculateイベントはアクティブシートがどこにあっても発生する可能性があります
シートモジュールの中で自分自身に対して何か処理をしたい場合はシート名を書かなければ良いだけです
[Sheet1]
Private Sub Worksheet_Calculate()
操作() ' ←これだけ
End Sub
154:デフォルトの名無しさん
11/12/11 12:27:23.26
シート番号指してシート名取得してその名前が欲しいシート名と一致ならば処理すれば?
変なエラーが起こらない。
For I = 1 To Worksheets.Count
If Worksheets(I).Name = "Hoge" then
'やりたいことやる
endif
Next
155:デフォルトの名無しさん
11/12/11 12:31:01.24
>>147
すんまそん、アンカ忘れてた。
今からカリ首吊ってくる
シート番号指してシート名取得してその名前が欲しいシート名と一致ならば処理すれば?
変なエラーが起こらない。
For I = 1 To Worksheets.Count
If Worksheets(I).Name = "Hoge" then
'やりたいことやる
endif
Next
156:デフォルトの名無しさん
11/12/11 15:20:43.60
Excel:2007、OS:Win7
上書き保存時、セーブ前に行列番号を消し、保存後、行列番号を再度表示させたいです。
ビュアーで見る時に番号を消したい、という意図です。
とりあえず調べた限り、以下でいいと思ったのですが以下の問題点でつまずいています。
・そもそも保存されない
・ブックを閉じようとすると上書き保存するか聞かれるが保存するを選んでも何度も同じことを聞かれる。
いいえかキャンセルのみで抜けられる。
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean _
, Cancel As Boolean)
With ActiveWindow
.DisplayHeadings = False '行列番号消し
ThisWorkbook.Save 'セーブ。できてない?
Cancel = True '通常の上書き保存をキャンセル
.DisplayHeadings = True '行列番号表示
End With
End Sub
157:デフォルトの名無しさん
11/12/11 15:59:31.16
>>156
環境が無いんで確認できないけど、
ThisWorkbook.SaveがWorkbook_BeforeSaveを誘発してるでしょ。
自分で聞いてやるしかないと思うよ。
Msgbox("保存しますか?",vbYesNo)
Yesなら
Application.DisplayAlerts = False
ThisWorkbook.Save
Application.DisplayAlerts = True
メッセージは、Ctrl+S時に表示しちゃまずいから、
BeforeCloseで保存確認しちゃった方がいいかもね。
まぁ結局はWorkbook_openで
DisplayHeadings = True '行列番号表示
しちゃう方が簡単だと思うんだ。
158:デフォルトの名無しさん
11/12/11 16:09:24.49
>>156
Saveの直前にイベント抑止してみるとか
Application.EnableEvents = False
ThisWorkbook.Save 'セーブ。できてない?
Application.EnableEvents = True
ただ、保存されたものは常に行番号なしになるのでopen時には再度行番号有効化してやるとかの考慮は必要になる
あと、実際に保存された直後、
.DisplayHeadlings = True
の行でおそらく編集扱いになるので、ただ閉じようとしても必ず
保存しますか?
と聞かれてしまうのは仕方ないように思える
159:デフォルトの名無しさん
11/12/11 16:13:35.98
157>>
返信ありがとう!
上司からのオーダーなもんで出来るだけ対応したいんだけどねぇ。
Ctrl+Sでやりたいから、必ずしもウィンドウを閉じる時ばかりじゃないもんで。
俺もこれを聞く前に閉じるときにセーブ前に非表示→開くときに表示というふうに
したんだけどそれだとダメらしい
出来ればCtrl+Sとかでも対応できるようBeforSaveでやりたいが……
自前の保存マクロでやるしかないかな……
160:デフォルトの名無しさん
11/12/11 16:21:54.14
>>158
>.DisplayHeadlings = True
>の行でおそらく編集扱いになるので
ThisWorkbook.saved=Trueでどう?
161:デフォルトの名無しさん
11/12/11 16:23:43.56
>>158
こっちもありがとう!
イベントの抑制・・・そういうのもあるのですね。参考にしてみる。
開くときに表示ON自体は_OpenでしてやればOKですね。実際それはもう仕込んであるので。
しかし、なるほど、結局、表示消すのが編集扱いになってるから何ども聞かれるのか。
そりゃそうだわな……
162:デフォルトの名無しさん
11/12/11 17:45:20.24
>>160
遅れたがサンクス。
とりあえず各アソバイスを入れた結果、Ctrl+Sで保存で行が消せるようになった!
ビュアーでみてもちゃんと消える。
ただ
・ブックを閉じようとすると上書き保存するか聞かれるが保存するを選んでも何度も同じことを聞かれる。
いいえかキャンセルのみで抜けられる。
は解消されないな……一度保存すればあとはいいえ押せばいいだけなんだけどね。
ThisWorkbook.Saved = Trueの使い方がまずい?
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean _
, Cancel As Boolean)
With ActiveWindow
.DisplayHeadings = False '行列番号消し
'Application.DisplayAlerts = False
Application.EnableEvents = False
ThisWorkbook.Save 'セーブ。できてない?
Application.EnableEvents = True
Cancel = True '通常の上書き保存をキャンセル
.DisplayHeadings = True '行列番号表示
ThisWorkbook.Saved = True '変更適応OK
End With
'Application.EnableEvents = False
End Sub
※その他、Open時とClose時にそれぞれ行列表示のOn,Offをいれてます。
163:デフォルトの名無しさん
11/12/11 20:16:58.40
>>162
EXCEL2000ならあったから入れてみた。
URLリンク(ideone.com)
出来てるとは思うけど、
割と脆弱なロジックなので、限られた範囲での使用に留めるべき。
仕事であれば別にボタンを用意するかな。
164:デフォルトの名無しさん
11/12/11 22:57:32.48
あ、vbNoの処理間違ってた。
Saved=Trueが必要かな
165:147
11/12/11 23:51:37.67
Worksheet_Calculate()時のActiveSheetは自シートか?という質問に関し、
>>149-155
ありがとうございました。勉強になります。手元にExcelが無いので明日試させて頂きます。
が、理解を超えている点があるので再質問させて下さい。
>>153
> シートモジュールの中で自分自身に対して何か処理をしたい場合はシート名を書かなければ良いだけです
その場合、省略された自分自身を表わす記法はどのようになりますか?
例えば、自シートをローカル変数に代入したいとか。(他モジュールで使い回したいような目的で)
[Sheet1]
' Set SelfSheet = Worksheets("Sheet1") 相当をシート名無しで実現するには?
Dim SelfSheet As Worksheet
Set SelfSheet = ' ThisWorksheet と書きたいが。
166:デフォルトの名無しさん
11/12/12 00:26:16.12
>>165
俺はそんな時 Me を良く使うお
Set SelfSheet = Me
167:デフォルトの名無しさん
11/12/12 00:31:30.30
すいません、質問が
VBAを使って、
Aというセルに数値を入れた時に、BというセルにそのAに入れた数値によって様々な値を出力する
というのを作りたいのですが、どうすればいいのでしょうか
168:デフォルトの名無しさん
11/12/12 01:24:37.73
>>167
セルBにセルAを参照する数式を記述する
169:デフォルトの名無しさん
11/12/12 01:24:46.11
質問です
mnock = 1: hno = 1の
:ってどういういみなんですか?
代入を一行に書いたわけではないんですよね・・・
170:デフォルトの名無しさん
11/12/12 01:56:23.33
改行の代わり
171:デフォルトの名無しさん
11/12/12 01:59:19.61
>>170
そうなのか・・・特殊記号かとおもってしまいました
ありがとう
172:デフォルトの名無しさん
11/12/12 09:47:18.15
範囲指定をして何か処理(ソートとか)した後、その選択範囲が選択されたままになってしまいますが、それを解除する命令
とかってありますか?
何処かのセルを選択すればそれが解除されはするんですが、それとは別に言ったような選択を解除するようなものがあるのか
?と思いまして。
173:デフォルトの名無しさん
11/12/12 10:21:17.05
未選択状態見たこと無いから無いんじゃない?
174:デフォルトの名無しさん
11/12/12 10:23:20.77
thxです
やっぱり無いですかね w
175:デフォルトの名無しさん
11/12/12 11:18:55.59
質問があります。
OS:Windows 7 Ultimate 64bit SP1
Excelのバージョン:Office 2007 Personal SP3
A1-A10までのセルのいづれか1つに*が入力されたら、それ以外のA1-A10のセルを空にしたいです。(排他?)
※A1-A10のうち、*が入力されているのは常に1つの状態にしたいという事です。
よろしくお願いします。
176:デフォルトの名無しさん
11/12/12 12:02:31.09
わーくしーとあふたーあっぷでーと()
A1~10に入力があったら他排除
えんどサブ
177:175
11/12/12 12:35:42.16
>>176
すみませんが、貴方の言う「A1~10に入力があったら他排除」が分からないと質問をしているのです。
回答する気がないのであれば、中途半端なレスはいりませんよ、176さんも暇じゃないでしょうから。
178:デフォルトの名無しさん
11/12/12 12:43:30.40
>>177
>>2
179:デフォルトの名無しさん
11/12/12 13:07:20.85
>>175
おまえの態度が気に入らない
VBAを勉強する前に掲示板の使い方を覚えろ
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
r = Target.Row
c = Target.Column
If c = 1 And r <= 10 Then
If Cells(r, c) = "*" Then
Range("A1:A10").Clear
Cells(r, c) = "*"
Else
Intersect(Target, Range("A1:A10")) = ""
End If
End If
Application.EnableEvents = True
End Sub
180:175
11/12/12 13:12:20.64
>>179
態度を改めます。
掲示板の使い方も覚えます。
コードありがとうございました。
181:デフォルトの名無しさん
11/12/12 13:16:48.65
ああごめん、フックが解んないかと思ってたわ
182:デフォルトの名無しさん
11/12/12 14:02:21.15
>>163
サンクス。かなり参考にさせてもらった。
でもブックを閉じた時、保存ではいを押しても保存出来ないっぽい。2007の差でもあるのか
ちなみに皆さん、マクロ配布するときどうしてます?
エキスポートでcls出してインポートで使わせようと思ってもthis bookに書かなきゃうまくうごかなかった。そもそもVBAわざわざ開かせるのも微妙で。
183:デフォルトの名無しさん
11/12/12 14:16:59.61
>>172
Application.CutCopyMode = False じゃないのか?
>>182
プログラムの入ってるブックとデータの入ってるブックは別にして
配布はプログラム用のEXCELブックを丸ごと配布する
184:デフォルトの名無しさん
11/12/12 14:24:08.14
オブジャクト指向ってなんですか?
185:デフォルトの名無しさん
11/12/12 14:33:16.67
オブジェクト指向は、継承とポリモルフィズムです
smalltalkという言語が有名
186:184
11/12/12 14:39:05.33
わたしが聞いてるのは「オブジャクト指向」のほうなんですが
187:175
11/12/12 15:34:06.89
>>179
度々すみません。
*の排他入力?は出来たのですが、
文字列の中央揃えなどの設定が消えてしまいます。
188:デフォルトの名無しさん
11/12/12 15:41:17.73
書いてあるコードググれよ
宿題なら自分でやりな
俺が聞く時に雰囲気悪くなったらどーすんだ!
189:デフォルトの名無しさん
11/12/12 15:54:57.59
それを気にするほどのやわな神経なんてないだろ
190:デフォルトの名無しさん
11/12/12 17:16:44.25
VBAでシート関数はApplication.Sheetfunction.[関数]と書けばどんなものもつかえる?
191:デフォルトの名無しさん
11/12/12 18:27:00.97
>>187 >>175
>>2
>★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み、
> コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。
> ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ
と書いてあるんだが 読んだのか?
192:デフォルトの名無しさん
11/12/12 18:35:15.73
>>191
当たりまえです
>>187を聞いてるのに関係ない話で誤魔化さないでください
わかりもしない、答える気もない屑が掲示板を荒らすのは本当に不愉快です
193:デフォルトの名無しさん
11/12/12 18:36:47.91
オレ ジエン ここまで ぜんぶ
194:デフォルトの名無しさん
11/12/12 18:41:50.97
>>192
偽者乙
195:デフォルトの名無しさん
11/12/12 18:43:55.77
俺の自演って言ってるじゃないですカー!
196:デフォルトの名無しさん
11/12/12 19:39:03.96
中央でそろえるとか、マクロの記録があるんだからそれ使えばいいじゃない
そのコードを今までのに追記するだけなんだし。
ここでやり取りしてる時間の方が無駄でしょ
197:デフォルトの名無しさん
11/12/12 19:51:40.07
>>190
使えないものもあるよ。そういう時はEvaluateを使うみたいだけど。
198:124
11/12/12 20:29:23.23
今日、会社で色々試しました。
解決策は意外な盲点にありました。
私はSendkeysはApplicationクラスのものを利用していましたが、
(こっちの方が安定性が高いらしいので)
普通のSendkeysを使用したら文字化けしませんでした。
それからメニュー等を操る時は、大文字入力だと失敗することが多いですね。
いずれにせよ、親身にアドバイスを下さった皆さん、
本当にありがとうございました。
199:デフォルトの名無しさん
11/12/12 20:38:26.96
そういや「Sendkeysステートメント(メソッド)」って書いてたもんな
なんでメソッド?と微妙にひっかかっていたがそういうことか
200:175 ◆txEbeGmJyg
11/12/12 20:47:44.09
>>191
すみません。
他にExcelのVBAスレが見当たらなかったもので、勝手は承知で質問してしまいました。
>>196
失礼ですが、このスレの回答側の人はその程度のレベルなんですか?
>>179
さきほど、.Clearの所を= ""にしたら、できました。
あえて、勉強のために.Clearを使って書いてくれたのかな?
201:デフォルトの名無しさん
11/12/12 21:09:47.60
質問者が恐らく理解出来るだろう内容で回答してるよう見えるけど
202:175 ◆txEbeGmJyg
11/12/12 23:31:06.38
>>201
私が言っているのは>179さんに対してではなくて、>196さんの発言に対してです。
>179さんのコードは綺麗だと思います。
.Clearメソッドを使った意図が、私に学習させるためなのかなと思っただけです。
なので、>179さんには感謝はすれど文句はありません。
203:175 ◆txEbeGmJyg
11/12/12 23:46:11.89
度々すみません。
>>179さんの書いてくださったコードで、
>r = Target.Row
という部分があると思いますが、これをAとかBで指定できるように
したいのですが、何かうまい方法はありますでしょうか?
これを、If c = 1 And r <= 10 Then
こうしたいです。
Dim strRowPos as String
strRowPos = A
If c = strRowPos And r <= 10 Then
ここを見て調べているのですが見つけられなくて。
www.eurus.dti.ne.jp/yoneyama/Excel/vba/index.html
度々すみませんが、179さんか分かる方いたら教えてください。
どうかよろしくお願いします。
204:175 ◆txEbeGmJyg
11/12/12 23:48:55.32
またまたすみません。
Dim strRowPosA as String
Dim strRowPosN as String
strRowPosA = A
'
'ここで、strRowPosAを数値にして、strRowPosNに入れたいということです。
'その変換方法がないかなと。
'
If c = strRowPosN And r <= 10 Then
205:デフォルトの名無しさん
11/12/12 23:50:01.50
うーーーーーぜーーーーーーーーーーー
206:175 ◆txEbeGmJyg
11/12/12 23:50:34.30
だぁ・・・。
スレ伸ばしてすみません。
誤)Dim strRowPosN as String
正)Dim strRowPosN as Integer
207:デフォルトの名無しさん
11/12/13 00:11:04.02
スレチ押し通すなっての。
既に聞く態度じゃないとと取られてんだし、誰も真面目に答えないよ?
208:175 ◆txEbeGmJyg
11/12/13 00:20:56.52
>>207
失礼ですが、どこがスレチなんでしょうか?
>>2の>★5と指摘されたので、調べつつ少しなりとも自分でやっているんですけど。
聞く態度じゃないというのも具体的に分かりませんが、改めて私のできる範囲で丁寧な
言葉でレスしているのですが。
ちなみに、誰も答えないとおっしゃられていますが、それは貴方の推測ですよね。
事実、もしそうであれば>>178でレスが止まっているはずですが、>>179氏はちゃんと指摘
とレスをしてくれましたよ。
質問者の立場で何ですが、一言あなたに言わせていただくと、あなたは回答できないので
はないですか?
基本2chて自分が嫌だと思ったらスルー推奨ですよね。
それで結果的にスマートではないと思うのですが、26進数変換の関数を作って対処(仮)しました。
もしもっと、いい方法を知っている方いらっしゃいましたら、教えていただけると助かります。
209:デフォルトの名無しさん
11/12/13 00:23:31.37
URLリンク(gigazine.jp)
スレチ?
210:デフォルトの名無しさん
11/12/13 00:26:48.21
URLリンク(ja.wikipedia.org)
211:デフォルトの名無しさん
11/12/13 00:37:20.63
URLリンク(missaoyama2008.camcolle.jp)
トモダチ
212:デフォルトの名無しさん
11/12/13 00:41:06.61
URLリンク(www.zukan-bouz.com)
213:デフォルトの名無しさん
11/12/13 00:41:27.05
超初心者です・・・
Sub 例題()
Dim n As String
For n = 1 To 10
Cells(n, 1) = n
If n Mod 2 = 0 Then
Cells(n, 2) = " 偶数 "
End If
Next n
End Sub
で型が一致しないとでるのですがどうすればよいでしょうか
214:デフォルトの名無しさん
11/12/13 00:42:11.55
ちょっと煽られただけですぐ感情的に反論するとか、どんだけ子供なんだよ
気に入らないレスは無視しろ
正論でも印象悪い
書き間違いが多すぎる
書き込む前に3回読み直せ
strRowPosA = A ← これは不可能。こういう書き方だとAは変数名になってしまう
やるならこう
strRowPosA = "A"
strRowPosN = Cells(, strRowPosA).Column
さらに言えば、ワークシートのA、B、C…はRowじゃなくてColumnだから、全体を修正すると
Dim strColumnPosA as String
Dim strColumnPosN as Integer
strColumnPosA = "A"
strColumnPosN = Cells(, strColumnPosA).Column
If c = strColumnPosN And r <= 10 Then
215:デフォルトの名無しさん
11/12/13 00:44:37.64
>>213
○ Dim n As Integer
× Dim n As String
授業はちゃんと聞こうね
216:175 ◆txEbeGmJyg
11/12/13 00:49:58.79
>>214
すみません。
指摘感謝です。
>179さんかな?
コードありがとうございました!
217:デフォルトの名無しさん
11/12/13 00:55:07.20
202
>>196ですら君は及ばないレベルだと自覚出来ない時点でもうね
218:デフォルトの名無しさん
11/12/13 00:56:20.86
>>215
ありがとうございました^^
219:147
11/12/13 02:19:10.83
>>166
ありがとうございます。まとめます。
<Q>
[Sheet1]
Private Sub Worksheet_Calculate()
Worksheets("Sheet1").操作()
End Sub
という事を実現したいが、シート名は可変です。
で、
Private Sub Worksheet_Calculate()
ActiveSheet.操作()
End Sub
という例を見かけますが、この場合 ActiveSheet が Sheet1 という保証はあるのでしょうか。
環境 XP、Office2003
<A>
ActiveSheet が Sheet1 という保証は無いので、
Me.操作()
とすると良い。
220:デフォルトの名無しさん
11/12/13 09:41:54.02
「VBAは完全なオブジェクト指向ではない」との記述を見たのですが
このことをオブジェクト指向のことを十分には理解していない人に
200文字以上で説明してくださいませんか?
221:デフォルトの名無しさん
11/12/13 13:54:02.76
>>220
>十分には理解していない人
どこのどいつだ?
Deutschでもよければ400字くらいで?
222:220
11/12/13 14:52:35.87
>>221
ここのオレだ。
I'd rather prefer English than Deutsch.
223:デフォルトの名無しさん
11/12/13 16:22:00.16
I'd rather prefer English wife than Deutsch wife.
224:デフォルトの名無しさん
11/12/13 18:22:12.32
VBAでいくつか文字列が入ったセル(その時によりセルの数が違う)があって
そのうち昇順で並べて一番最後の文字列だけを取り出す方法はどうしたらいいですか?
225:224
11/12/13 18:22:47.09
セルちゃうわ、シート名だった。
シートの数は、ファイルによりいつくあるかはわからないの。
226:デフォルトの名無しさん
11/12/13 18:42:32.06
>>224
Sub 最後のシト()
s = ""
For Each ws In Worksheets
If ws.Name > s Then s = ws.Name
Next
Debug.Print s
End Sub
227:147
11/12/13 19:31:28.61
>>220
俺もオブジェクト指向とか理解していないけど、
継承できなのにはかなりまいった。
228:デフォルトの名無しさん
11/12/13 19:33:23.34
Excelではないのですが・・・知恵をお貸しください
Visioで下記の図を作成しようと思っています
A→ F→Z
B→↑
・Aに値が入ると、F・Zにも値が入る
・Bに値が入ると、F・Zの値がクリアされ、Aに値が入っている場合はAに値が入っている状態を維持。Bをクリアすると、上記と同じA・F・Zに値が入る
ここまではVBAで作成できたのですが、これを
・(Bに値が入っていない状態で)Aの値をクリアしてもF・Zの値をそのまま維持
にしたいのですが、値を維持するためにFにstaticを宣言してもうまくいきません。
そもそも、Staticでいいのかすら、迷ってきて・・・値を維持できるうまいやり方はないでしょうか
229:デフォルトの名無しさん
11/12/13 23:04:26.04
>>226
お前>>176?
それとも>>213?
>最後のシトとかいらっとくるからやめろ。
230:デフォルトの名無しさん
11/12/13 23:21:13.61
>>229
226
が
213
のボケをかますとは思えない
つーか一々煩いからお前が黙ってろ
231:デフォルトの名無しさん
11/12/14 00:23:42.59
>>220
オブジェクトを部品として利用することは出来るが
既存のオブジェクト(クラス)を継承して新たな部品を作ることは出来ない
232:デフォルトの名無しさん
11/12/14 00:37:17.98
>>230
ごめんなさーいw
233:デフォルトの名無しさん
11/12/14 09:33:54.08
シートで行を削除するのにマクロの記録だと1行目・2行目を消すのに
Rows("1:2").Select
Range("A2").Activate
Rows("1:2").Delete Shift:=xlUp
Range("A1").Select
というのが出来たんで、この開始行と終了行を変数にしたい。
んで、
i= 11
endrow = 13
とかして
Rows(i:endrow).Delete Shift:=xlUp とすると構文エラーになってしまいます
行を変数にするのはどのようにしたら良いんでしょう?
234:デフォルトの名無しさん
11/12/14 09:42:02.74
Rows(i:endrow).Delete Shift:=xlUp
↓
Rows(i & ":" & endrow).Delete Shift:=xlUp
235:デフォルトの名無しさん
11/12/14 09:52:48.73
>>234
ありがとうございます
236:デフォルトの名無しさん
11/12/14 18:54:02.39
>>235
ついでに言うと、Rowsに対するDeleteは常にxlUpだからShift:=xlUpは不要
237:デフォルトの名無しさん
11/12/14 21:04:31.60
>>236
言われてみたら確かにそうですね w
238:デフォルトの名無しさん
11/12/14 21:33:37.60
削除は下から消さないと・・・
239:デフォルトの名無しさん
11/12/14 22:21:48.02
>>238
分割された領域なら下からとか右からで削除しないと面倒だけど、
連続の領域をまとめて消すんなら別にどうでも良いんじゃね?
240:デフォルトの名無しさん
11/12/14 22:59:06.37
アドバイスお願いします。
数字、名前のペアが複数あって、数字をキーにすると名前が取り出せて、
名前をキーにすると数字が取り出せる連想配列のようなものを作りたいのですが、
VBAではどのようにすると効率的でしょうか?
それぞれ、一意的にペアが決まっています。
241:デフォルトの名無しさん
11/12/14 23:06:34.94
>>240
Scripting.Dictionary オブジェクトを2つ用意して、
一方は数字をキー、もう一方は名前をキーと使い分ければいい
242:240
11/12/15 22:30:21.63
>>241
ありがとうございます。試してみます。
243:デフォルトの名無しさん
11/12/16 00:14:21.90
どちらで聞いたらいいのか分からなかったのでこちらで聞きますが
セルの値を数値処理する場合vbsから操作するのとvbaから操作するのだとどちらが計算早いですか?
244:デフォルトの名無しさん
11/12/16 00:15:16.83
vbs
245:デフォルトの名無しさん
11/12/16 00:19:32.00
Excelとのやり取りが殆ど無い場合でも、
腐っても型付言語であるVBAの方が速いと思う。
やり取りが多い場合はインプロセスとアウトプロセスの
越えられない壁があるからVBSに勝ち目無し。
246:デフォルトの名無しさん
11/12/16 00:32:28.93
VBSでエクセルを偽装してだね
247:デフォルトの名無しさん
11/12/16 08:03:26.05
x個の数からy個の数をランダムに取り出したいときってどうしてますか?
数の集合が{1, 2, 3, 4, 5}つまりx=5でy=3の場合だと
毎回
2, 3, 5
1, 2, 4
3, 4, 5
みたいに5個の数のうちランダムに3つ選び出す、というアルゴリズムです
248:デフォルトの名無しさん
11/12/16 08:13:33.97
単純にやるなら乱数3つ
問いの内容ならxCy個の中から乱数1つ
1なら(123)、2なら(124)……て形で割り振るアルゴリズムを通してゲット
重複や順列の内容で幅を変えればいい
249:デフォルトの名無しさん
11/12/16 15:55:35.00
URLリンク(www.eurus.dti.ne.jp)
ここ参考にすればいいんじゃねーの
250:デフォルトの名無しさん
11/12/16 17:02:45.72
vbaって動的の多次元配列ってできねえの?
251:デフォルトの名無しさん
11/12/16 17:03:30.70
型はstringで
252:デフォルトの名無しさん
11/12/16 17:06:42.33
なんでそういうサイトを上げるんかねぇ。
恥かかせるためか?
253:デフォルトの名無しさん
11/12/16 17:07:54.02
>>250
やってみりゃ分かるだろ?
254:デフォルトの名無しさん
11/12/16 17:08:28.00
dim hoge(,) as string
これだとエラーなんだけど
255:デフォルトの名無しさん
11/12/16 17:09:48.29
dim hoge[][] as string
これもエラーだった
256:デフォルトの名無しさん
11/12/16 18:10:19.05
二次元で要素数が不定の動的配列はできないんじゃないの?
検索するとできるって書いてあるページもあるけど、サンプルをコピペするとエラー出るし
VBとVBAを勘違いしてんじゃないかと思う
要素数固定で宣言して、片方の次元だけReDimする方式の動的配列なら可能だけど
257:デフォルトの名無しさん
11/12/16 19:23:51.82
>>250
Dim hoge() As String
ReDim hoge(10, 5, 3)
hoge(0, 0, 0) = "3次元"
Debug.Print hoge(0, 0, 0)
258:デフォルトの名無しさん
11/12/16 20:49:43.90
>>257
思ってたのとちょっと違いますけどこれとpreserveで代用できそうだな
ありがとうございます
259:デフォルトの名無しさん
11/12/17 00:44:13.36
WindowsAPIを使用したいときは、いちいち定義しないとダメなんでしょうか?
現場では資料もなくネットも使えない環境なので手打ちをキツイです。
260:デフォルトの名無しさん
11/12/17 00:50:47.84
>>259
いちいち定義しないとダメですが、WinAPIなら百科事典が発売されているのでそれを持ち込むという手も
あとはmsdnのオンラインヘルプ(CD-ROM版)を用意して、CのソースをVBAに書き換えるマクロとか用意すれば
なんとかなるでしょう
261:デフォルトの名無しさん
11/12/17 01:22:48.76
vbaでこんな感じのリクエストを飛ばすのってどうやるのですか?
GET / HTTP/1.1
Accept-Language: ja
Accept-Encoding: gzip
User-Agent: hoge (1.1.1)
Host: wwww.aaa.bb
262:デフォルトの名無しさん
11/12/17 01:34:28.67
GET /hogehoge.cgi HTTP/1.1
Accept-Language: ja
Accept-Encoding: gzip
User-Agent: hoge (1.1.1)
Host: wwww.aaa.bb
送るとこかいてませんでした
263:デフォルトの名無しさん
11/12/17 03:32:05.24
>>261
WinInet関連のAPIを使う
HttpAddRequestHeadersしてHttpSendRequestかな?
WinHTTPライブラリ(WinInetの後継らしい)てのもあるが詳細はしらない
これ以上はスレチになるんで
ググるか APIのすれで聞いておくれ
264:デフォルトの名無しさん
11/12/17 04:19:21.00
>>261
ネットのやりとりはいろんな方法がある
たぶん、こんな感じで行けると思う
Set oHttp = CreateObject("MSXML2.XMLHTTP")
oHttp.Open "GET", "URLリンク(www.aaa.bbb)", False
oHttp.SetRequestHeader "Accept-Language", "ja"
oHttp.SetRequestHeader "Accept-Encoding", "gzip
oHttp.SetRequestHeader "User-Agent", "hoge(1.1.1)"
oHttp.Send ' リクエスト送信
istatus = oHttp.Status ' 結果確認
If istatus = 200 Then s = oHttp.responseText ' 本文(HTMLソース)取得
265:デフォルトの名無しさん
11/12/17 09:44:20.71
Dim WS As Worksheet
Set WS = Worksheets("記録")
Worksheets(WS).Activate ←
で、矢印の部分で型が一致しないって出るんですけど、String型でないと駄目ッてこと
ですか?
266:デフォルトの名無しさん
11/12/17 09:47:26.21
Dim WSName As String
WSName = "記録"
Worksheets(WSName).Activate
じゃないの?たぶん
267:デフォルトの名無しさん
11/12/17 09:52:46.36
>>265
265の方法でもよいし、Object型(Worksheet型)で宣言したときは
Worksheets(WS).Activate
じゃなくて
WS.Activate
って書けば良い
268:267
11/12/17 09:54:36.29
安価ミスった
「265のやり方」じゃなくて「266のやり方」でした
269:265
11/12/17 09:55:52.47
なるほど!
ありがとうございます
270:デフォルトの名無しさん
11/12/17 16:18:35.70
>>264
できました!
ありがとうございます
271:デフォルトの名無しさん
11/12/17 18:21:08.96
constって使う必要あるの?
変数に値持たせてそれ変えなければいいだけじゃないの
272:デフォルトの名無しさん
11/12/17 18:35:36.34
>>271
プロシジャ毎にPrivate変数に一々代入するのって面倒じゃない?
273:デフォルトの名無しさん
11/12/17 18:48:53.68
Constの場合は確実に固定値だと判断が出来る。
普通の変数だと、その点が曖昧にならざるを得ないから、
後でソースを見返す時に面倒。
274:デフォルトの名無しさん
11/12/17 19:14:43.41
>>272
ところでモジュール間でも定数は自由に使えますかにゃ?
標準モジュールとフォームモジュールを使ってた場合、
どちらかのモジュールの一番上に書いておけば、他方のモジュールをその時点で未使用でも、その他方の上のほうに書いてある定数は使用可能?
275:274訂正
11/12/17 19:16:32.05
>>272
ところでモジュール間でも定数は自由に使えますかにゃ?
標準モジュールとフォームモジュールを使ってた場合、
どちらかのモジュールの一番上に書いておけば、他方のモジュールから実行が始まったとき、
書いてるほうのモジュールがその時点で未使用でも、その他方のモジュールから別のモジュールの上のほうに書いてある定数は使用可能?
276:デフォルトの名無しさん
11/12/17 19:36:50.61
ちょっと試せばすぐにわかるのに
277:デフォルトの名無しさん
11/12/17 19:37:56.98
モジュールはマクロ開始時点で全て初期化される。
278:デフォルトの名無しさん
11/12/17 19:39:29.49
>>276
あなたのVBA力と回答力を試しているんですが
279:デフォルトの名無しさん
11/12/17 19:43:07.60
VBA力とか言ってる時点でみんなより自分が格下なのに気付けよ
280:デフォルトの名無しさん
11/12/17 20:11:42.31
わからないなら無理にレスしてくれなくていいよ?
281:デフォルトの名無しさん
11/12/17 21:08:41.34
VBAで、数値から文字列、文字列から数値への変換の方法はいろいろあるみたいだけど
どの方法が一番標準ですか?
自分は前者はCStr、後者はVal、でそれぞれやってますが、これって変?
282:デフォルトの名無しさん
11/12/17 21:25:43.32
基本は自動型変換で良くね?
後、Val関数は何気に色々と面白い仕様だから注意した方が良いよ。
283:デフォルトの名無しさん
11/12/17 22:04:12.83
>>282
自動型変換とは何ですか?
面白い仕様とはどういうことですか?
あにゃたの発言のほうが意味がいろいろ取れて神経を使います。
284:デフォルトの名無しさん
11/12/17 22:58:53.98
別に標準とかないでしょ
いろいろな方法があるのにはそれなりに理由があるんだから
その時によって最適な方法を選べば良い
285:デフォルトの名無しさん
11/12/17 23:21:52.65
valは使わないな
文字列にする時はこんな自作ライブラリつかってる
Function dfVntToStr(ByVal StringVal As Variant) As String
On Error Resume Next
dfVntToStr = \\\"\\\" \\\'初期化
If Not IsNull(StringVal) Then
dfVntToStr = StringVal & \\\"\\\" \\\'文字列へ変換
End If
On Error GoTo 0 \\\'エラークリア
End Function
同じようにintに変換とかlongに変換とかのライブラリも作ってる
ネタ元はこれ
VisualBasic6エラーコーディング
URLリンク(www.amazon.co.jp)
286:デフォルトの名無しさん
11/12/18 00:52:58.28
VBAで自作ライブラリ作ってる人とか初めて見た・・・すごいな
287:デフォルトの名無しさん
11/12/18 01:00:33.26
>>285
なぜ標準的な機能がすでに存在してるのに
わざわざ自作ライブラリまで作るんですか?
つこてる豆が違うんですか?
288:デフォルトの名無しさん
11/12/18 01:13:53.11
その\\\は何なの
289:デフォルトの名無しさん
11/12/18 01:18:30.50
つこてる豆です
290:デフォルトの名無しさん
11/12/18 01:50:27.77
\\\\\\はたぶんp2が原因、だと思う
理由は変換でエラーが起きても統一した処理が書けるようにするため
ネタ本はVB6のエラー処理を解説してる本で、安全なプログラミングの
フレームワークのサンプルもある(285はその1つ)
個人的にツッコミを入れてたところへの解答がちゃんと書いてある本だったので、ExcelVBAでも使わせてもらってる
この本のライブラリと、「Excelプロフェッショナルエンジニアテクニック 」で
紹介されているアドイン:VBADeveloper.xla は自分が使うExcelVBA環境では
使いまわすようにしてる
291:デフォルトの名無しさん
11/12/18 02:45:14.73
1時間かけてコーディングたものをデバッグしたら、最後のコードが.saved=true:.closeで、次開いたらコードが全て消えていました!
途中保存はしていませんでした、どうすればいいですか!!!
292:デフォルトの名無しさん
11/12/18 02:53:35.82
URLリンク(www.gigafree.net)
293:デフォルトの名無しさん
11/12/18 02:58:10.81
デスクトップクリックして Alt + F4 押して エンター押せば解決だ!
294:デフォルトの名無しさん
11/12/18 03:23:28.84
Winキーを押してすばやくUを2回押すとバックアップ取得できるよ
295:デフォルトの名無しさん
11/12/18 04:24:50.37
>>291
おまえはこの1時間で金では買えない貴重な体験をした
明日からがんばれ
296:デフォルトの名無しさん
11/12/18 05:06:32.28
Sub kk()
Dim a As Long, b As Long, c As Long, d As Long
a = 10
Do While Cells(a, 2) <> " "
If Cells(a, 1) >= 9 And Cells(a - 1) <= 8 And Cells(a, 2) = Cells(a - 1, 2) Then
If Cells(a, "N") = 1 Then
Cells(a, "Y").Copy = Cells(a, "AA")
Cells(a, "Z").Copy = Cells(a, "AB")
End If
If Cells(a, "N") = 1 Or 2 Or 3 Then
Cells(a, "Z").Copy = Cells(a, "AB")
End If
Else: Cells(a, "AF") = "TRUE"
End If
a = a + 1
Loop
End Sub
297:296
11/12/18 05:07:21.63
>>296ですが、エラー1004が出てしまいます・・・
アドバイスいただけないでしょうか?
298:デフォルトの名無しさん
11/12/18 05:24:31.13
>>296
ここ、
If Cells(a, 1) >= 9 And Cells(a - 1) <= 8 And Cells(a, 2) = Cells(a - 1, 2) Then
↓ こうじゃないの?
If Cells(a, 1) >= 9 And Cells(a - 1, 1) <= 8 And Cells(a, 2) = Cells(a - 1, 2) Then
299:デフォルトの名無しさん
11/12/18 05:26:00.71
>>296
これは、
If Cells(a, "N") = 1 Or 2 Or 3 Then
↓ たぶん、こう
If Cells(a, "N") = 1 Or Cells(a, "N") = 2 Or Cells(a, "N") = 3 Then
300:デフォルトの名無しさん
11/12/18 05:28:57.05
>>296
Copyの使い方がおかしい
Cells(a, "Y").Copy = Cells(a, "AA")
↓修正
Cells(a, "Y").Copy Cells(a, "AA")
または
Cells(a, "AA") = Cells(a, "Y")
301:デフォルトの名無しさん
11/12/18 08:50:31.31
>>285
数値から文字列への変換って意味ではそれ単なる暗黙の型変換だね
302:デフォルトの名無しさん
11/12/18 11:21:49.50
これはなぜエラーが出るの?
Sub Test()
ActiveSheet.ActiveCell = 1
End Sub
303:デフォルトの名無しさん
11/12/18 11:49:50.34
ActiveCellはActiveSheetのプロパティではないから
304:302
11/12/18 12:22:44.96
>>303
でもActiveCellはsheet一般のプロパティじゃないの?
そしてActiveSheetはsheet一般に属するんじゃないの?
以上から、ActiveCellはActiveSheetのプロパティになるんですけど。
305:デフォルトの名無しさん
11/12/18 12:36:07.79
>>302
URLリンク(officetanaka.net)
これを見る限り、「ActiveCellはsheet一般のプロパティ」じゃないっぽい
(ちなみに俺は>>303じゃないよ)
306:デフォルトの名無しさん
11/12/18 12:41:09.09
オブジェクトブラウザで確認しろ、ってことだな。
もしくは、一旦Sheet型に代入してからアクセスするとか。
307:デフォルトの名無しさん
11/12/18 14:27:30.83
変数を初期化する時に数値型なら0を入れるのが普通ですよね(まぁ特定のセルの値をそれに使うこともあるでしょうけど)
日付型の時って初期化はどうするんですか?
Dim hi_from As Date
で
hi_from = ""
としたら怒られちゃった^^;
308:296
11/12/18 14:27:36.53
>>298-300
おかげさまで解決しました。 ご丁寧にありがとうございましたー
309:デフォルトの名無しさん
11/12/18 14:33:48.23
>>307
>としたら怒られちゃった^^;
何のために初期化したいのか知らんけど、0 でも入れときゃいいんじゃね。
310:デフォルトの名無しさん
11/12/18 14:37:58.97
>>309
thx
311:デフォルトの名無しさん
11/12/18 14:52:54.06
>>307
この野郎!
おまえ何をやっとるんだ(怒)!!
みたいに怒られたのか?
それって誰によ?
312:デフォルトの名無しさん
11/12/18 14:57:58.13
>>304
>でもActiveCellはsheet一般のプロパティじゃないの?
違う
ApplicationまたはWindowのプロパティ
>そしてActiveSheetはsheet一般に属するんじゃないの?
違う
Application、WindowまたはWorkbookのプロパティ
>以上から、ActiveCellはActiveSheetのプロパティになるんですけど。
ならないからエラー出るんだよ
313:デフォルトの名無しさん
11/12/18 15:00:13.09
>>307
っていうかDimした時点で初期化されてるよ
314:312
11/12/18 15:04:30.79
あーすまん
ActiveSheetが返すのはWorksheetオブジェクトね
315:デフォルトの名無しさん
11/12/18 15:05:10.06
>>304
Excelのオブジェクトは階層構造になっている
Application - WorkBook(Application毎に複数) - WorkSheet(WorkBook毎に複数)
ActiveCell は最上位の Application オブジェクトのプロパティなので、Sheet オブジェクトから直接参照することはできない
やるならたぶん
ActiveSheet.Application.ActiveCell
となるはず
316:デフォルトの名無しさん
11/12/18 15:22:26.85
なんで MSDN とか見ないのか…
URLリンク(msdn.microsoft.com)
The following expressions all return the active cell, and are all equivalent.
ActiveCell
Application.ActiveCell
ActiveWindow.ActiveCell
Application.ActiveWindow.ActiveCell
317:デフォルトの名無しさん
11/12/18 16:00:58.06
じゃあActivecellの前には普通の人が使うような単語は書いちゃいけないのか?
XXXXX.Activecell みたいな形はない、と覚えておいてOK?
そしてこれらの法則は、Activebookや、Activesheetにも当てはまる?
つまり、Workbooks(2).Activesheet みたいな形はない?
318:デフォルトの名無しさん
11/12/18 16:16:36.14
>XXXXX.Activecell みたいな形はない、と覚えておいてOK?
ダメ
Application.ActiveCell
ActiveWindow.ActiveCell
>>312で「ApplicationまたはWindowのプロパティ」って書いたよね?
>>315とか>>316にも書いてあるよね?
>そしてこれらの法則は、Activebookや、Activesheetにも当てはまる?
法則とかの話じゃないし
>つまり、Workbooks(2).Activesheet みたいな形はない?
ある
>>312で「Application、WindowまたはWorkbookのプロパティ」って書いたよね?
319:デフォルトの名無しさん
11/12/18 16:31:28.44
>>317
> XXXXX.Activecell みたいな形はない、と覚えておいてOK?
Type YYYYY
ActiveCell As Integer
End Type
Dim XXXXX As YYYYY
みたいなケースは (やるかどうかは別にして) ありえるから、ダメ。
320:デフォルトの名無しさん
11/12/18 16:34:27.34
>>317
>じゃあActivecellの前には普通の人が使うような単語は書いちゃいけないのか?
ActiveCellプロパティを持つオブジェクトを書く
書かなければApplicationとみなされる
あと、とりあえず>>319は無視していい
321:デフォルトの名無しさん
11/12/18 16:51:48.87
Application
ActiveWindow
Application.ActiveWindow
この違いはなんなのでしょう?
誰か違いのわかる男(あるいは女)はいますか?
322:デフォルトの名無しさん
11/12/18 17:41:31.56
字数が異なります
323:321
11/12/18 17:50:13.70
ふざけるな
324:デフォルトの名無しさん
11/12/18 17:58:43.06
>>321
前提として
ApplicationはExcel自体
WindowはExcel内の子ウィンドウで、Book などに対応して作成される
Excelを起動すると、Applicationオブジェクトが作成される
Bookを作成すると、Applicationオブジェクト配下に、WorkbookオブジェクトとWindowオブジェクトが作成される
もう一つBookを作成すると、Applicationオブジェクト配下に、別のWorkbookオブジェクトと別のWindowオブジェクトが作成される
workbookは文書内容そのものを保持し、Windowはドキュメント内容以外の状態や表示設定(Book単位のActiveCellや画面の拡縮率など)を保持する
ActiveなBook(ActiveWorkbook)を切り替えると、ApplicationオブジェクトのActiveWindow、ActiveCell、ActiveChartなども一式自動的に切り替わる
で、
Application は、ActiveSheet.Applicationの省略形で、Excel全体を表すApplicationオブジェクトを指す
Application.ActiveWindowは、Excel内のアクティブなWindowオブジェクトを指す(workbookを切り替えるとWindowオブジェクトも切り替わる)
ActiveWindow は、Application.ActiveWindow の省略形で、Application.ActiveWindow と同じ
おそらく内部では、
Application.ActiveCell を参照したとき、Application.ActiveWindow.ActiveCell を返すような実装になってるはずなので、
ActiveCell
Application.ActiveCell
ActiveWindow.ActiveCell
Application.ActiveWindow.ActiveCell
の4つは常に同一になるはず
325:デフォルトの名無しさん
11/12/18 18:32:16.70
2つのオブジェクトが同一かどうか調べる方法ってあるのかな?
たとえば
Set ObjA = ActiveCell
Set ObjB = Application.ActiveWindow.ActiveCell
If ObjA = ObjB Then …
みたいな感じで
326:321
11/12/18 18:42:08.92
>>324
ご丁寧なご説明ありがとうございます。
かなりわかってきたような気がします。
>>322のアホとは違いますね。
つこてる豆が違います。
こういう基本的とも思えることまで解説した本などがあればいいのにね。
327:デフォルトの名無しさん
11/12/18 19:02:29.27
>>325
実際に試したら
書いているとおりのコードで調べることができましたよ。
Sub Test()
Dim objA As Object
Dim objB As Object
Set objA = ActiveCell
Set objB = Application.ActiveWindow.ActiveCell
If objA = objB Then
Stop '<=ここで止まった。
End If
End Sub
328:デフォルトの名無しさん
11/12/18 19:06:04.93
"つこてる豆が違います" の検索結果が見つかりませんでした。
つ こ てる 魔 眼 が 違います の検索結果を表示しています。
Bingワロタw
329:デフォルトの名無しさん
11/12/18 20:41:28.74
なぞなぞ
Debug.Print ActiveCell Is ActiveCell
の結果はFalse。さて理由は?
330:デフォルトの名無しさん
11/12/18 20:52:33.37
>>327
ダウト。これ試してみ
Sub Test()
Dim objA As Object, objB As Object
Set objA = Range("A1")
Set objB = Range("B2")
If objA = objB Then Debug.Print "同じ"
End Sub
331:327
11/12/18 21:22:50.30
>>330
If objA = objB Then
でレンジを入れたオブジェクト変数を比較すると、
objAとobjBのValueで比較するみたいですね。
上記コードに
else
Debug.Print "違う"
を付け加えて、セルに違う値入れて実行したら"違う"になりました。
あとは例えば比較対象をobjA.AddressとobjB.Addressにすると"違う"と判別されましたし、
A1とB2で書式設定を違うものにしたら
objA.NumberformatとobjB.Numberformatの比較も"違う"という結果になります。
332:デフォルトの名無しさん
11/12/18 21:29:46.45
>>329
ひょっとして、
ActiveCellが返すRangeオブジェクトは現在の選択座標をもとに都度新規に作成されるとかそういう話?
333:デフォルトの名無しさん
11/12/18 21:34:17.84
それを言うなら
Range("A1") Is Range("A1")
もFalseだね
334:デフォルトの名無しさん
11/12/18 21:39:41.65
>>329
これ前から謎だったんたよな
正解を教えてくれると助かる
で自分なりに出した答えは
セルの参照先は一緒だけどRangeオブジェクト(インスタンス?)が違うから
下と同じ原理かなと思う
Set objA = Range("A1")
Set objB = Range("A1")
Debug.Print objA Is objB
Set objA = Range("A1")
Set objB = objA
Debug.Print objA Is objB
前者はFalse だけと 後者はTrue
335:デフォルトの名無しさん
11/12/18 22:45:17.52
ヒント
Set objA = Worksheets(1)
Set objB = Worksheets(1)
Debug.Print objA Is objB
これはTRUE
336:デフォルトの名無しさん
11/12/18 23:16:30.48
うわあ・・・
337:デフォルトの名無しさん
11/12/18 23:22:59.09
別のプロシージャに配列渡してその値変えたら元も変わる?
338:デフォルトの名無しさん
11/12/18 23:25:51.03
ちょっと試せばすぐにわかるのに
339:334
11/12/18 23:27:21.13
>>335
これは
シートオフジェクトは最初からあるからだったりするのか?
VBEでみるとシートオフジェクトが見えるし
340:334
11/12/18 23:30:23.28
シートオフジェクト ってなんだよ(笑)
シートオブジェクト だった
341:デフォルトの名無しさん
11/12/18 23:33:39.87
VBAからVBEのユーザーフォームデザイン編集画面でツールボックスを右クリックして「その他のコントロール」を選択した時にでるダイアログの
「利用可能なコントロール」を制御する事は可能ですか?
制御は出来なくても利用可能か調べたりチェックされているかどうか調べる方法でも良いです
342:デフォルトの名無しさん
11/12/19 00:01:49.44
>>338
あなたのVBA力と回答力を試しているんですが
343:デフォルトの名無しさん
11/12/19 02:24:24.73
VBAでIEのHTML表示領域の幅と高さを調べたいのですが
どうすればよいでしょうか?
HTMLDocument の HeightやWidthですと
IEのウインドウ幅と高さの取得になってしまいます。
344:デフォルトの名無しさん
11/12/19 02:30:36.62
tree viewを使用し、配列gets(n,m)のツリーを作成しようと思ったのですが
n = 0
m = 0
Do While gets(n, m) <> ""
thttp = gets(n, 0) '親カテゴリ
TreeView1.Nodes.Add , , thttp, thttp, "oya"
m = 1
Do While gets(n, m) <> ""
sthttp = Split(gets(n, m), "/") '子カテゴリFormat = KEY/TITLE
TreeView1.Nodes.Add thttp, tvwChild, sthttp(0), sthttp(1), "child"
m = m + 1
Loop
n = n + 1
m = 0
Loop
gets(n,m)はm=0が親カテゴリ m>0が子カテゴリで
親カテゴリ(n,0)は 単語 が格納されて、子カテゴリ(n,m)m>0には KEY/単語 が格納されています
空白の要素を余分に持っているため <> "" で飛ばしています
親カテゴリ(n,0)の要素が空白になった時終了するようにしているのですが
実行すると実行エラー35602 "Key is not unique in collection"と出てツリーが作成できません
345:デフォルトの名無しさん
11/12/19 02:46:08.20
同じkeyが指定されてるんじゃね
346:デフォルトの名無しさん
11/12/19 03:14:42.05
keyは親子の関係なく 一意でないと いけなかったと思ったけどそうなってる?
347:デフォルトの名無しさん
11/12/19 03:20:57.96
>>345-346
ご指摘通りでした
配列の内容を見直しましたところ同じKEYの物がありました
ありがとうございます
348:デフォルトの名無しさん
11/12/19 03:34:19.11
>>343
scrollHeight, scrollWidth
349:デフォルトの名無しさん
11/12/19 04:23:13.62
>>343
表示領域とは?
>>348 以外に
ClientWidth ClientHeight
もあるが
350:デフォルトの名無しさん
11/12/19 09:29:22.69
>>334
Isってメモリのアドレスを比較してるんだよ。
Set objA = Range("A1")
Set objB = Range("A1")
Debug.Print objA Is objB
って
Set objA = Range("A1")
Set objB = Range("A1")
Debug.Print ObjPtr(objA) = ObjPtr(objB)
と同じ。
351:デフォルトの名無しさん
11/12/19 16:15:11.69
どういう時にインスタンスが複製されるのかよくわからんちん
352:デフォルトの名無しさん
11/12/19 20:07:31.39
>>351の言う複製の意味がよくわからんちん
353:デフォルトの名無しさん
11/12/19 23:12:18.80
public変数使わない方が良い理由が分からん
354:デフォルトの名無しさん
11/12/19 23:20:55.81
>>339-340
>シートオフジェクトは最初からあるからだったりするのか?
多分そう。
Cell オブジェクトなんてものがあれば、Cells("A1") Is Cells("A1") が
True になるかもしれないけど、VBA には、Cell オブジェクトはなくて、
(*仮に単一のセルだとしても) 常にRange オブジェクトになってしまう。
Range オブジェクトは、当然範囲の情報を持つ必要があるので、
Obj = ActiveCell とやる度に、各々別の Range オブジェクトが「生成」される。
と言うのが、>>329 の答えだと思う。