5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

Excel VBA質問スレ Part10

1 :デフォルトの名無しさん:2009/02/23(月) 04:56:43
ExcelのVBAに関する質問スレです

前スレ http://pc11.2ch.net/test/read.cgi/tech/1228372971/

★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)

2 :デフォルトの名無しさん:2009/02/23(月) 04:57:08
過去スレ
01 http://pc11.2ch.net/test/read.cgi/tech/1054356121/
02 http://pc11.2ch.net/test/read.cgi/tech/1168308855/
03 http://pc11.2ch.net/test/read.cgi/tech/1180192018/
04 http://pc11.2ch.net/test/read.cgi/tech/1189814602/
05 http://pc11.2ch.net/test/read.cgi/tech/1197448064/
06 http://pc11.2ch.net/test/read.cgi/tech/1205231499/
07 http://pc11.2ch.net/test/read.cgi/tech/1212587819/
08 http://pc11.2ch.net/test/read.cgi/tech/1219673793/
09 http://pc11.2ch.net/test/read.cgi/tech/1228372971/

3 :デフォルトの名無しさん:2009/02/23(月) 09:36:10
あー、またコピペしちゃったよ、この馬鹿

4 :デフォルトの名無しさん:2009/02/23(月) 18:19:49
On Error Resume Nextってことで

5 :デフォルトの名無しさん:2009/02/23(月) 18:23:07
投げっぱなしにするな
インラインで処理しろ

6 :デフォルトの名無しさん:2009/02/24(火) 06:04:01
淫乱で処理?

7 :デフォルトの名無しさん:2009/02/24(火) 17:27:40
イランで再処理?

8 :デフォルトの名無しさん:2009/02/24(火) 18:47:53
On Error GoTo 0ってことで

9 :デフォルトの名無しさん:2009/02/24(火) 19:55:52
Newって昔のBASICだとソースプログラム消去なんだよな。
一番使い方の変わった予約語の一つだろうな。
F5で実行ってのはPC-8001の時代から変わってないのが面白い。

10 :デフォルトの名無しさん:2009/02/24(火) 22:21:08
多次元連想配列というか、dictionaryに配列挿入して捜査は無理ですか?
自作関数作ったりしたんだけど、やっぱりobjメソッドで配列を取りだして操作ができなくて。
何かに使うとかではなくて、好奇心なのでお気軽な回答を頂ければ幸いです。

11 :デフォルトの名無しさん:2009/02/24(火) 23:08:05
よくわからん、具体的なコードで

12 :デフォルトの名無しさん:2009/02/25(水) 00:42:33
こんなか?
Option Explicit
call hoge
call hogehoge

sub hogehoge()
Dim a(2)
a(0)="apple"
a(1)="berry"
a(2)="cucumber"
dim d
set d=CreateObject("Scripting.Dictionary")
d.add(1),a
dim f
for each f in d(1)
wscript.echo f
next
end sub
sub hoge()
Dim a
a=Array("apple","berry","cucumber")
dim d
set d=CreateObject("Scripting.Dictionary")
d.add(1),a
dim f
for each f in d(1)
wscript.echo f
next
end sub

13 :デフォルトの名無しさん:2009/02/25(水) 02:50:47
>>12
何の言語?

14 :デフォルトの名無しさん:2009/02/25(水) 06:02:29
ある列に下と同じ文字があればそのセルの下にあるラインの消去を行う。
また、ある列に上の値と同じ文字があれば行の高さを80とする


ある列に下と同じ文字があればそのセルの下にあるラインの消去を行う。
また、ある列に上の値と同じ文字があれば行の高さを80とする
プログラムを作ったが動きません。
どこが間違っているのか、だれか教えてください。

For N = 1 To LastRaw 'LastRaw は最終行
If WorkSheets("OutPut").cells(N,12).value = WorkSheets("OutPut").Cells(N+1,12).value
Then WorkSheets("OutPut").Cells(N,12).xlEdgeBottom = False

ElseIf WorkSheets("OutPut").cells(N,12).Value <> WorkSheets("OutPut").cells(N+1,12).value And
WorkSheets("OutPut").Cells(N,12).value <> WorkSheets("OutPut").Sells(N-1,12).value
Then
Rows("N:N").Select
Selection.RowHeight = 80
End If
Next

エクセル 2003 XP です。

15 :デフォルトの名無しさん:2009/02/25(水) 06:08:31

誤 また、ある列に上の値と同じ文字があれば行の高さを80とする
正 また、ある列に上の値と同じ文字が無くまた 下にも無ければ、行の高さを80とする


16 :デフォルトの名無しさん:2009/02/25(水) 08:27:14
>>14
1 With Worksheets("OutPut")
2   For N = 1 To LastRaw 'LastRaw は最終行
3     If .Cells(N, 12) = .Cells(N + 1, 12) Then
4       .Cells(N, 12).Borders(xlEdgeBottom).LineStyle = xlNone
5     ElseIf .Cells(N, 12) <> .Sells(N - 1, 12) Then
6       .Rows("N:N").RowHeight = 80
7     End If
8   Next
9 End With

1行目 全体をWithで囲めば、いちいちワークシートを指定しなくてもよくなる
3行目 Valueは省略可能。ただしこれは初心者にはおすすめしない
4行目 罫線の消し方はマクロの記録で調べる
5行目 この時点で下とは違うことが判明してるから上だけ調べればいい
6行目 いちいちSelectしない。ワークシートの指定が抜けてる
あと、行番号(左端の数字)は消さなくても丸ごとコピペで動くよ

17 :デフォルトの名無しさん:2009/02/25(水) 08:32:02
ごめん。タイプミスとかあったんで上げ直し

With Worksheets("OutPut")
  For N = 1 To LastRaw 'LastRaw は最終行
    If .Cells(N, 12) = .Cells(N + 1, 12) Then
      .Cells(N, 12).Borders(xlEdgeBottom).LineStyle = xlNone
    ElseIf .Cells(N, 12) <> .Cells(N - 1, 12) Then
      .Rows(N).RowHeight = 80
    End If
  Next
End With

18 :デフォルトの名無しさん:2009/02/25(水) 08:35:35
  For N = 2 To LastRaw 'LastRaw は最終行
       ↑
にしないと、1行目と2行目が違ってた時に0行目を調べようとしてエラーになる

19 :デフォルトの名無しさん:2009/02/25(水) 08:48:28
>>14
VBAって論理式のショートサーキットしないんだっけ?
だとしたらこうかな?1行目の扱いが今ひとつ不明なんでループから出した。
With Worksheets("OutPut")
  If .Cells(1, 12) = .Cells(2, 12) Then
    .Cells(1, 12).Borders(xlEdgeBottom).LineStyle = xlNone
  EndIf
  For N = 2 To LastRaw 'LastRaw は最終行
    If .Cells(N, 12) = .Cells(N + 1, 12) Then
      .Cells(N, 12).Borders(xlEdgeBottom).LineStyle = xlNone
    ElseIf .Cells(N, 12) <> .Cells(N - 1, 12) Then
      .Rows(N).RowHeight = 80
    End If
  Next
End With

20 :デフォルトの名無しさん:2009/02/25(水) 08:49:52
うわ、逆だった…
With Worksheets("OutPut")
  If .Cells(1, 12) <> .Cells(2, 12) Then
    .Cells(1, 12).Borders(xlEdgeBottom).LineStyle = xlNone
  EndIf
  For N = 2 To LastRaw 'LastRaw は最終行
    If .Cells(N, 12) = .Cells(N + 1, 12) Then
      .Cells(N, 12).Borders(xlEdgeBottom).LineStyle = xlNone
    ElseIf .Cells(N, 12) <> .Cells(N - 1, 12) Then
      .Rows(N).RowHeight = 80
    End If
  Next
End With

21 :デフォルトの名無しさん:2009/02/25(水) 08:53:05
まだおかしい。何度もすまん。こんどこそ…
With Worksheets("OutPut")
  If .Cells(1, 12) = .Cells(2, 12) Then
    .Cells(1, 12).Borders(xlEdgeBottom).LineStyle = xlNone
  Else
    .Rows(1).RowHeight = 80
  EndIf
  For N = 2 To LastRaw 'LastRaw は最終行
    If .Cells(N, 12) = .Cells(N + 1, 12) Then
      .Cells(N, 12).Borders(xlEdgeBottom).LineStyle = xlNone
    ElseIf .Cells(N, 12) <> .Cells(N - 1, 12) Then
      .Rows(N).RowHeight = 80
    End If
  Next
End With

22 :デフォルトの名無しさん:2009/02/25(水) 11:54:02
試してから書き込め

23 :デフォルトの名無しさん:2009/02/25(水) 14:30:58
セルA1〜セルA10にある一次元の要素と
セルZ1〜セルZ10にある一次元の要素を

一つの二次元配列に格納する方法を教えてください><

24 :デフォルトの名無しさん:2009/02/25(水) 14:42:25
>>23
dim v() as variant
dim i as long

v()=range("A1").resize(10,2).value
for i=1 to 10
  v(i,2)=cells(i,"Z").value
next i

25 :デフォルトの名無しさん:2009/02/25(水) 17:50:38
VBAはショートサーキットしないね。(現状では)

26 :デフォルトの名無しさん:2009/02/25(水) 17:50:59
グラフのマーカをRGB関数で現したいです

ネットでも『RGB関数を使うと近い色になる』との答えが多く、
自分でも試したのですがその通りでした

良い方法があればご教授ください
OSはXP エクセルは2003です

27 :デフォルトの名無しさん:2009/02/25(水) 17:52:31
VBAから秀丸マクロを呼び出すことって可能ですか?

28 :デフォルトの名無しさん:2009/02/25(水) 18:13:30
RSS.EXEを起動していないなら、RSS.EXEを実行するというマクロ
を書いてください。よろしくお願いします。


29 :デフォルトの名無しさん:2009/02/25(水) 18:28:33
お断りします。

30 :デフォルトの名無しさん:2009/02/25(水) 19:55:57
書けもしない香具師の、わざわざの断り口上、ごくろうwww



31 :デフォルトの名無しさん:2009/02/25(水) 20:56:43
Absolutely not.

32 :デフォルトの名無しさん:2009/02/25(水) 21:25:09
>>26
ヒント パレット

33 :デフォルトの名無しさん:2009/02/25(水) 21:35:11
>>27
可能です。

34 :デフォルトの名無しさん:2009/02/25(水) 21:42:25
どうやれば呼び出せますか?

35 :デフォルトの名無しさん:2009/02/25(水) 23:36:51
>>28
そのロジックはまずいよ
> RSS.EXEを起動していないなら、RSS.EXEを実行するというマクロ
の途中でもしRSS.EXEが起動したら2重起動になっちゃう

36 :デフォルトの名無しさん:2009/02/25(水) 23:54:14
>21
ありがとうございました。
参考にして 成功しました。

37 :26:2009/02/25(水) 23:59:13
カラーパレットは56色までなので無理という事でしょうか?
以下のマクロできれいなグラデーションの様なグラフを作成したいのです

Sub test()
Dim aaa As String
Dim i As Integer

aaa = ActiveSheet.Name

'仮データ作成(1列目に1〜225の数字を入れる−−−−−−−−−−−−−−−−−−−−−−−
For i = 1 To 225
Cells(i, 1) = i
Next

'グラフ作成−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
Columns("A:A").Select
Charts.Add
ActiveChart.ChartType = xlXYScatter
ActiveChart.SetSourceData Source:=Sheets("Sheet3").Range("A1:A225"), PlotBy _
:=xlColumns
ActiveChart.Location Where:=xlLocationAsObject, Name:=aaa
ActiveChart.HasLegend = False

'マーカの色付け−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
For i = 1 To 225
ActiveChart.SeriesCollection(1).Points(i).Border.Color = RGB(0, i, 225)
ActiveChart.SeriesCollection(1).Points(i).MarkerBackgroundColor = RGB(0, i, 225)
ActiveChart.SeriesCollection(1).Points(i).MarkerForegroundColor = RGB(0, i, 225)
Next

End Sub


38 :デフォルトの名無しさん:2009/02/26(木) 00:15:11
>>37
フルカラー使いたいなら画像を貼り付けるかExcel2007に乗り換え

39 :デフォルトの名無しさん:2009/02/26(木) 00:24:59
>>35
このマクロを必要とする場面は、RSS接続をせずに現在使用中のマクロを実行すると
外部接続確認メッセージの応答を300回しなければならなくなるのを回避するためです。
2重起動は、RSS.EXEの場合は、やっても問題は発生していませんので、気にしてません。

shellと変数名の扱い方が肝腎かなとは思っているのですが、さっぱり、出来なくなっている
のでここに来ました。


40 :デフォルトの名無しさん:2009/02/26(木) 00:35:32
>>39
基本、アプリの起動確認はAPI使わないと無理。まずはこのあたり読んで勉強汁
ttp://www.happy2-island.com/excelsmile/smile04/capter00302.shtml

41 :39:2009/02/26(木) 15:53:02
>>40
サンクス。踏ん切りがつきました。APIでやります。


42 :デフォルトの名無しさん:2009/02/26(木) 19:21:46
それってExcelのDDEInitiate(app, topic)でやってる話じゃないの?
appがなければ起動する。
その場合appがPATHにないと失敗する。
なので、RSS.EXEのショートカットを作って
ファイル名をapp.lnk、RSS.EXE.lnkかRSS.lnkか、にして
PATHに置けば済む話とちゃう?


43 :39:2009/02/26(木) 20:34:24
http://office.microsoft.com/ja-jp/access/HA012288201041.aspx
を読むと、返値がとらえられるということなので、そうゆう話です。

DDEInitiateやDDEの初期化に関することも、他の場面で調べてたことはあるのですが
いつも、形にならないまま終わってしまうので、ついつい、丸投げ質問形になります。
土日になりますが挑戦してみます。


44 :デフォルトの名無しさん:2009/02/26(木) 21:51:25
>>40
嘘つくな。wshの方が簡単。
ttp://www.atmarkit.co.jp/fwin2k/operation/wsh05/wsh05_03.html


45 :デフォルトの名無しさん:2009/02/26(木) 22:05:12
      ,.=-''' ̄ ̄ ̄ ̄ ̄ ̄` -、
    /               \
   ./                 .\
   {                   }
   .|   / ̄""''-=,,,,_,,,,,,==-'''"\  |
   .l,  .(  ,. - ' .、     ,. - ,  .} |
   l   > ,=ニ\ ゛ | ''゛_,=ヘ、 r' {_
  /~''i //_\_..`7| l、{''″/__`>ヽ |r`i
  l .{`|./ ヽ二・ニゝチ、 ! .ゝrニ・二r  } ! i l
  { {(l {      ノ | | ヽ   ::  }| ソ/
  ヽヽ|.{    /  | |  \    i.|//
   \|.i   /  ,,.. | l._,, . \  i !/
    乂i  /    - (__,)-゛   ' {丿
    .l .!、.      ,. !.,  .,   / |
    人 \   .!''''" ̄~ ̄`''!  / 人
   ./ | .\ ,\  '-"" ゛-'  / / | .ヽ
  ノ  .{  \ .ヽ,.,   .:   ,イ /  }  ヽ
-'″  l    `' 、`.───″    .}    ヽ

46 :デフォルトの名無しさん:2009/02/26(木) 22:54:05
>>44
それは
> RSS.EXEを起動していないなら
の答えになってないだろ?

47 :デフォルトの名無しさん:2009/02/26(木) 23:40:33
>>46
全般的な使い方じゃなくて、
このこの方法で起動した分だけ気にすると言う要件なんじゃないの?

48 :デフォルトの名無しさん:2009/02/27(金) 02:16:49
何を言ってるのか全然わかりません

49 :デフォルトの名無しさん:2009/02/27(金) 15:44:21
わからないときはするーしよ

50 :デフォルトの名無しさん:2009/02/27(金) 16:54:21
>>47
勝手に条件不可するなや

51 :デフォルトの名無しさん:2009/02/27(金) 17:12:53
和文解釈能力と和作文能力には相関関係ありや?

52 :デフォルトの名無しさん:2009/02/28(土) 00:15:42
OS:Win98 2000 XP 2003server vistaで
Ver:Excel2000 2003 2007についての質問です。

VBAはコードサイズに限界がある(?)のであまり複雑な事はさせられない
という話を聞いたのですが、具体的にどのくらいなのでしょうか?

コマンドボタンやテキストボックス等にイベントをガシガシ記述していたら
ワークシートへの入力がほとんどないにもかかわらず気が付いたらファイルサイズが1MBを超えていました
このくらいならどうという事はないと思うのですが、ふと気になりました。

よろしくお願いします。

53 :デフォルトの名無しさん:2009/02/28(土) 09:01:12
300MB超えるときつい。

54 :デフォルトの名無しさん:2009/02/28(土) 13:07:42
入門書は大村あつしのがいちばん分かりやすいんですか?

55 :デフォルトの名無しさん:2009/02/28(土) 13:49:24
>>54
へたくそでもとにかく動けばいいってレベルを目指すならいいんじゃない?

56 :デフォルトの名無しさん:2009/02/28(土) 14:06:01
入門書なら谷尻かおりがいいよ。
概念も説明してくれるので、プログラム初心者でも読めるから。
他のは使い方の説明ばっかで使い物にならない。
最近はvbaの入門書を探したときないから、
このごろ出版されたものについてはどうだか知らないけど。

57 :デフォルトの名無しさん:2009/02/28(土) 14:09:29
ちなみに、大村あつしがダメって意味ではない。
大村あつしの本を使ったことがないだけ。

58 :デフォルトの名無しさん:2009/02/28(土) 17:30:59
本って使うものなのか

59 :デフォルトの名無しさん:2009/02/28(土) 17:56:59
枕とか?

60 :デフォルトの名無しさん:2009/02/28(土) 18:02:48
使うだろ

61 :デフォルトの名無しさん:2009/02/28(土) 23:02:38
文学書は読むが技術書は使うだろ?

62 :デフォルトの名無しさん:2009/02/28(土) 23:41:49
エロ本もな

63 :デフォルトの名無しさん:2009/03/01(日) 00:11:03
俺の場合
拝むな

64 :デフォルトの名無しさん:2009/03/01(日) 00:15:25
技術書を1回読んで終わりってパターンはあるな。

65 :デフォルトの名無しさん:2009/03/01(日) 10:09:34
誰が書いた本でも良いから、初級→中級→上級 と、3冊くらい読むのが良いよ。
レベルアップして行くのは当然として、3冊読んでみると同じ事が書かれているのが分かると思う。
「これ読んだからいらねー、飛ばそ」 じゃなくて、同じ内容を復習も兼ねて読んでみる事。

同じ事が書かれているって事は、それだけ重要な概念って事だからね。
あと、実例集やサンプル集は買う必要無い。裏ワザ系の本もいらない。
他の人が作ったプログラムを改編するだけじゃ自分の物にならない。

んで、基本的な概念が理解出来たならば、自分の業務に特化した本を買いあさると良いよ。
(今はネットで調べる方が便利だけど)

66 :デフォルトの名無しさん:2009/03/01(日) 12:36:09
>>65
VBAに中級とか上級とかの本があるかねえ・・・?

67 :デフォルトの名無しさん:2009/03/01(日) 14:33:22
谷尻かおりだか誰だか忘れたがとにかく女性の書いた本だったと思うが、中身を本屋で立ち読みしたらかなり下手糞だった。
やっぱ女は駄目だなと思ったよ。



68 :デフォルトの名無しさん:2009/03/01(日) 17:39:05
奈良お前が書いてミロのビーナス
こき下ろすだけなら馬鹿でもできる

69 :デフォルトの名無しさん:2009/03/01(日) 18:18:28
そんなのイランの核開発

70 :デフォルトの名無しさん:2009/03/01(日) 19:32:33
>>66
マクロって何?なレベルの本

OBJや変数が分かるレベルの本

VBSやWIN32APIの呼び方が分かるレベルの本

業務で必要なジャンルに特化した本

な感じで良いんでないかい?

71 :デフォルトの名無しさん:2009/03/01(日) 20:18:29
>>70
> マクロって何?なレベルの本
> ↓
> OBJや変数が分かるレベルの本
> ↓
> VBSやWIN32APIの呼び方が分かるレベルの本
ここまで、ピンクいろのざっくりした入門書に載ってたレベルじゃね?

72 :デフォルトの名無しさん:2009/03/01(日) 22:56:51
教えてください。
A1に1入れたらB1に丸一個
A2に2を入れたらB2に丸二個というようにAに数字を入れたら自動でBに○を数字分いれる式を作りたいのですがどのようにすればよろしいでしょうか。


73 :デフォルトの名無しさん:2009/03/01(日) 23:22:00
>>72
>>1
>★2 ExcelのVBA以外の部分に関する質問はNGです。
>   但し、VBA無しでも出来ることだが、あえてVBAでやりたいって物に関してはOK。

74 :デフォルトの名無しさん:2009/03/01(日) 23:41:58
>>72
=LEFT("○○○○○",A1)

75 :デフォルトの名無しさん:2009/03/02(月) 00:19:30
>>74
このコードはアツイ。
煽りじゃなくて、マジでこの考え方好きだ。

76 :デフォルトの名無しさん:2009/03/02(月) 07:37:35
うん、おもしろいw
でも○が5個までしか表示できない件について。
rept関数にすれば幸せw

77 :デフォルトの名無しさん:2009/03/02(月) 11:21:27
発想の転換とか出来るやつはマジ羨ましい

78 :デフォルトの名無しさん:2009/03/02(月) 23:29:54
無駄な転換をしてしまうのはどうかと
この場合、ワークシート関数のREPT、VBA関数のStringと
目的そのままの関数があるのに、わざわざ弊害がある方法へと転換しなくても・・・・・

79 :デフォルトの名無しさん:2009/03/03(火) 12:33:41
S=""
For I = Cells(1, 1)
 S = S + "○"
Next
Cells(2, 1) = S

80 :デフォルトの名無しさん:2009/03/03(火) 13:48:07
>>79
1個前のレスぐらい読めよ

81 :デフォルトの名無しさん:2009/03/03(火) 21:51:12
>>79
なんつーでたらめw

82 :デフォルトの名無しさん:2009/03/03(火) 22:01:26
マクロを起動するとOUTLOOKで特定の相手にメールを送る処理って作れませんか?
OSはXP、EXCELは2003です。

83 :デフォルトの名無しさん:2009/03/03(火) 22:03:33
多分それが
発想の転換なんだと思っているんだと
思う

84 :謝礼男:2009/03/03(火) 22:17:41
解決してくれた方にはマジで現金振込みで謝礼します。
解決スピードにもよりますが2万なら余裕で出せます。というかそれ以上に困ってます。

助けてください。クビになりそうです。
マクロあんまり詳しくないのにネットで探していじってたらわからなくなりました。

■現状:会社の機密書類に誤ったPASSをかけてしまいファイルが開けず困っています。明日取引先のプレゼンで使う資料が多数あって明日朝までに開けないとマジで上司に殺される。てかクビ。
■背景:上司のPCのエクセルファイルに全部passをかけてと頼まれたが1000個くらいあったので、マクロを使ってpassをかけようとした。途中までは順調だったが途中からpassが謎なものになってしまい、開けない。
■行動:とりあえずありえそうなpassは入力。フリーソフトでpass解読試みるが解読できず。
■依頼:可能性としてマクロが誤作動したのが原因ではないかと考えられるため、マクロ詳しい方にありえそうな誤作動ぶりを解明して、パスを解明してもらいたい。詳細は↓



85 :謝礼男:2009/03/03(火) 22:18:20
■詳細:簡単に説明すると 
指定したフォルダ(D1)にあるエクセルファイルに指定のpass(C4)をかけるというマクロ
また別のマクロを使ってD列にはPC内のフォルダを列挙しており、上記作業が終われば次のフォルダに移動する。
で、実行したのが以下のマクロ

86 :謝礼男:2009/03/03(火) 22:18:46
Private Sub CommandButton1_Click()
Dim c As String
Columns("A:B").Select
Selection.ClearContents
Range("C1").Select
Selection.ClearContents
Range("A1").Select
a = Range("D1")
b = Dir(a & "\*", 2)
ChDir a
For l = 1 To 300
If b <> "" Then
Cells(l, 1).Value = b

87 :謝礼男:2009/03/03(火) 22:19:32

If (Right(b, 3) = "xls") Or (Right(b, 3) = "XLS") Then
c = a & "\" & b
On Error Resume Next
Workbooks.Open (c)
If Err.Number = 0 Then
Workbooks(b).Activate
ActiveWorkbook.SaveAs Filename:=c, _
FileFormat:=xlNormal, _
Password:=Range("C4").Value, WriteResPassword:="", ReadOnlyRecommended:=False, _CreateBackup:=False, _
ConflictResolution:=True
Workbooks(b).Close
Cells(l, 2) = "○"
Else
Cells(l, 2) = "×"
End If
Else
Cells(l, 2) = "×"
End If
b = Dir(, 2)
Else
l = 300
End If
Next
Cells(1, 3) = "終了"
Range("D1").Select
Selection.Delete Shift:=xlUp
End Sub


88 :謝礼男:2009/03/03(火) 22:20:35
■実際にした作業
・当初:マクロのとおり。ボタンクリックして、置き換えますかのyesをクリックして次へ次へ。
・途中1:そもそもパスがかかっているやつがあってそのファイルを開くpass入力求められたときは
面倒だったのでescおしてpass入力画面消して、置き換えますかのyesボタンも面倒になったのでyキー連打。
・途中2:さらにマクロ実行のコマンドボタン押すのが面倒になったので、マクロにショートカットキーをつけることに。
プライベートサブにショートカットのつけ方がわからず、
以下のマクロをプライベートサブではなくて普通のモジュールのマクロとして保存(macro1)し、macro1にショートカットキーを付加。ちなみにショートカットは ctrl+y
・途中3:↑のショートカットを使いctrl+yおしてescとyを連打する作業。

そしてその結果わかったのが。
プライベートサブでなくしてからは、passがかかっていない。(ほぼ全部)
しかし、時々passがかかっていて、なおかつ指定したpassではなくなっていた。

ってな感じでpassがわからなくなりました。
長文駄文失礼しましたが、本当に困っており、助けてくれる方をお待ちしています。
本気で謝礼いたしますので、なにとぞよろしくお願いします。

ちなみにwin2000のエクセルはなぜか97でした・・・・・

89 :デフォルトの名無しさん:2009/03/03(火) 22:41:56
>>88

新規ブックに

Private Sub Workbook_Open()

MsgBox "一身上の都合により退職させていただきます。" + vbCrLf + _
"僕の事は探さないで下さい。[2009/3/3]"

End Sub

90 :デフォルトの名無しさん:2009/03/03(火) 22:47:29
解決ですな。

91 :デフォルトの名無しさん:2009/03/03(火) 22:49:41
ざっくりと見たところ、対象xlsのC4セルでパスワードかけるんじゃね。これ。
なので、「元エクセルのC4の内容」が必要かと・・・

パス有xls触ったこと無いが・・・
デバッグで対象xls開いた後のC4が元パスになってるか見てみてくれ。



92 : ◆Q7C7fXiwHY :2009/03/03(火) 22:51:46
>>84-88
シートモジュールにマクロを置いた場合、Range("C4").Valueはそのモジュールが属するシートのC4になるが
標準モジュールにマクロを置いた場合、Range("C4").Valueはアクティブシート、つまりこのコードでは
パスを掛ける対象ブックのアクティブシートのC4になる

パスを掛けたブックの内容が解らないと、具体的なパスの予測は不可能
多少なりとも内容を覚えているか予測できるなら、その値を試してみることだ

ブックを送ってくれるなら、そこらのフリーソフトより強力な強制解除を試してみても良いが、
機密書類と言うからにはそれは無理だろうし、強制解除は不正にも使えてしまうから、
強制解除方法自体を教えるのも無理だ

それに、その背景と現状でバックアップすら無いなら責任は上司の方が重いぞ

93 :デフォルトの名無しさん:2009/03/03(火) 22:51:49
んで、解決方法だが、
Public void TaisyokuProc()みたいな処理が必要かと。

元xlsねーのか?

94 :謝礼男:2009/03/03(火) 22:53:18
>>91
糸口サンクス。
しかし、C4には本来のpass(仮にabc)がはいったままなんだが
開かないファイルはそのパス(abc)にはなっていないんだ。
ちなみに当初成功した分ははabcで開きます。

95 :デフォルトの名無しさん:2009/03/03(火) 22:54:37
OpenOfficeをダウンロードして、Excelファイルを開いてみたら?
もし、開けたら別名で保存。


96 :>>91:2009/03/03(火) 22:55:30
>>91
ん〜とね、

ActiveWorkbook.SaveAs Filename:=c,
FileFormat:=xlNormal, _
Password:=Range("C4").Value,

ここのrange(c4)が対象ExcelのC4内容ではないの?という意味。
つまり、対象C4で暗号化してるんではないかと・・・

97 :謝礼男:2009/03/03(火) 22:56:20
>>92
ありがとうございます。
91さんのおっしゃっていた事もこれ読んでちゃんと理解できました。
プライベートじゃないから 元エクセルを参照してしまったということなんですね。
自分の無知具合に唖然です。
正直元ファイルの内容はほぼわからないので、解読は不可能そうですね。

98 :91:2009/03/03(火) 23:01:27
グーグル先生で「excel パスワード 解除」でGigazineのやつ試してみたら?
うまくいくかもよ。がんがれ!

99 :デフォルトの名無しさん:2009/03/03(火) 23:07:54
バイナリエディタかあらパス設定されてるワークブックを開いてみる。
そのなかからDPB=って文字列を検索してみそ。

その中のDPB=に挟まれたわけわかめの者がパス

ってのでいいんじゃないのかい????????
みなさんどうおもうよ
この惨めな男に慈悲あたえてあげようじゃないの

100 :デフォルトの名無しさん:2009/03/03(火) 23:33:18
>>99
謝礼さんではないが、俺のExcel2000で[保存]-[ツール]のパスワードだと、DPBって無いんだが・・・
それって、マクロロックじゃまいか?
2000使ってるのは突っ込まないでくれ。軽いんだよね・・・


101 :デフォルトの名無しさん:2009/03/03(火) 23:43:46
>>82
MAPIでググって見ればサンプルあるよ。
けど、MAPIだとOutlook系しか送信できなかったと思った。(違ったらごめん)
CDOだと送信のみOK。受信不可。
セキュリティー系の送受信するなら、BSMTP.DLL使うのが楽チン。
けれど、BSMTPやるならVBアプリ作ったほうが・・・


102 :デフォルトの名無しさん:2009/03/04(水) 00:02:13
謝礼さん

暗号化とけないのは仕方ないでしょ。上司のBU取っとかなかったのは痛いが。
こんなんで辞職はないから大丈夫でしょ。(それこそ上司が悪い)
粘着厨といわれるからこれで退散。がんがってね!

最後にこんな感じで変数とか改行とかつけると良いかも。以上です。

'/**
' *  Excelの列番号から、A1形式の文字を返す。
' *  @param  columnNumber    Excelの列番号
' */ @return String          A1形式のExcel列番号
Private Function ColumnNumberToString(columnNumber As Integer) As String
    Dim columnString As String              '戻り値用
    Dim uBit As Integer                     '上位桁用
    Dim remain As Integer                   '余り用
   
    If columnNumber <= 26 Then                                  '列番号 <= 26 ("A" - "Z")
        columnString = Chr(columnNumber + 64)
    Else
        uBit = Int(columnNumber / 26)  '列番号 > 26 ("AA" - "ZZ")
        remain = columnNumber Mod 26  '列番号を26で割って、余りを出す
        If remain = 0 Then
            columnString = Chr(uBit + 63) & "Z 'Chr(63) = 'A'
        Else
            columnString = Chr(uBit + 64) & Chr(remain + 64)
        End If
    End If    
    ColumnNumberToString = columnString   'A1形式の列文字を返す
End Function

103 :デフォルトの名無しさん:2009/03/04(水) 00:04:05
SendKeysでOutlookを操作

104 :デフォルトの名無しさん:2009/03/04(水) 00:54:27
「そもそもパスがかかっているやつがあった」って書いてあるけど
それと自分が処理したファイルとの区別はついてるんかな?
パスのわからないファイルの更新日時は確認したの?
もともと上司がパスを設定していたのなら、謝礼男に開けなくても当然かと思う…。

105 :デフォルトの名無しさん:2009/03/04(水) 21:30:16
で、その後どうなったの?
報告して〜!気になるじゃん!

106 :82:2009/03/04(水) 23:44:12
>>101
サンプルは何個か見付けましたけど、これって全部なにかしらのソフトをインストールしないと
使えないんですかね?
この機能を作ってるのが、余計なソフトを入れられない会社のPCな上に
複数のPCから利用されるのを目的として作りたいんですけど。
利用するすべてのPCで何かしらインストールしないと無理なんですかね?

107 :101:2009/03/04(水) 23:54:53
>>82
相当昔に業務ツール作成で使っただけなので間違いがあるかもしれないが・・・

MAPI :
 特に無し。Office&OutlookExplessでOK。けど、Textの標準ソフトが秀丸とかだと動かなくなるので注意。
 それと、OutlookがPopBeforeSMTPかなんかの暗号送受信ができなかった気がする。
 MAPI対応MTUならOutlookじゃなくてもいけるはず。Beckyは無理だったと思う。
CDO:
 2000系のCOMだかで動いたかな?送信NGでXP以降NGだったから早々にあきらめた。
 .Netは違うのかな?
BSMTP:
 フリーの超有名DLL。ツールとDLLを配布すれば誰でも使える。
 このDLL自体がMTUなので、他にソフトはいらない。
 しかし、25番とかのPort制限解除が必要。(ウィルスソフトとOS ポート制限)

108 :デフォルトの名無しさん:2009/03/05(木) 00:00:54
>>82みたいなのってわざわざエクセルのマクロでやる必要あるんか?
ふつうにDelphiとかでアプリ作ればいいんでないの?いややり方は知らんけど
Exelファイルを添付したいとかか?


109 :101:2009/03/05(木) 00:11:36
個人的にはPHPで作りますかね・・・PHPは初心者ですが、簡単に作れたはず。
企業だとサーバー立てるのメンドくて無理ですね。配布の制限とか無いんですが。

まあ、Excelで集計したデータをサーバーで自動更新したいのではないかと。
サーバーAPP作って、そこにxlsを放り込むとかでもできますよね。

110 :デフォルトの名無しさん:2009/03/05(木) 00:12:10
>>108
操作しやすいExcelで登録した先に、スパムを送り付けたい。

111 :デフォルトの名無しさん:2009/03/05(木) 02:05:57
Excelって10万件ぐらいデータ入れたら重くて開くのも大変にならんか?
この程度じゃSPAM業者として成立せんだろ。2桁ぐらい少ないと思う。

Excelの操作をケータイで監視したいんじゃね?
Outlookにこだわらなければコマンドラインツールを使うとか。

112 :デフォルトの名無しさん:2009/03/05(木) 02:14:28
>>111
1000万件・・・

113 :デフォルトの名無しさん:2009/03/05(木) 07:05:36
マクロを使ったWebクエリについて詳しく解説しているホームページ又は書籍を知っている人いたら教えてください。

114 :デフォルトの名無しさん:2009/03/05(木) 07:55:30
ところで謝礼男は生きてるのだろうか?
気になるね。

115 :デフォルトの名無しさん:2009/03/05(木) 12:12:01
ものすごく基礎の質問で申し訳ないのですが
Editorで作ったプログラムをワークシートで使うためにはどうしたらいいのでしょうか?

116 :デフォルトの名無しさん:2009/03/05(木) 12:33:32
>>115
VBEのこと?
ワークシートにボタン貼り付けたり、[マクロ]-[実行]でいいんじゃまいか?
違うのかな?

117 :デフォルトの名無しさん:2009/03/05(木) 12:50:54
>>116
VBEです
ユーザーフォームでプログラムを作り、VBE上で実行はできるのですがワークシートで実行する方法がわかりません
マクロのところにも作ったプログラムは表示されてないです


118 :デフォルトの名無しさん:2009/03/05(木) 12:52:44
メニュー→マクロで実行できる

119 :デフォルトの名無しさん:2009/03/05(木) 20:38:13
functionプロシージャでソルバーを使うことはできますか?
例えば
exp(x)+n*x=0   (n=1,2,3,など)
の解xを求めたいとき、nをfunctionプロシージャの引数として変化させ
ソルバーで求めたxを返したいのですが。
XP、Excel2003です。よろしくお願いします。

120 :デフォルトの名無しさん:2009/03/05(木) 21:05:16
>>119
使ったこと無いけど、ググって見たかぎり出来ると思うよ。
教えてグーの質問見て思いました。
ttp://oshiete1.goo.ne.jp/qa1295710.html

関数の引数に対象セルの位置 or 範囲を入れればよさげだね。
後はSolverOkに引数を与えて、SolverSolveでコピペと。
マクロの記録をして、それをカスタムするのが早いと思います。

2008は駄目みたいだね。VBAが無理臭い。知らなかった。



121 :119:2009/03/05(木) 22:09:13
>>120さん
早速ありがとうございます。
試してみたのですが、なんかうまくいかない。。。
セルA1を =EXP(B1)+1*B1
セルC1を =test(A1,B1)
として次のプログラムを書いてみたのですが、B1の初期値を返すだけです。
Function test(y As Range, x As Range)
SolverOk SetCell:="y", MaxMinVal:=3, ValueOf:="0", ByChange:="x"
SolverSolve Userfinish:=True
test = x
End Function
できれば=EXP(B1)+1*B1もセルではなくFunctionプロシージャに記述したいのですがムリでしょうか。


122 :デフォルトの名無しさん:2009/03/05(木) 22:34:52
>>119
引数の使い方間違ってると思う。
y As Range -> SetCell "y" では、A1:B1とかではなく、文字列"y"になる。あと、Val系引数は文字列でよいのかな?
引数をstringにするか、int x0,y0,x1,y1とかで、Range(x0 + ":" + y0)とかにしないと駄目かと。(書式とか文法は脳内変換よろ)
列番号をA1形式に変換するのは、>>102見てほしい。多分常套手段。

さっき書き忘れたけど、ソルブだっけ?はシート必須になるんじゃないかな。
何で、TempとかMacroといった作業シートが必要と思います。
さすがに関数そのものを取り込むのは無理かと。
どっかのHPで見たけど、マジでやる場合は2次方程式のルーチンを書いていたような・・・(これがソルブだよね?)




123 :デフォルトの名無しさん:2009/03/06(金) 00:28:08
>>113
グーグル先生で[vba webクエリ]で上から10件以内でもろヒットなんだが・・・
株系がわんさか出てくるがこれじゃまいか?あまりVBAでやらないと思うが・・・

124 :119:2009/03/06(金) 00:32:24
>>122さん。ありがとうございます。
ちょっと煮詰まってきまして。。。
セルA1を =EXP(B1)+1*B1
としてSubプロシージャで
Sub solv()
SolverOk SetCell:="A1", MaxMinVal:=3, ValueOf:="0", ByChange:="B1"
SolverSolve Userfinish:=True
End Sub
で解を求めることは確認できたのですが(上のA1をChr(65) & Chr(49)としても大丈夫でした)、
Function test1(x)
SolverOk SetCell:="A1", MaxMinVal:=3, ValueOf:="0", ByChange:="B1"
SolverSolve Userfinish:=True
test1 = x
End Function
についてC1セルを =test1(B1)とすると
「内部エラーが発生しました。またはメモリ不足です。」
となってしまいます。
せっかく回答いただいたのですが、もうすこし考えて見ます。
ソルブはシート必須であれば最適化プログラムを自分で書かないといけないのでしょうか。

125 :デフォルトの名無しさん:2009/03/06(金) 01:35:21
久しぶりにVBAやったら意味がわからんくて吹いたwwwCDいるしwww
引数が4個必要だから、fx組み込み関数の用には使えるのかな?ごめん。セル直内のマクロ関数作ったこと無い。
VB6の代わりにしか思ってないから・・
セル = fx(B1, B2, B3, B4)が可能なら、下記Funcの引数を変えればOkかと。

>124の最後は、循環しているから。@B1=test() Atest()かB1を読みにいく →つまり、test() B以下無限ループ。
124の引数の意味は分からんが、下記のようにやればうまくいくのでは?
使い方が良くわからんが頑張ってくれ。仕事あるので寝るよ。

'/**
' *  イチローの打率予測計算。Solverの初心者HPのを元にマクロ記録で起こす。
' */
Option Explicit

'テスト関数。
Private Sub test()
    Call TestFunc("$B$6", 3, 0.4, "$D$5")
End Sub

'Solverテスト関数。
Private Sub TestFunc( setRange As String,  maxMinval As Integer,  targetVal As Double,  changeRange As String)
    SolverOk SetCell:=setRange, _
        maxMinval:=maxMinval, _
        ValueOf:=targetVal, _
        ByChange:=changeRange
   
    SolverSolve Userfinish:=True
End Sub


126 :デフォルトの名無しさん:2009/03/06(金) 01:42:47
>>125
最小インストールかカスタムインストールでVBEを選択肢から外さない限りCDなんか使わんぞ
どうせHDDなんて有り余ってんだから男は黙ってフルインストール

127 :デフォルトの名無しさん:2009/03/06(金) 01:44:52
>>126
Solverが追加アドインだからCD要求受けたのですわ。
基本全インスコだが、2000だからだろうか?基本VB6用でしか使わないから、アドインは良くわからん。

128 :デフォルトの名無しさん:2009/03/06(金) 01:49:46
つーか>>125じゃ使えないぞ

129 :デフォルトの名無しさん:2009/03/06(金) 01:54:19
おいおい、俺のxp & 2000では動くぞ。
参照設定でSolverいるがなwww俺はそこで10分以上はまったwww
それに、Solver用データがシートに必要だ。
質問者さんは基本データがシートにあるから、このソースで意味は分かる。
まじで眠い。これ以上は誰かよろ

130 :デフォルトの名無しさん:2009/03/06(金) 01:58:13
あっ、ごめん。もしかして、Privateのせいか?
外から使うならFuncをPublicでやってくれ。デバッグしかしてないから、Privateで作ってるわ。

131 :デフォルトの名無しさん:2009/03/06(金) 02:21:26
それだけじゃねーよ
つーか、本当にユーザー定義関数(ワークシート上から使う関数)作ったことないんだなw

132 :デフォルトの名無しさん:2009/03/06(金) 02:29:03
>>131

(仰るとおりユーザー関数は無知です orz)

Subで作ってる理由はきちんとある。
Solverの結果がレンジの場合があるっぽいので、そういったものを単一セルで表現できるのか?
それが分かりませんでした。

なんで、質問者さんはTestFuncをPublic Functionにして利用してね。
戻り値の書き方は>>124見る限りわかるんだよね?

あとは>>131さんが教えてくれるよ。
歯磨き終わったのでおやすみなさい。

133 :119:2009/03/06(金) 07:39:08
みなさん寝落ちしている間にいろいろありがとうございます。
当方のやりたいイメージは以下のように方程式をfunction内で定義し
ソルバーで解いた解を返すようなプログラムなのです。
Function test(n)
y = Exp(x) + n * x
SolverOk SetCell:="y", MaxMinVal:=3, ValueOf:="0", ByChange:="x"
SolverSolve Userfinish:=True
test = x
End Function
みなさんの回答をもとにまた今晩考えてみます。

134 :デフォルトの名無しさん:2009/03/06(金) 11:49:34
どんだけスキル低いんだよ。125-132でFAだろjk
クレクレは帰れ



135 :デフォルトの名無しさん:2009/03/06(金) 15:44:31
VBAのエディタって行番号を表示できないんでしょうか?
8年以上は悩んでいます。

136 :デフォルトの名無しさん:2009/03/06(金) 15:53:09
ないよ。俺はデフォでホイールが動かないのが悩み。

137 :デフォルトの名無しさん:2009/03/06(金) 15:59:36
Excel VBAを勉強中なんですがちょっとつまずいでしまって。
エクセルシートに以下のように100行2列の表があるんですが、

東京 台東区
千葉 ○○町


これをFormのListBoxに表示していますが、
東京なら東京だけの情報をリスト表示したいのです。

現状はこうなっています。

UserForm_Initialize()内で
lstBox.ColumnCount = 2
lstBox.RowSource = "アドレス!A2:B103"

これを東京または千葉だけのリスト表示にするには
RowSourceをどのように記述すればいいんでしょうか?
他にいい方法などありますか・


138 :デフォルトの名無しさん:2009/03/06(金) 16:27:23
1 AdvancedFilter
2 1から作る
・AとBのデータ全取得
・コンボボックスでAを表示
・選択データでBを初期化

139 :デフォルトの名無しさん:2009/03/06(金) 17:01:26
レスありがとうございます
教えていただいたことを調べてみます

140 :デフォルトの名無しさん:2009/03/06(金) 17:10:23
> RowSourceをどのように記述すればいいんでしょうか?
RowSourceだけではどう記述しても無理

俺だったら連想配列とクラス使って実装するが
100行くらいなら>>138でも十分だな

141 :デフォルトの名無しさん:2009/03/06(金) 17:33:13
>>140
んなモンにClass使うか
サブルーチンで十分

てか、
>100行くらいなら>>138でも十分だな
より、一番簡単なのが連想配列だろjk

142 :デフォルトの名無しさん:2009/03/06(金) 17:43:00
データ加工するなら動的配列かCollectionじゃね?
少なくとも、配列, end(xlup) end(xlleft) for ifは覚えてくれ

143 :デフォルトの名無しさん:2009/03/06(金) 17:56:58
VBAってソートのメソッド無いよね。
○○ソートアルゴリズムでソートするってこと?

144 :デフォルトの名無しさん:2009/03/06(金) 19:25:59
>>143
日本語でおk。自前実装しる

145 :デフォルトの名無しさん:2009/03/06(金) 19:29:34
CreateObject("System.Collections.SortedList") つかえ

146 :143:2009/03/06(金) 22:02:42
>>145
System.Collections.SortedListは使えなかったがSystem.Collections.ArrayListが
使えた。
というか、自分の勝手な思いこみでコレを使える事を知らなかった。



キモすぎ!デブおた君の >>144

    / ̄ ̄ ̄ ̄\   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
   (  人____)<日本語でおk。自前実装しる
   |./  ー◎-◎-)  \______________
   (6     (_ _) )    カタカタカタ
   | .∴ ノ  3 ノ  ______
    ゝ       ノ  .|  | ̄ ̄\ \
   /       \__|  |    | ̄ ̄|
  /  \___      |  |    |__|
  | \      |つ    |__|__/ /
  /     ̄ ̄  | ̄ ̄ ̄ ̄|  〔 ̄ ̄〕
 |       | ̄


147 :デフォルトの名無しさん:2009/03/07(土) 10:39:55
質問です。
単純に指定フォルダを開くモジュールを作って、プロシージャ(?)で動かしたいんですが、
以下のようにコードを書いても
「ファイルがありません」とエラーになってしまいます。
調べても書き方はあっているように思うんですが、何がいけないかお教え下さい。。。


Private Sub CommandButton1_Click()

Const pass As String = "C:\aaa"
OpenFolder (pass)

End Sub


Public Function OpenFolder(pass As String) As String

Shell "explorer" & pass, vbNormalFocus

End Function


148 :デフォルトの名無しさん:2009/03/07(土) 10:46:32
passじゃなくてpathな

あとは
MsgBox "explorer" & pass
でも見て見ろ
そのエラーが当然だと気付くから

つーか、この程度の確認すら出来ないってどうなのよ?

149 :デフォルトの名無しさん:2009/03/07(土) 10:49:30
5分ほど前にvbを始めたもんで・・・
ただこれだけの事だったとは非常に恥ずかしい。。。
サンクス

150 :デフォルトの名無しさん:2009/03/07(土) 11:27:57
もう一個質問。

VBとVBAって別もの?独立してるかしてないか?
エクセルからシートをフォームに見立ててボタンつけたりなんだってして、
visual basic editor開いてコード書いて・・・って普通のVBのようにモノを作ってもさ、
エクセルからしか起動できないんだよね?

普通にビルドしてexe作って単体で動かすとかはムリ?

151 :デフォルトの名無しさん:2009/03/07(土) 11:57:49
exe作りたければVB6買え
VBAでは当然ながらexeへのコンパイルは出来ない

多少言語が変わっても良いなら、VB.NETは無料のでexe作れる
これから始めるならVB.NETなりC#.NETなりの方がいいかもな

152 :デフォルトの名無しさん:2009/03/07(土) 14:48:03
vb6は店頭販売終了だからMSDN購入しかない
やっぱり無料2008落としてC#がBest
VB.NETやるならC#覚える方がのちのち楽になるよ。書き方同じだし。

153 :デフォルトの名無しさん:2009/03/07(土) 14:50:41
オクで正規品買えるよ
MSDNの横流しも多いが

154 :デフォルトの名無しさん:2009/03/07(土) 15:26:34
>>146
System.Collections.ArrayListってVBAで使えるの?
.net系の定義だと思うのだが

(スレチだが、>>143の質問方法だと煽らて当然かと)

155 :デフォルトの名無しさん:2009/03/07(土) 16:09:48
CreateObjectしてみれば?

156 :デフォルトの名無しさん:2009/03/07(土) 16:18:43
参照設定の一覧の中にmscorlib.dllがある。

157 :デフォルトの名無しさん:2009/03/07(土) 17:02:20
>>154-156がオートメーションエラー(80131700)でNGです。誰か教えて。

2000 sp4 .net2.0
office200 sp3
参照設定にmscorlib.dll

Sub Sample1()
    Set DataList = CreateObject("System.Collections.ArrayList")
    Set DataList = Nothing
End Sub

158 :デフォルトの名無しさん:2009/03/09(月) 02:28:43
土曜日の仕事を金曜日にかたずけたいと思いプログラム
を考えましたが動きません。

if WeekdayName(Weekday(Date))=6 and Hour(Time) >14 then 

ActiveSheet.PageSetup.CenterHeader = "&24&B&I"+ Date +1 ’金曜日の2時以降は土曜日の日付のヘッダー
else
ActiveSheet.PageSetup.CenterHeader = "&24&B&I"+ Date ’平日は当日のヘッダー

end if
ActiveSheet.PageSetup.RightFooter = "&36&B&Uテスト"

これのどこが間違っていますか?
環境;
os xp
v 2003



159 :デフォルトの名無しさん:2009/03/09(月) 04:14:59
>>158
Debug.Print WeekdayName(Weekday(Date))

160 :デフォルトの名無しさん:2009/03/09(月) 04:19:36
>>158
Date型を文字列として足す場合は+じゃなくて&を使う

161 :デフォルトの名無しさん:2009/03/09(月) 21:23:07
すみません教えてください。
最近会社のパソコンが新しくなったのですが
エクセル2003でコードを記入しようとすると
ツール−マクロの次が
セキュリティしか表示されません。

何か原因があるのでしょうか。

162 :デフォルトの名無しさん:2009/03/09(月) 21:42:03
>>161
alt+f11

163 :デフォルトの名無しさん:2009/03/09(月) 22:48:59
1万件Union、素人なりにがんばってみますた。うちのネットブックで6秒です。Core2のデスクトップなら2、3秒でしょう。
掲示板の行数制限とかあるんで配列の大きさとループの回数を定数にしたんで汎用性ゼロです。

Declare Function timeGetTime Lib "winmm.dll" () As Long
Sub aaa()
 T1 = timeGetTime()
 ScreenUpdating = False
 Dim a(270) As String
 Dim si As Integer
 Dim s As String
 For i = 1 To 10000
  w = "A" & (i * 6 - 3)
  If Len(s & w) <= 255 Then
    s = s & w & ","
  Else
   a(si) = Left(s, Len(s) - 1)
   si = si + 1
   s = w & ","
  End If
 Next
 a(si) = Left(s, Len(s) - 1)
 Set r = Range(a(0))
 For i = 1 To 233 Step 29
  Set r = Union(r, Range(a(i)), Range(a(i + 1)), Range(a(i + 2)), Range(a(i + 3)), Range(a(i + 4)), Range(a(i + 5)), Range(a(i + 6)), Range(a(i + 7)), Range(a(i + 8)), Range(a(i + 9)), Range(a(i + 10)), _
      Range(a(i + 11)), Range(a(i + 12)), Range(a(i + 13)), Range(a(i + 14)), Range(a(i + 15)), Range(a(i + 16)), Range(a(i + 17)), Range(a(i + 18)), Range(a(i + 19)), Range(a(i + 20)), Range(a(i + 21)), _
      Range(a(i + 22)), Range(a(i + 23)), Range(a(i + 24)), Range(a(i + 25)), Range(a(i + 26)), Range(a(i + 27)), Range(a(i + 28)))
 Next
 Set r = Union(r, Range(a(262)), Range(a(263)), Range(a(264)), Range(a(265)), Range(a(266)), Range(a(267)), Range(a(268)), Range(a(269)), Range(a(270)))
 Cells(1, 2) = ((timeGetTime() - T1) / 1000) & "秒"
 r.Value = "うにお" '念のためテストデータ書き込み
 ScreenUpdating = True
End Sub

164 :デフォルトの名無しさん:2009/03/09(月) 23:52:12
下記のInputBoxでキャンセルしたとき
「実行時エラー'424': オブジェクトが必要です。」のエラーがでるんだけど
後続のIf文で MsgBox "NG" の処理をさせるにはどうコーディングすればいいですか?
そもそも使い方間違ってる?

Public Sub test()
  Dim c As Range
  Set c = Application.InputBox("", Type:=8)
  If c Is Nothing Then
    MsgBox "NG"
  Else
    MsgBox "OK"
  End If
End Sub

165 :デフォルトの名無しさん:2009/03/09(月) 23:58:25
on error resume next

166 :デフォルトの名無しさん:2009/03/10(火) 00:07:27
>>165
うまくいきました、ありがとうございます
質問なんですけど、Object型変数が空になるケースがある判定では
On Error Resume Next を事前に書いておくのが一般的なんですか?

167 :デフォルトの名無しさん:2009/03/10(火) 00:31:01
ふつうなんじゃね?variant で受けて

168 :デフォルトの名無しさん:2009/03/10(火) 00:32:06
もとい

普通なんじゃね?
variantで受けて、isobjectとかで分けても、たいして良いこと無いだろうし。

169 :166:2009/03/10(火) 00:49:51
>>168
わかりました、ありがとうございます

variantで受けて、isobjectとかで分けて〜とかもよくわからないので
もうちょい調べてみます

170 :デフォルトの名無しさん:2009/03/10(火) 16:05:01
Application.Cursor = xlWait
でマウスポインタが砂時計にならないのって
どういう原因が考えられるでしょうか?

171 :デフォルトの名無しさん:2009/03/10(火) 17:01:30
砂時計を表示するまでも無いほど短時間で終了する処理を実行した場合

172 :デフォルトの名無しさん:2009/03/10(火) 20:28:06
>>163
ScreenUpdating = Falseってなんや?
変数の宣言は強制せなあかん。

173 :デフォルトの名無しさん:2009/03/10(火) 20:32:27
Application.ScrenUpdating = False

174 :デフォルトの名無しさん:2009/03/10(火) 20:51:41
Application.ScrenUpdating = False は無意味だがOption Exolicit書いてないとScrenUpdating = Falseでも動くんだよなw
今回はチラチラする処理じゃないからたまたま気がつかないかも知らんが、チラチラする処理だと「何で?」となる。

175 :デフォルトの名無しさん:2009/03/10(火) 21:06:33
質問です。

ブックオープン時に指定フォルダのvalueを
単純にボタンのキャプションに代入して表示させようと思ったんですが、上手くいきません。

オブジェクトが不正だと言われるんですが何故でしょう。
ボタンダウンの機能として全く同じコードを記述すると問題なく動くんですが。。

176 :デフォルトの名無しさん:2009/03/10(火) 21:07:29

フォルダじゃなくセルでした。

177 :デフォルトの名無しさん:2009/03/10(火) 21:17:59
>>173
ScreenUpdating = False
だと「表示更新を止める」ではなく
ScreenUpdatingというユーザー定義変数に
Falseを代入するって動作になるって話だろ

しかも表示更新は最後の1回のみなので
表示更新止めても1回、止めなくても1回で意味無い

しかも汎用性無さ過ぎで無価値すぎて泣けてくる

178 :デフォルトの名無しさん:2009/03/10(火) 23:56:21
上のソースコードです。


Private Sub Workbook_Open()

Dim SH As Worksheet

Set SH = ThisWorkbook.Worksheets("Sheet2")
CommandButton1.Caption = SH.Range(SH.Cells(3, 2), SH.Cells(3, 2)).Value

End Sub

ThisWorkbook(コード)内に記述しています。
色々調べてはみたんですが、どうしても「CommandButton1.Caption〜」の
ところでエラーが出てしまいます。
どうかご教授願います。

179 :デフォルトの名無しさん:2009/03/11(水) 00:00:39
バリューじゃなく
テキストにしたら


180 :デフォルトの名無しさん:2009/03/11(水) 00:07:48
今度は変数が定義されていないと言われまた出来ませんでした。。。

181 :デフォルトの名無しさん:2009/03/11(水) 00:10:48
>>178
そのソースまんまコピペして実行したら、エラー出ずにちゃんと設定されたぞ

182 :デフォルトの名無しさん:2009/03/11(水) 00:13:32
>>181
一つ書き忘れていました。

sheet1にボタンがあって、
sheet2のセルから文字を読み込みたいんです。

自分はやはり同じくエラーになるんですが。。。

183 :デフォルトの名無しさん:2009/03/11(水) 00:20:12
CommandButtonを配置してるシートにコードを書きましょう

184 :デフォルトの名無しさん:2009/03/11(水) 00:22:06
>>183
そうするとブックを開いたとき、自動的に読み込まれなくなりません?
モジュールにcaption読み込むコード書いてcallしても同じくエラーでちゃうし・・・

185 :デフォルトの名無しさん:2009/03/11(水) 00:27:14
何バカいってるんだw

186 :デフォルトの名無しさん:2009/03/11(水) 00:28:14
>>184
すまね、ぜんぜん読んでなかったよ

Worksheets("Sheet1").CommandButton1.Caption = SH.Range〜 に

どのシートにあるボタンかを指定しないと

187 :デフォルトの名無しさん:2009/03/11(水) 00:30:23
それはボタンがあるのがsheet1だから
sheet1(コード)に>>178をそのまま書けって事ですか?
中にmsgbox追加してみたんですが、動いてないんですが・・・

188 :デフォルトの名無しさん:2009/03/11(水) 00:31:54
>>186
ボタンもシートの指定が必要なんですね。。
おかげでやっとうまくいきました。
遅くまでありがとうございます!

189 :デフォルトの名無しさん:2009/03/11(水) 07:28:42
>>177
汎用性がどうのこうのって、Unionを使うこと自体がだめだよ。
いくら工夫したってだんだん入れ物を多きくしていくことに変わりはない。
Unionでまとめて処理するより、小分けに処理した方が速ければ何の意味もない。
だいたいUnionが必要な時ってほとんどないだろ?
まともなやつは使わんよ。

190 :デフォルトの名無しさん:2009/03/11(水) 07:38:38
的外れな回答ばっかだなw
CommandButton1.Caption = SH.Range(SH.Cells(3, 2), SH.Cells(3, 2)).Value
なんてのが動くのかよ。
同じセルを指定したとき動くか動かないか試してないが、常識的には
CommandButton1.Caption =SH.Cells(3, 2),Value
もしB3にアドレスを書いてるのであれば
CommandButton1.Caption = SH.Range(SH.Cells(3, 2).Value).Value
のどちらかだろ?


191 :デフォルトの名無しさん:2009/03/11(水) 07:42:07
すまん>>190の1行目は取り消す。
ThisWorkbookにのOpenイベントだったのかよ。
それじゃ当然だめだよな。


192 :デフォルトの名無しさん:2009/03/11(水) 07:55:19
久々に来たが初心者ばっかになったのかw

193 :デフォルトの名無しさん:2009/03/11(水) 07:57:05
>>189とかな

194 :デフォルトの名無しさん:2009/03/11(水) 07:58:00
178のように同じセルを指定すると動くみたいだな。
MsgBox Range(Cells(3, 2),Cells(3, 2)).Value
で動くには動くけど無駄だから
MsgBox Cells(3, 2).Value
とするのがjsk

195 :デフォルトの名無しさん:2009/03/11(水) 07:59:28
>>192
>>193とかなw

196 :デフォルトの名無しさん:2009/03/11(水) 08:01:31
>>193は相談書でUnionで許容範囲内で出来るとか言ってた馬鹿かも知らん。
Union使わなきゃもっと速く出来るだろ?

197 :デフォルトの名無しさん:2009/03/11(水) 08:17:20
可哀相な奴

198 :デフォルトの名無しさん:2009/03/11(水) 08:19:08
あの基本が出来てないやつかも知らんねぇ。

199 :デフォルトの名無しさん:2009/03/11(水) 08:22:16
なんでこの子の書き込みはこんなに解りやすいんだ?

200 :デフォルトの名無しさん:2009/03/11(水) 08:22:35
たとえばオブジェクト変数は値渡しとかな。

201 :デフォルトの名無しさん:2009/03/11(水) 08:26:43
止まったなw

202 :デフォルトの名無しさん:2009/03/11(水) 08:38:42
自分のこと言われてるのに気付いてないw

203 :デフォルトの名無しさん:2009/03/11(水) 11:20:37
a

204 :デフォルトの名無しさん:2009/03/11(水) 11:24:10
現在Sheet1がアクティブのときに、
Sheet2の行3にデータが何列目まで入っているか知りたいのです。
アクティブなシートなら、マクロの記録で
Set ws = Worksheets(2)
ws.Cells(3, 256).Select
Selection.End(xlToLeft).Select
col = Selection.Column
みたいにして、データが入っている最後の列colを取得できたのですが、
Sheet2をアクティブにせずにやるとエラーします。
どうしたらいいでしょうか?

205 :デフォルトの名無しさん:2009/03/11(水) 11:36:43
selectするからエラーがでるんではないの

206 :デフォルトの名無しさん:2009/03/11(水) 20:23:52
selectしない書き方。
selectとselectionを削ってつなげると出来上がり。
col = ws.Cells(3, 256).End(xlToLeft).Column

207 :デフォルトの名無しさん:2009/03/11(水) 21:24:54
マクロ内で生成したオートシェイプを
右クリックしたときにマクロを起動させることは可能ですか?

左クリックならOnActionプロパティに関数を入力すればOKですが
右クリックやダブルクリックはどうしたら良いのでしょうか?

208 :デフォルトの名無しさん:2009/03/11(水) 22:13:07
セルに入力されている日付(2009/03/11)を参照して
ファイル名(200090311.xls)をつけsheet(2)を移動して保存したいのですがどうすれば良いですか?

209 :デフォルトの名無しさん:2009/03/11(水) 22:30:07
>>208
君が書いてることを、日本語ではなくVBA語で書けば良いだけだよ

210 :デフォルトの名無しさん:2009/03/11(水) 22:35:09
VBA語(笑)

211 :デフォルトの名無しさん:2009/03/11(水) 23:43:29
with ActiveWorkbook
.Sheets(2).Move
Workbooks(Workbooks.Count).SaveAs .Path & Replace(ActiveCell, "/", "") & ".xls"
end with

テストしてないから動くかわからん

212 :デフォルトの名無しさん:2009/03/11(水) 23:47:37
あ、.Path は .Path & "\" & にしておいてね。
まあ、保存場所は好きなのにしたほうがいいけど。
次のOfficeが出るまで買わないことにしたのでOfficeが手元にない(´・ω・)

213 :デフォルトの名無しさん:2009/03/12(木) 00:53:59
まずセルに5をいれます その時に他に指定したセルに下一桁増やした5.9とゆう数字をいれたいです
 また5.5なら5.51とか5.59を他のセルにいれたいです VBA可能でしょうか?またどのようにしたらよいでしょうか?

214 :デフォルトの名無しさん:2009/03/12(木) 00:54:59
日本語があやしいね

215 :デフォルトの名無しさん:2009/03/12(木) 01:05:13
5.9とゆう

216 :デフォルトの名無しさん:2009/03/12(木) 01:10:05
>>213
イベントで、結果セル = 結果セル & 入力セル

あとは>>1★5

217 :デフォルトの名無しさん:2009/03/12(木) 09:44:12
自己流で色々組んでいるのですが、プログラムをユーザーフォームに全て打ち込んでいます。
標準モジュールに打ち込んだ方が良いのでしょうか?

218 :デフォルトの名無しさん:2009/03/12(木) 10:03:37
そんなの使い分けだよ
全てを対象に、必ずしもどっちかが良いなんてことは無い
あとはクラスも仲間に入れてやれ

219 :デフォルトの名無しさん:2009/03/12(木) 19:56:41
追加したシートの取得の仕方がわかりません
どうやって今作成したばかりのシートを取得したらよいでしょうか?

220 :デフォルトの名無しさん:2009/03/12(木) 20:22:39
オブジェクト変数に取得したいってこと?
それなら追加するとき取得します。
Set newsheet = WorkSheets.Add

追加したあとで取得は俺には分らん。

221 :デフォルトの名無しさん:2009/03/12(木) 20:34:32
おお、Setってやらないと入らないんですね
ありがとうございます

222 :デフォルトの名無しさん:2009/03/12(木) 20:39:01
Setをわざわざ使うのは、Set無しで書いてしまった場合
オブジェクトのデフォルトプロパティへの代入及び呼び出しを意味してしまうから。
他言語から入ってきた人間だと間違いやすいね。

223 :デフォルトの名無しさん:2009/03/12(木) 20:41:02
追加したあとでの取得だが、もしシートのCodeNmaeをいじってなきゃ可能だな。
各シートのCodeNameからSheetの部分を削って、数字を数値に変換して一番大きなのがそうだ。

224 :デフォルトの名無しさん:2009/03/12(木) 22:17:10
VBA は初心者です.いま,Excel の Add-In を作っています.
標準コードモジュールに Function を書くと Public/Private によらず
UDF としてプロジェクトの外から参照できてしまうのがうれしくありません.
Function を UDF として公開せずに,
プロジェクト内だけで visible にする方法はありますか?
理由は,意図しない名前空間の汚染を避けたいからです.

Function を ThisWokrbook や Wokrsheet オブジェクト上に置くなど,
論理的な意味が変わってしまうような代替案は NG とさせてください.
また,Application.Caller を調べて,VBA プロジェクト内からの呼び出しか,
ワークシート関数による呼び出しかを区別して,後者を禁止することは可能ですが,
名前は見えたままという意味では同じことです.
なお,Excel のバージョンや OS は特に指定しませんが,
できるだけ cross-platform なアプローチが望ましいです.

225 :デフォルトの名無しさん:2009/03/12(木) 22:55:55
>>224
マクロの一覧に名前が出ないようにするだけならOption Private Module
完全に使えなくする方法は知らん

226 :デフォルトの名無しさん:2009/03/12(木) 23:00:39
質問です。
シートにボタンを設置し、ユーザにはどこかセルにファイル等のパスを入力しておけば、
そのボタンからそのパスのファイルを開けるようにしたくコードを作成しています。

今分からないのが、そのパスにエクセルのファイル以外を入力された場合の回避の仕方です。
現状では、ただのstring型にパスを読み込んで受け渡してます。
一応、dir関数を使い、ファイルの有無は調べてオープンしてます。

また、フォルダとファイルのオープンを指定できるようにしたいんですが、
これも1を指定したらファイル、0はフォルダ、みたくしたいんですが、
この場合も0なのにファイルとかの場合のエラー回避がうまくいきません。

どうかご教授願います。


227 :デフォルトの名無しさん:2009/03/12(木) 23:01:17
キモイ句読点に、アホっぽい半英語。
該当する人物像は、・・・釣り?

228 :デフォルトの名無しさん:2009/03/12(木) 23:05:53
VBA はnewbieです.now then,Excel の Add-In をcreating.
Standard Code Moduleに Function をWrittenすると Public/Private にwithout
as UDF としてoutside projectからreferableのがnot good.
Function を UDF としてopenせずに,
just inside project で visible にするwayはthere exists?
because は,not intendedしないnamespaceのpollutionをwanna avoid.

Function を ThisWokrbook や Wokrsheet onto Object or,
logicalなmeaningがhas changedなようなalternative ideaは NG とnot acceptable.
and,Application.Caller をlookup,VBA project内からのinvokeか,
by worksheet function invocation かをcut offして,successor を
restictすることはpossibleですが,
nameはis still visibleというmeaningではsame entirely.
you see,Excel のversionや OS はespeciallyにspecifyしませんが,
as youcan cross-platform なapproachがwe need.

229 :デフォルトの名無しさん:2009/03/12(木) 23:16:52
>>227
>キモイ句読点に、アホっぽい半英語。
どこが?ごく普通に見えるが。
まぁ考えても分からないただ煽るしか出来ない無能なお前は引っ込んでろ。
俺は考えるのはいいがすぐには分からん

230 :デフォルトの名無しさん:2009/03/12(木) 23:23:41
おれも>>‎226のことだと思って「なんだ荒らしか」とおもってたら
>>‎224のことだとわかって納得した

231 :デフォルトの名無しさん:2009/03/12(木) 23:25:26
まぁプログラム板で釣りか?とか言ってくるやつは大抵知識もなくそいつが釣り

232 :デフォルトの名無しさん:2009/03/12(木) 23:29:02
together しようぜ!

233 :デフォルトの名無しさん:2009/03/12(木) 23:39:16
> まぁプログラム板で釣りか?とか言ってくるやつは大抵知識もなくそいつが釣り
とか言ってくるやつは大抵バカにされて悔しかった本人

234 :デフォルトの名無しさん:2009/03/13(金) 07:21:32
>>226
通常はFileOpenDialogを使用して、ファイルを選択するんじゃない?
それなら、拡張子やOpenエラー等が解決できる気がする。

それ以外ならWin32APIでファイル属性の確認や、
マジックナンバー調べてファイル別の処理とか。
面倒だから極力やらんけど。

煽りが多いようだがガンガレ!

235 :デフォルトの名無しさん:2009/03/13(金) 07:45:20
>>234
ありがとうございます。
しかしdialogを使うのは毎回自分でファイルの位置を探したり
選択しなきゃいけなくなりますよね?

その手間を省く為に、一つのシートに開くボタンをいくつかまとめて作って
パスを自分で指定したらそれっきりいつでも開けるようにしたいんです。

236 :デフォルトの名無しさん:2009/03/13(金) 07:53:03
>>235
俺ならこーするかな?それしかなくね?
@ユーザー入力部分に制限。不正ファイル指定不可。
Aファイル/フォルダ判断はWin32API。FileSystemObjectでもいけるかな?

まぁ、何かしらの制限を強いるしかないでしょ。多分。

237 :デフォルトの名無しさん:2009/03/13(金) 08:32:56
>>236
ちょっと始めたばかりの自分にはレベルが高すぎですかね。。。

ちなみに入力制限は、普通にセルに入力させたいんですが、
それはエクセルに規則制限の設定があるって事ですか?

238 :デフォルトの名無しさん:2009/03/13(金) 08:36:58
>>237
シート入力制限(Excel)&入力インターフェースとエラー制限(VBA)だよ。
初心者さんには厳しいかもしれんね・・・
内容見てると、VBAよりも運用で逃げれそうな面が多いので、
Projectに制限がないなら、運用/仕様で逃げるべき。

仕事なのでそれでは〜!

239 :224:2009/03/13(金) 16:48:05
自分の知らない言語仕様がもしかしたらあるかもと思い質問しました
Ruby の Duck Typing も最初は抵抗がありましたが、
言語の基本理念に合わせれば幸せになれたように、無駄な抵抗はやめて
VBA ではグローバルな名前空間で一意の名前を使ったほうがよさそうですね

句読点もここの習慣に合わせることにします
半英語 (笑) は確かに悩みの種ですが、カタカナ語は読みづらいし、
英単語を「てにをは」でつなぐくらいなら全英語のほうがまだましです
プログラムを書くときは公開が前提のため、ドキュメントを含め全て英語ですが、
白熱した議論となると英語では正直しんどいんですよね...

これまで Microsoft 独自仕様の言語は避けてきたのですが、
表計算 w/ OOP という計算言語モデルは最近面白いかもしれないと思いつつあります
Excel (w/o VBA) のみでも stochastic なアルゴリズムを使うことで、
割と複雑な問題でも現実的 (?) な労力と計算時間で解けることは確認しました
VBA にも標準で正規表現や SQL パーザなどのライブラリが用意されているようですし
何か面白いことはできないかとくちゃくちゃ遊んでいるところです


240 :デフォルトの名無しさん:2009/03/13(金) 17:00:33
いま、独学でVBA勉強しているとこなんだが
これを使って将来仕事に生かせるかどうか不安なんだ

書籍見てもどう約竜野かいまいちわからないし
この板にいる名人方は経験値豊富そうだから意見を聞きたい

役に立つのか?

241 :デフォルトの名無しさん:2009/03/13(金) 17:46:54
はっきり言って全く役に立たない。
手作業では数日がかりでも終わらないデータ集計が
数分で1円の間違いも無くレポートの体裁に整えられるくらいが関の山


242 :デフォルトの名無しさん:2009/03/13(金) 17:51:37
通貨、「Excelとハサミは使いよう」だ

243 :デフォルトの名無しさん:2009/03/13(金) 17:53:43
>>240
すごく役に立つよ
でもどう役立つのかいまいち分らんなら素質ないかも知れんから
使えるやつを捕まえてうまくおだててやらせるすべを覚えときゃいい
そいつが全部やってくれる

244 :デフォルトの名無しさん:2009/03/13(金) 19:26:17
仕事するにあたって便利になるように、小物ツールを作る程度だな

245 :デフォルトの名無しさん:2009/03/13(金) 20:05:05
今の管理職にはパソコンの使い方自体覚束ないような人が多い
プログラムで効率化したところで、彼らには何をやっているのかすら分からないから
一切評価されない。空いた時間以上に無茶振りされて仕事が増えるだけ

そういう意味では役に立たない

246 :デフォルトの名無しさん:2009/03/13(金) 21:00:12
メインの言語何か別にやってて
必要なとき覚える程度ならいいけど
この言語が初めてとか、病気になるよ(笑)

247 :デフォルトの名無しさん:2009/03/13(金) 21:10:45
>>246
ABAPとVB6.0しか実務で扱ってないので、転職先が無い・・・

248 :デフォルトの名無しさん:2009/03/13(金) 21:20:21
ピボットテーブルがあるのになんでVBAなんか使うの?

249 :デフォルトの名無しさん:2009/03/13(金) 21:21:57
SAPいいじゃん
あとはうまくでっちあげろ

250 :デフォルトの名無しさん:2009/03/13(金) 21:22:33
ピボットテーブルでは集計しか出来ないから

251 :デフォルトの名無しさん:2009/03/13(金) 21:27:05
この言語ででかいもの組まれると作るのはいいが
引き継ぐ人間のことを考えると涙しかでないな

252 :デフォルトの名無しさん:2009/03/13(金) 21:31:26
おれはVBAしか出来ないからどう困るか想像できんのだけど

253 :デフォルトの名無しさん:2009/03/13(金) 22:27:19
>>252
あって然るべきものがフツーにない場合が多い
のと、シート毎に行数を取って置くのが面倒だからと隅っこに忍ばせた白文字の行数とかIDとかテラウザス
開発者のちょっとしたお茶目がとんでもない殺意を生み出す
さらに別に無駄に出力してるわけではなく
当然客がいじりたおすわけで忍ばせた文字が残っている保証もなければ
忍文字と内容が一致してるわけもなくさらにフォーマットからいって違う可能性もあるしで
仕様やそこに至った経過をしらんとどうしようもないような要素がさらっと入る
バージョン管理ツールも効かないしね
この言語で綺麗に組むって多分目的からズレてんだろうなってフツーに思うけど引き継ぐのは嫌

254 :デフォルトの名無しさん:2009/03/13(金) 22:30:59
なるほロケット

255 :デフォルトの名無しさん:2009/03/13(金) 23:22:45
そのレベルの奴しか周りにいないなんて可哀相だな

256 :デフォルトの名無しさん:2009/03/13(金) 23:28:31
>>238
返事が遅くなりました。
アドバイスありがとうございます。
もうちょっと勉強を進めていきたいと思います。

257 :デフォルトの名無しさん:2009/03/13(金) 23:51:54
>>250
Excelなんて集計にしか使わないだろ。

258 :デフォルトの名無しさん:2009/03/13(金) 23:56:42
集計なんてAccessでしかやらんが。

259 :デフォルトの名無しさん:2009/03/14(土) 00:04:19
>>258
Excelでは何やってんの?

260 :デフォルトの名無しさん:2009/03/14(土) 00:28:49
別に誰が何やってようと関係どうでもいいことだ
くだらない雑談は終わりにしようぜ

261 :デフォルトの名無しさん:2009/03/14(土) 04:14:42
ExcelVBAは基本的にCOMコンポーネントだけの言語なので、
COMができる仕事ならExcel VBAでも出来る。
これを集計しかできないとか、レポートにしか使い道が無いというのは…。

俺がよくやっていたのはXMLのパージングと生成やらテストデータの作成。
ほかにも死ぬほどの仕事をExcelVBAに叩き込んだ。
たぶん今やってるプロジェクトの数パーセントは俺のマクロだより。
EmacsやPerlと心中するような奴でもExcel VBA覚えるべき。
ExcelVBAはWindowsの糊言語だよ。

262 :デフォルトの名無しさん:2009/03/14(土) 04:29:33
やだなぁなんも蓄積してかないし
vbaはあくまでもメインのプログラムとの橋渡しだけにしたいなぁ
バージョン管理も効かないし
作ったはいいけどエクセルデータ触るたびにvbaも修正が必要とかなりそう

263 :デフォルトの名無しさん:2009/03/14(土) 04:55:41
全部思いこみだねえ

264 :デフォルトの名無しさん:2009/03/14(土) 05:31:24
ていうか、集計やレポートの作成以上難しいことをやったらいかんよ
できるできないは別として

265 :デフォルトの名無しさん:2009/03/14(土) 06:29:45
262みたいな子って、結構居るよ。
組込マクロ言語から入って単独開発言語を囓り始めた時期に
こういう症状が出ることがある。
基礎が出来てりゃあんなバカな発想はしないんだけどな。

266 :デフォルトの名無しさん:2009/03/14(土) 06:34:13
基礎云々じゃなくて作るだけの人と保守までしなきゃならない人との違いだろ

267 :デフォルトの名無しさん:2009/03/14(土) 06:51:01
基礎が出来てないから、VBAの保守ごときで右往左往してしまう件

268 :デフォルトの名無しさん:2009/03/14(土) 07:59:58
>>267
保守できないのは努力が足りない?


269 :デフォルトの名無しさん:2009/03/14(土) 09:13:24
集計するならピボットもVBAもイラン
いまのとこ数式で事足りてる

270 :デフォルトの名無しさん:2009/03/14(土) 10:21:22
やたらとセルにどっからでもアクセスできるからソースはクソになりがちではある

271 :デフォルトの名無しさん:2009/03/14(土) 10:27:52
とあるExcelで作られたシステムを引き継いだんだけど
これってVBで作ったほうがよくね?って思ってる。
なぜExcelで作ったのかなぞだ。

272 :デフォルトの名無しさん:2009/03/14(土) 10:35:25
この話題が出てるときに、このあからさまなネタw

273 :デフォルトの名無しさん:2009/03/14(土) 11:11:34
この話題だから書いただけなのに

274 :デフォルトの名無しさん:2009/03/14(土) 12:01:08
で?

275 :デフォルトの名無しさん:2009/03/14(土) 12:11:44
<font size="2">

276 :デフォルトの名無しさん:2009/03/14(土) 12:13:50
そんなにExcelがすきなの?

277 :デフォルトの名無しさん:2009/03/14(土) 12:48:21
すべてvbaで作って自分しか保守れないようにするんだ

278 :デフォルトの名無しさん:2009/03/14(土) 12:51:28
</font>

279 :デフォルトの名無しさん:2009/03/14(土) 15:26:16
>>262
プログラムを書いたことが無いのかもしれないが、
入出力が変わったら、どんな言語ツールでもプログラムを書き換えるだろ。

280 :デフォルトの名無しさん:2009/03/14(土) 15:27:06
マクロって隠すことできるんですか?
たくさんマクロが組まれてそうなファイルを手に入れて
分析したいのですが、標準モジュールには簡単なマクロしか
入ってません。

フォームのボタンらしきもので色々動くファイルなのですが
ボタン自体が保護されているような状態。


281 :デフォルトの名無しさん:2009/03/14(土) 15:30:39
デザインモードでアクセスできました
すみません。

282 :デフォルトの名無しさん:2009/03/14(土) 17:05:29
俺はRDBをExcelにDumpingして、VBSの正規表現を使って仕事してる。
どんな会社でも、どんな業種でもExcelファイルなら開けるってシェアの大きさは有利だよ。

シェア率って、本当に大切だよ。

283 :デフォルトの名無しさん:2009/03/14(土) 17:13:43
>>282
VBS・・・?

284 :デフォルトの名無しさん:2009/03/14(土) 17:17:05
COMのVBScript.RegExpのことじゃないの?

285 :デフォルトの名無しさん:2009/03/14(土) 19:27:11
質問ですー
VBEの画面でOと0の見分けがつかんの何とかならんですか?

286 :デフォルトの名無しさん:2009/03/14(土) 19:38:32
フォントは自由に選べますよ

287 :デフォルトの名無しさん:2009/03/14(土) 19:44:26
>>285
プロポーショナルフォントじゃ無くせばOK。
例)Pゴシック→ゴシック って意味ね。

288 :デフォルトの名無しさん:2009/03/14(土) 19:45:40
区別できるフォントを捜して設定すればいいんですね
週明けに早速試してみますありがとうございます

289 :デフォルトの名無しさん:2009/03/14(土) 19:58:29
Range("A" & i)



290 :デフォルトの名無しさん:2009/03/14(土) 20:51:35
質問です。
指定した1秒未満の短い時間(0.5秒など)だけマクロを停止させたいと考えています。
Application.Wait メソッドなどでは最短でも1秒は停止しなければならないようですが
これは可能なのでしょうか?

291 :デフォルトの名無しさん:2009/03/14(土) 21:00:55
APIでSleep()がGetTickCount()定義して処理する

292 :デフォルトの名無しさん:2009/03/14(土) 21:13:03
基本的なことだが、VBAとVB6はほぼ同じ。
グーグルでVB6をつけて検索すれば大抵のことは解決する。
初心者さんはまずVB6で検索してくれ。

293 :デフォルトの名無しさん:2009/03/14(土) 22:28:19
>>291
Sleepを使う事で解決できました。ありがとうございます。

294 :デフォルトの名無しさん:2009/03/15(日) 01:33:19
Application.Wait [NOW()+"0:00:00.1"]

295 :デフォルトの名無しさん:2009/03/15(日) 01:54:45
WaitやOnTimeは、1秒未満を指定してもエラーにはならないけど
1秒単位に丸めて処理されるから意味無いよ

Application.Wait [NOW()+"0:00:00.1"]
Application.Wait Now()
は同じで
Application.Wait [NOW()+"0:00:00.6"]
Application.Wait [NOW()+"0:00:01"]
も同じ

296 :デフォルトの名無しさん:2009/03/15(日) 01:58:36
うそ、仕様が変わったのか?

297 :デフォルトの名無しさん:2009/03/15(日) 02:05:18
Sub a()
t1 = Timer
Application.Wait [NOW()+"0:00:00.1"]
Debug.Print Timer - t1
End Sub

0.1103516
0.1000977


298 :デフォルトの名無しさん:2009/03/15(日) 02:16:28
確か丸めは環境依存だったような。
確実な方法では無いから普通は使わないけど。

299 :デフォルトの名無しさん:2009/03/15(日) 03:55:41
これが環境依存とは聞いたことないな。
みんな普通に使ってるようだけど。

300 :デフォルトの名無しさん:2009/03/15(日) 07:27:51
>>297やってみたら

97%くらいは
0

3%くらいが
0.015625

だった

301 :デフォルトの名無しさん:2009/03/15(日) 11:17:35
Waitやってるやつ環境くらい書けば?
XP, Excel2000,はOK

302 :デフォルトの名無しさん:2009/03/15(日) 13:38:34
これさ
ミリ秒単位ってほぼとれてなくない?
数字の上でどうでてようととれるもんはめちゃくちゃなんだけど?
0ms5msって交互にとれるけどホントか?これ?(笑)

303 :デフォルトの名無しさん:2009/03/15(日) 15:02:00
今やってるのは100ミリ秒だろ

304 :デフォルトの名無しさん:2009/03/15(日) 16:17:21
Application.Wait [NOW()+"0:00:00.1"]
は、うちでも0.1秒前後になるけど、WinAPIのSleepと比べるとものすごくばらつきが大きい。
Sleepだと100回やって100〜104msと100ms未満になることは無かったし超過も僅かだが
Application.Waitは80ms台が数回出たし、超過誤差もSleepの10倍以上。

処理上、僅かな超過が出るのは仕方のないことだし、それは環境にも依存することだが
その超過量が同条件でのSleepより遙かに大きかったり、指定未満になったりするのは
明らかにApplication.Waitの欠陥で、1秒未満の処理がまともに出来ているとは言いがたい結果だな。

因みに環境はWinXP/Excel2003

305 :デフォルトの名無しさん:2009/03/15(日) 16:53:42
>>304
Application.Wait [NOW()+"0:00:00.25"]
だとどう?

306 :デフォルトの名無しさん:2009/03/15(日) 16:56:57
>>304
あるいは、
Application.Wait [NOW()+"0:00:00.0625"]
とか

307 :デフォルトの名無しさん:2009/03/15(日) 16:58:07
>>297はXPSP3 Excel2007

10ミリ秒の精度が必要か?
所詮、いくらSleepの精度が高くてもCPUやメモリなどの競合で
処理の遅延することは避けられないし

308 :デフォルトの名無しさん:2009/03/15(日) 17:15:17
まあ、そもそも>>290がどんな要件に使うのかすら、オレには想像つかない。



309 :デフォルトの名無しさん:2009/03/15(日) 18:09:52
そうか?
>>290は1秒じゃ長いから0.5秒くらいで待ちたいと言ってんだろ?
そのときに0.01秒の誤差なんか気にするか?
0.1秒の誤差も気にならないかも

310 :デフォルトの名無しさん:2009/03/15(日) 18:19:03
俺はそんなもの測れると思ってないけどね
長年ゲームアプリ作ってきた勘
テキトーな間隔でテキトーに止まるとは思うけど
数秒に数回成功するって目安だな

311 :デフォルトの名無しさん:2009/03/15(日) 18:44:41
そうか?
1秒で待つか0.5秒で待つかで実際やってみると体感的に違うけどな


312 :デフォルトの名無しさん:2009/03/15(日) 18:45:47
VB6のSleep() APIでも数ミリ秒の誤差はある
VB系でミリ秒気にするのは病みすぎ
スレッド使える他言語でやれよ
(ActiveX使えとかWindowsじゃ無理とか言うなよw)


313 :デフォルトの名無しさん:2009/03/15(日) 19:00:50
お前ら、よく知らんことには口出すな

314 :デフォルトの名無しさん:2009/03/15(日) 19:19:44
教えてください。
上位のコンボボックスの選択しだいで、下位のコンボボックスが空の場合も、値が入っている場合もあります。下位のコンボボックスに値が入っている場合のみ実行したいコードがあるのですが、条件式としてはどのように記述すればいいのでしょうか?
お願いします。

315 :デフォルトの名無しさん:2009/03/15(日) 19:26:36
なんらかのトリガ時に両方見ればいくね?

316 :314:2009/03/15(日) 19:32:44
>315
ごめんなさい。よく分かりません。

317 :デフォルトの名無しさん:2009/03/15(日) 19:47:00
ボタンかなんか押してプログラムが動くんだろ?
だったら、ボタン押した時に2つのボックスの中身を見て判断すれば良いんじゃねーの?
この内容が分からないんなら、コンボボックスの使い方を説明してるHP見たほうが早い。

318 :デフォルトの名無しさん:2009/03/15(日) 21:38:22
>>314
上位のコンボボックスの選択されている値をみればいいんじゃないかな
下位のコンボボックスに値をセットしたり空にしたりする処理があるんだから、
そのための判定式がその処理のとこにあるだろう


319 :デフォルトの名無しさん:2009/03/15(日) 21:59:07
>>314
ttp://www1.axfc.net/uploader/He/
He_205317.xls
Pass : prog

320 :314:2009/03/15(日) 22:45:03
>319さんへ
わざわざ親切にありがとうございました。
私の説明が悪かったのですが、「下位のコンボボックスが空」とういうのは、「ボックスに何も
表示されていない状態」のことではなく、「ボックスに何も表示されていないし、ボックス中に
何の選択肢もない状態」のことなんです。上位に対応する下位がない場合、ボックスを空に
しているのです。「ComboBox2.Text <> ""」という記述は前者のようです。
もしよかったらまた教えてください。

321 :デフォルトの名無しさん:2009/03/15(日) 22:53:00
>>320
どちらにしろTextが空なんだからそのIfでOKだろ?
嫌ならListCountで項目数判定汁


322 :314:2009/03/15(日) 23:02:24
ListCountでできました。
ありがとうございました。
じぶんなりによく考えて、よく調べたつもりだったんですが・・・
まだまだ初心者の域を抜け出せてないようです。

323 :デフォルトの名無しさん:2009/03/15(日) 23:05:29
>>314
ユーザー入力でCombo Textの空文字判定が曖昧になること心配しているなら、
ComboをReadOnlyにするという方法もある。
まあ頑張って下さい。

324 :デフォルトの名無しさん:2009/03/18(水) 22:02:18
2007 xlsm vista
今まで(2003 xpでは)正当に動いていたマクロが機能していません。
どのように修正したらいいものかさっぱりの状態ですので、教えてください。
よろしく。

sub モジ()
Aマクロ
Bマクロ
Cマクロ
end sub
で、Aマクロの中にapplication.run "dataweb" があるのですが、
webデータ取得(を全くすることなく)前に、 Bマクロにさっさといってしまいます。


325 :デフォルトの名無しさん:2009/03/18(水) 22:24:01
ブックごとうpしろ
出来ないなら帰れ

326 :324:2009/03/19(木) 00:57:50
ブックごとのアップはできません、悪しからず。
調べる端緒がほしいので、よろしく。

2003で同期だったものが、2007では非同期になってしまうということです。
そうゆうことはあり得るのでしょうか?


327 :デフォルトの名無しさん:2009/03/19(木) 01:07:54
>>326
Bマクロでブレイクすれば、データが取れるの?

328 :324:2009/03/19(木) 01:46:10
Bマクロでブレイクして、データ取得はできます。

なお、Aマクロ単独での動きは、2003及び2003互換モードで正常ですが、
2007ではやはり、勝手に先に動きます。



329 :デフォルトの名無しさん:2009/03/19(木) 04:04:03
Call

330 :デフォルトの名無しさん:2009/03/19(木) 05:53:09
>>326
それは同じマシンでもそうなるの?
2007から複数コアCPUがサポートされてるから、そうなる可能性はあるとは思うが

関係ないかもしれないが、一度マルチスレッド計算のオプションはずして試してみては?


331 :324:2009/03/19(木) 10:51:06
>>330 サンクス。
2007 XP機で試してみました。ちゃんと正常に動いたことから、
VISTA機でのみ正常に、動作していないことになります。
マルチスレッド計算のオプション外しもやってみましたが、変わり無しです。

なお、VISTA機ではmsgboxだけなら止まるのですが、msgboxの次にendがあったりすると
msgboxは流れています。
inputメソッドも止めることなく、流れていってます。
この症状は、Aマクロの中でも、Bマクロの中でも同様に起こっています。


332 :324:2009/03/19(木) 10:55:03
>>329
Callは書いても書かなくても一緒でした。

333 :デフォルトの名無しさん:2009/03/19(木) 11:23:15
procedureの呼び方ですが、
「プロシージャ」と「プロシジャー」
どちらが一般的なのでしょうか。

334 :デフォルトの名無しさん:2009/03/19(木) 11:30:57
プロシージャ

335 :デフォルトの名無しさん:2009/03/19(木) 13:07:50
prэsi':dзэ(r)

336 :デフォルトの名無しさん:2009/03/19(木) 15:41:11
手続き
と日本語で解釈b

337 :デフォルトの名無しさん:2009/03/19(木) 19:56:29
>>331
msgboxは流れる ってのがよくわからんが、msgboxでok押す前に次の行が実行されてるってことか?
簡単に試したがうちではそうならないし、現象が発生する最低限のコード晒して見たら


338 :デフォルトの名無しさん:2009/03/20(金) 05:53:15
質問です。
userFormのTextBoxsに09と入れ、セルに入力すると9になります。
変数(string)代入しても、上手くいきません。
どうしたらいいでしょう?
対象セルの書式設定も文字列にしています。

339 :デフォルトの名無しさん:2009/03/20(金) 06:53:59
' を頭に結合させてみてはいかがかな。

cells(1,1).value = "'" & textbox.value
のように。

340 :デフォルトの名無しさん:2009/03/20(金) 07:27:25
>>339
上手くいきました!
ありがとうございます!

341 :デフォルトの名無しさん:2009/03/20(金) 09:30:53
>>338
対象セルの表示形式が文字列になってれば、おれんとこじゃ09になるけど?

342 :デフォルトの名無しさん:2009/03/20(金) 09:35:01
>>324
あんたの質問内容ってこう見えるよ。何を答えろと・・・

今、車で走ってて道に迷いました。今まで普通に走ってきた道ですが・・・
どうしたらいいでしょう。よろしく。

出発点
 ルートA、ルートB、ルートC
到着点

ルートAに看板があるのですが、暗くて分かりません。

Q そもそもどこ走ってる?A 言えません
Q 地図ねーの?         A 今までの地図と違うみたいです
Q 誰か近くにいねーの?A 止まってくれません・・・

343 :デフォルトの名無しさん:2009/03/20(金) 09:41:47
コード晒す気がないみたいだから答えてほくないんだろ
もしくは荒らし

344 :デフォルトの名無しさん:2009/03/20(金) 10:00:43
やっぱりそうだよね。真剣に考えて損したよ。
一応、エスパースレいってみれば? >>324

345 :デフォルトの名無しさん:2009/03/20(金) 10:10:37
>>338
文字列変換用関数というのもある。こっちの方が便利かと
string str = Format$(123, "00000")

346 :デフォルトの名無しさん:2009/03/20(金) 19:39:25
これってどう?

Excel VBA アクションゲーム作成入門 Excel 2007/2003/2002 対応
ttp://www.amazon.co.jp/gp/product/4844326864/



347 :デフォルトの名無しさん:2009/03/20(金) 22:59:07
リアルタイム処理を考慮されてない言語で無理矢理ゲームを作るのは
趣味としてやるには面白いかもしれないけど実用性は低い

348 :デフォルトの名無しさん:2009/03/20(金) 23:59:25
ミニゲーム系はFlashの独壇場。
Excelでやる必要性はない。

349 :デフォルトの名無しさん:2009/03/21(土) 00:00:39
はぁそうですか

350 :デフォルトの名無しさん:2009/03/21(土) 00:40:17
Excel VBAしか知らないから
俺には丁度いいかも

351 :デフォルトの名無しさん:2009/03/21(土) 10:38:52
VBAで出来ない事じゃないし、やってる人もいるけどさ・・・。
それはあくまで ”出来る” であって、向いてる訳じゃないのよ。

例えば、アクションゲームならばFPSって概念を持ってるFlash(ActionScript)で作った方がいいよね。
衝突判定の関数をVBAで組むならば、ASにはその物ズバリの関数が既にある訳。シェイプが接触したいるかどうかをbooleanで返す。
Flashはドローツールから派生してるんで、シェイプを扱う能力が超高い。現状だと最高峰。
MovieClipって形で、duplicate、attack、色んな複製をしつつ、それら全てにプログラムを組みこむ事も出来る。
リアルタイムで動くタイムラインを、全てのシェイプが保持出来る訳で、ゲームには凄く向いてる。

決してVBAがダメと言ってる訳じゃないよ。VBAが光る分野は別の所。
向き不向きがあるから、それに則る方が良いかも。と言う観点で。

352 :デフォルトの名無しさん:2009/03/21(土) 10:42:15
だいたいなんらかのプログラムが組めるなら別の言語なんて習得に1週間かかんねぇだろ
やらないで怖がってるだけの奴は馬鹿
なんでもかんでもVBAでやろうとすんな

353 :デフォルトの名無しさん:2009/03/21(土) 12:02:05
Flash厨うぜえぞ

354 :デフォルトの名無しさん:2009/03/21(土) 13:18:32
「セルをドットに見立ててゲームをつくる」とかすごすぎw

なに?
>ワークシート上のセルを方眼紙のように正方形にしてどっとに見立てて、ワークシートを
>縮小して表示することで、グラフィックを表現する手法で、セルの1つ1つの背景色が
>そのままドットの色になります。
って


355 :デフォルトの名無しさん:2009/03/21(土) 15:49:14
attachですた。

356 :デフォルトの名無しさん:2009/03/21(土) 15:59:42
attach No.1・・・って、違うか?!

357 :デフォルトの名無しさん:2009/03/21(土) 17:30:13
オートシェイプをスプライトに見立てて作ったゲームってのも
あってもよさそうだが見たことがない。
みんなワークシートにドット絵を描きたがるのはなんでだろう。

358 :デフォルトの名無しさん:2009/03/21(土) 17:54:34
>>357
座標関係じゃね?セル位置のほうが初心者には直感的。
もしくは、オブジェのNewとか、オブジェクトの一意のID指定がメンドイとか。

個人的には、VBAで2Dゲームは初心者に向いてると思う。
描画の基礎は勉強できるでしょ。

359 :デフォルトの名無しさん:2009/03/21(土) 18:06:52
>>352
スレチだが言語によると思うぞ。俺はVC/JAVA屋でC#に四苦八苦。
さらにDirectXなんかは思想の理解にてこずるし。
まあ、言語というよりはフレームワークの問題だが・・・

あと、半月くらいVB系触らないと構文殆ど忘れるしw

360 :デフォルトの名無しさん:2009/03/21(土) 19:53:36
>>354
アラン・ケイの本に、セルを使って棒グラフを表現する例が載っていたから、
画期的なアイデアと言うほどではないな。

361 :デフォルトの名無しさん:2009/03/22(日) 10:30:03
すいません。次のことをしたいのですが、簡単だと思ったのですが、
出来なく困っています。

最初にB列の任意のセルを一つ選び、
その選んだB列のセルに、常にR24のセルをコピーし
貼り付けたいのですが、色々やりましたが出来ません。

例えば、
セルB28を選び、マクロを実行したらR24をコピーし同じくB28に貼り付ける。
セルB30を選び、マクロを実行したらR24をコピーし同じくB30に貼り付ける。
セルB77を選び、マクロを実行したらR24をコピーし同じくB77に貼り付ける。

たったこれだけのことですが、このマクロの部分が相対参照にしても出来ません。
識者の方宜しくお願い致します。
なお
EXCEL;ver2000
OS:win2000
VBA;多少使えます。

宜しくお願い致します。

362 :デフォルトの名無しさん:2009/03/22(日) 10:43:12
ActiveCell = Range("R24")

> VBA;多少使えます。
それはないだろ…

363 :デフォルトの名無しさん:2009/03/22(日) 10:55:31
lol

364 :デフォルトの名無しさん:2009/03/22(日) 10:58:01

デフォルトプロパティを省くな


365 :デフォルトの名無しさん:2009/03/22(日) 10:58:10
>>362
有難うございます。しかし調べ、いろいろ試し下記のコードを作成したのですが・・・

ActiveCell = Range("R24").Copy
ActiveCell.Offset(30, -2).Range("A1").Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
Application.CutCopyMode = False
End Sub

↑出来ませんでした。R24だと手間が掛かってしまうと思うので、

任意のB列のセルにセルA1の値をコピーし貼り付ける。

という例で結構ですからコードをお願いできないでしょうか?

例えば、

セルB5を選び、マクロを実行したらA1をコピーし同じくB5に貼り付ける。

たったこれだけで良いです。宜しくお願い致します。

366 :デフォルトの名無しさん:2009/03/22(日) 11:45:26
cell(2,5).value = cell(1,1).value
cell(2,5).interior.colorindex = RGB(255,255,255)
こんな感じだった気がする

367 :デフォルトの名無しさん:2009/03/22(日) 12:16:38
>>366
cell → cells
colorindex → color

368 :デフォルトの名無しさん:2009/03/22(日) 12:34:13
セル情報全部コピーしたいって前提なら、↓で良いと思うがね。

Sub test()
Cells(1, 1).Copy ActiveCell
End Sub

369 :デフォルトの名無しさん:2009/03/22(日) 12:39:14
「R24だと手間」があったからValueにしてみた
色は関係ないのか。斜め読みスマソ

370 :デフォルトの名無しさん:2009/03/22(日) 16:27:59
>>365
VBAがまったくわかってないようなんで、ヒントじゃなくて完成したマクロを書いといてやる。

Sub Macro1()
  ActiveCell = Range("R24")
End Sub

371 :365:2009/03/22(日) 17:16:18
皆様本当に有難うございます。
只今仕事からかえってきました。んでまた仕事ですorz。
報告は後ほどさせて頂きます。

372 :デフォルトの名無しさん:2009/03/22(日) 20:25:56
>>370
プロパティを省略するな。と何回言わせるのだ・・・。

373 :デフォルトの名無しさん:2009/03/22(日) 21:30:20
openのメソッドを勉強中ですが、
「updatelinks」引数の説明の中で、
「リモート参照」と「外部参照」という2つの言葉が出てきました。
「リモート参照」「外部参照」とはどういう意味ですか?
ググってみても出てきませんでした
(T_T;)。

374 :デフォルトの名無しさん:2009/03/22(日) 22:19:52
>>372
ケチつけてるヒマがあったら正解を示せ。と何回言わせるのだ・・・。

375 :デフォルトの名無しさん:2009/03/22(日) 22:54:11
Sub test()

selection.value=range("A1").value

End sub

A1の値を今選択しているセルの値に



376 :デフォルトの名無しさん:2009/03/22(日) 23:03:17
↑あ、説明間違った。
今選択しているセルにA1の値を入れると。
ちなみにこの場合はActivecellよりselectionの方がいいと思うよ。

377 :デフォルトの名無しさん:2009/03/22(日) 23:08:07
>>374
え、付けるべきプロパティが解らないの?

コードが根本的に間違っていると言ってるわけじゃないのに
それでも「正解を示せ」と言うからには、それくらいしか思いつかない…

378 :365:2009/03/22(日) 23:33:25
365です。
あれから>>370さんのコードをそのまま頂いたら、
出来ました!!!
>>370さん本当に感謝です。
コードまでそのまま書いてくださり大変助かりました。
しかしこんな簡単なコードで出来るとは、
拍子抜けです。
勉強不足を感じました(汗。感謝。

>>366さん
>>368さん
わざわざ有難うございます。
どうやら私の説明が悪く、
何をしたいのか正確に伝えれなかったみたいです。
アドバイスいただきましたが、
それとはちょっと違いました。
ですが親切に本当に有難うございました。

ではお騒がせしました(ぺこり

379 :デフォルトの名無しさん:2009/03/22(日) 23:34:11
>>378
>>362

380 :デフォルトの名無しさん:2009/03/23(月) 00:01:22
おれが即座に>>362でレスしたのはスルーだったわけだ

381 :365:2009/03/23(月) 00:07:42
>>380

いえ、>>365の最初

ActiveCell = Range("R24").Copy

で使わせてもらいました。
>>362さん=>>370さん
だと思っていたのですが・・・。

最初に回答を頂いていたようで有難うございます。
しかし、これは「ヒント」だと思ったので、
>>365のような長居コードになってしまいました。

382 :デフォルトの名無しさん:2009/03/23(月) 00:08:34
>>377
なんか本気で自覚がなさそうだから親切に教えてあげるけど、
デフォルトのプロパティがどうとか正解が知りたいんじゃなくて
「煽りがウザイ」って遠回しに言ってるんだと思うぞ。

プログラマーの精神年齢が低いのは世界共通の現象らしく、
とある海外のプログラミングの入門書にも
「まず大人になれ」みたいに書いてあって吹いたわ。

383 :デフォルトの名無しさん:2009/03/23(月) 00:10:19
プロパティの重要度も分かってない奴が適当な回答して悦に浸るのは間違ってる。

>>365ではコピペしようと試みてるのに、destination使ってコピしてる>>368のコードは違うと言いきってるし。
どういうこっちゃ。

だいたいから、なんで .value を省略する馬鹿が多いんだ?
プロパティ省略なんて百害あって一利無しだ。
可読性もひったくれもあったもんじゃない。

384 :デフォルトの名無しさん:2009/03/23(月) 00:11:04
なんでマジになってるの?

385 :デフォルトの名無しさん:2009/03/23(月) 00:11:07
まあ今の時点でValueやらTextやら書いてもどうせ意味分からんだろうし
省略してることで壁に当たったとき、もう一度勉強しなおせばいいさ

386 :デフォルトの名無しさん:2009/03/23(月) 00:11:36
プロパティの呼び方も分かってない奴がプログラマーとか笑わせるなよw
マジで。

387 :デフォルトの名無しさん:2009/03/23(月) 00:12:03
> 百害あって一利無しだ。
コードが短くなるという利があるでしょ

388 :デフォルトの名無しさん:2009/03/23(月) 00:12:21
皮肉や嫌みが通じないのは、目の前のコードを100%文法通りに解釈する訓練を受けた弊害だな

389 :デフォルトの名無しさん:2009/03/23(月) 00:13:28
プロパティは知らなくても俺には関係ないが、それなら copyメソッドを勧めるべきだろ。

390 :デフォルトの名無しさん:2009/03/23(月) 00:14:10
>>387
横から突っ込むけど
それって利点なのか?w
必要なことを表現してない短縮って百害あ(ry・・・以下ループ

391 :デフォルトの名無しさん:2009/03/23(月) 00:15:53
古いバージョンのVBAだとRange( )よりRange( ).Valueのがかなり高速だったんだけど、
今のバージョンでは差が出ないんだよな。
当のMSもデフォルトプロパティの省略は推奨してないんだけど、言うことを聞かない
日曜プログラマが多いから仕様を変更したんかな。

392 :デフォルトの名無しさん:2009/03/23(月) 00:19:44
一般論として、変に省略すると、うっかり複数のセルが選択された状態でマクロを呼んだら
エラーになったり関係ない周囲のセルを書き換えたりすることがあるから
もうちょっと丁寧にコーディングした方がいいと思う。

393 :デフォルトの名無しさん:2009/03/23(月) 00:19:50
右辺を省略すると誤作動起こす可能性があるぞ。

394 :デフォルトの名無しさん:2009/03/23(月) 16:22:07
xp 2003のADODB.Streamに関する質問です
shift-jisで読み込んだファイルをutf-8に変換して
バイナリモードにして.Wirteした後にさらにバイナリデータを追記したいのですが
.Write bytData
.Write chr(10)
とすると'実行時エラー3001'になってしまいます。
どうかご教示よろしくお願いいたします。

With SecondObj
.Position = 0
.Type = adTypeBinary
.Position = 3 '先頭から削除する文字数
bytData = .read
.Write bytData
.Write 追加したい文字列
.SaveToFile saveFile, adSaveCreateOverWrite
.Close
End With

395 :デフォルトの名無しさん:2009/03/23(月) 16:42:29
Write バイト配列

396 :デフォルトの名無しさん:2009/03/23(月) 17:40:17
すいません。
シートにプリントスクリーンで貼り付けた写真や図やらがあるのですが、
定期的に全て削除したいのですが、
VBAでやりたいと思います。
調べたのですが分かりませんでした。
識者の方、ご教授お願い致します。

なおexcel=2000
OS=2000

でう。宜しくお願い致します。


397 :デフォルトの名無しさん:2009/03/23(月) 18:51:22
どう調べて、どこが分からなかったのか?
まずはそれをそっとささやいて欲しい

398 :デフォルトの名無しさん:2009/03/23(月) 19:20:12
>>397
すいませんでした。
ネットと手持ちの本で調べたのですがのっていません。
自分でやったら、

数式
データ
書式設定

これらは削除できるのですが、
プリントスクリーンの画像だけは残ってしまいます。

399 :デフォルトの名無しさん:2009/03/23(月) 21:59:21
>>398
なんかシートごと消した方がいいような感じの発言ですね
でも一応
For Each shp In ActiveSheet.Shapes
shp.Delete
Next shp


でアクティブなシートのシェイプが全部消えるよ

400 :デフォルトの名無しさん:2009/03/23(月) 23:18:54
>>399
有難うございます!!!
今やったら出来ました。

大感激です!!!!!

本当に有難うございました!

401 :デフォルトの名無しさん:2009/03/23(月) 23:44:09
>シートにプリントスクリーンで貼り付けた写真や図やらがあるのですが、
>定期的に全て削除したいのですが、

興味本位だけどどういう使い方してんの?

402 :デフォルトの名無しさん:2009/03/23(月) 23:54:03
すみません初歩的な質問なんですが
オートフィルタで抽出した可視セルの値を配列変数に代入したのですが
うまくいきません。

Sub test()

Dim atai() As Variant
Dim gyo() As intger

Sheets(1).Range("A1").AutoFilter 3, ">0"

ReDim atai(0), gyo(0)
atai(0) = Sheets(1).Range("A2", Range("A2").End(xlDown)).SpecialCells(xlCellTypeVisible).Value
gyo(0) = Sheets(1).Range("A2", Range("A2").End(xlDown)).SpecialCells(xlCellTypeVisible).Count

Sheets(2).Range("A2", "A" & gyo(0)).Value = atai(0)

End Sub

上記のコードではうまく配列に値を代入できません。
どなたかご教授願います。


403 :デフォルトの名無しさん:2009/03/24(火) 00:32:50
>>402
おかしな部分が多すぎて、どこから教えたらいいのか…
自分で考えながら作るのもいいけど、まずはマクロの記録やってみ?
無駄がないように手順を良く考えてから、余計なキーを押さないよう、
余計な場所をクリックしないよう、慎重に操作しながら記録してみて、
それでもできあがったマクロは無駄が多いから、
それを自分で修正していくのがいいと思う。

404 :デフォルトの名無しさん:2009/03/24(火) 00:50:11
↑自動記録でどうやって配列変数に値を代入するの?


405 :デフォルトの名無しさん:2009/03/24(火) 01:22:04
>>401
株です。
ライトカッターって言うソフトで下部のチャートを切り取って、
それで明日の作戦を立てるのですが、
一週間もすると莫大なページを消費してなにが何だかになるので、
今回のVBAが必要になりました。

406 :デフォルトの名無しさん:2009/03/24(火) 01:25:55
オートフィルタに1件もひっかからなかった場合を考慮してないから注意な

Sub test()
  Dim atai() As Variant
  Dim gyo As Long
  Dim i As Long
  Dim R As Range
  Sheets(1).Activate
  Range("A1").AutoFilter Field:=1, Criteria1:=">0"
  Set R = Range("A2", Range("A" & Rows().Count).End(xlUp))
  gyo = R.SpecialCells(xlCellTypeVisible).Count
  ReDim atai(gyo - 1)
  i = 0
  For Each C In R.SpecialCells(xlCellTypeVisible)
    atai(i) = C.Value
    i = i + 1
  Next
  R.Copy Destination:=Sheets(2).Range("A1")
End Sub

407 :デフォルトの名無しさん:2009/03/24(火) 01:31:26
>>404
少なくとも最初のエラーはマクロの記録で解決するはず
自分で直せる部分は自力でやらせる方針なんで

408 :デフォルトの名無しさん:2009/03/24(火) 02:08:30
質問です。
エクセル2003を使ってグラフの散布図作成するマクロを作っているのですが
データの範囲に変数使用する方法が分かりません。

マクロの記録で

Charts.Add
ActiveChart.ChartType = xlXYScatter
ActiveChart.SetSourceData Source:=Sheets("Sheet1").Range("J4")
ActiveChart.SeriesCollection.NewSeries
ActiveChart.SeriesCollection(1).XValues = "=Sheet1!R1C3:R300C3"
ActiveChart.SeriesCollection(1).Values = "=Sheet1!R1C1:R300C1"
ActiveChart.Location Where:=xlLocationAsObject, Name:="Sheet1"

これを作成したあと、グラフの読み込む範囲が今300なのに対して
ここの300を変数に格納した数値を利用して変化させたいのです。

ActiveChart.SeriesCollection(1).XValues = "=Sheet1!R1C3:R300C3"
ActiveChart.SeriesCollection(1).Values = "=Sheet1!R1C1:R300C1"

ここにどのように変数を絡めたらいいのでしょうか。
変数には、行の一番最後を記録しています。
宜しくお願いします。

409 :デフォルトの名無しさん:2009/03/24(火) 02:16:47
>>408
gyou = 300
ActiveChart.SeriesCollection(1).XValues = "=Sheet1!R1C3:R" & gyou & "C3"
ActiveChart.SeriesCollection(1).Values = "=Sheet1!R1C1:R" & gyou & "C1"
とか

410 :408:2009/03/24(火) 02:24:39
>>409
ありがとうございます。
その&の前後の半角スペースが必須なのですね…。
そのやり方を試していたんですが、やっと解決しました。


本当に助かりました!!!

411 :デフォルトの名無しさん:2009/03/24(火) 02:31:21
スペースの有無で&記号の意味が変わるのってVBの最大の欠点だよな。
誰でも一度ははまったことあるはず。

412 :デフォルトの名無しさん:2009/03/24(火) 07:47:15
c言語より後にできたくせにc言語より駄目な言語ばっかりで凹むよね

413 :デフォルトの名無しさん:2009/03/24(火) 22:25:05
VBSのRegExpをユーザー定義関数としてADDIN化するとか、
Excelの機能自体を拡張出来るスクリプトとしては優秀だな。
ワークシート関数で、リアルタイムで正規表現使えるのは便利だYo!

使ってる人多いから、ADDIN、ADDONもネットで簡単に拾えるし楽ちん。


414 :デフォルトの名無しさん:2009/03/25(水) 21:39:13
質問です。

forをつかってstr(i)に繰り返しデータを入れるようにして、
複数のボタンのキャプションを設定したいと考えてます。

bt1、bt2、bt3…と一部の数字だけ違うのですが、
上手くループで処理する方法はありますでしょうか。

415 :デフォルトの名無しさん:2009/03/25(水) 21:50:13
>>414
Controls

416 :デフォルトの名無しさん:2009/03/25(水) 22:15:32
ありがとうございます!

後、追加で知りたいんですが、
空のセルをstring型に取り込むと、空のままだと思うんですが、
それをcase文で判定するには、nullや””じゃうまくいきません。

セルが空の時は何かまた違う値が入るんでしょか?

417 :デフォルトの名無しさん:2009/03/25(水) 22:58:00
セルの初期値はEmpty(定数:vbEmpty)だけど、Emptyなら「Case ""」にマッチするはずだし
String型変数にEmptyを代入するとNullStringに変換されるので、尚更「Case ""」で問題ない。
因みにNullString(定数:vbNullString)は""と同義ね。

「Case ""」にマッチしないなら、セルが空ではない可能性が高いと思う。
Debug.Print Len(変数)
若しくは
Debug.Print Len(セル)
で、0になるか確認してみそ。0じゃなかったら空セルじゃないってこった。

418 :デフォルトの名無しさん:2009/03/25(水) 23:38:31
>>417
ありがとうございます。
一応、msgboxで確認してました。

今よくよく考えたら、""ではなく、" "にしちゃってたかも知れないです^^;
もうアドバイスを踏まえ、もう一度試してみます!

419 :デフォルトの名無しさん:2009/03/25(水) 23:57:58
ちょっと色々やってみたんですが、controlsを使うものがうまくいきません。。。

Controls("CommandButton" & "i").Caption = "test"
というのを、ソースに直接書いても動かないんでしょうか?

Me. Controls("CommandButton" & "i").Caption = "test"
にしても動きません。

ネットで探してみても、Moduleに書け的な事もありますが、

Public Sub chg(ByVal i As Integer)
End Sub

の間に書いて、callしても動きません。
どこがいけないでしょうか?

420 :デフォルトの名無しさん:2009/03/26(木) 00:08:18
変数「 i 」が「 1 」だとして
Controls("CommandButton" & "i")
だと、ボタン名は
CommandButtoni だぞ。
CommandButton1 なら
Controls("CommandButton" & "i") ではなく
Controls("CommandButton" & i) だ。

こういうのもMsgBoxやDebug.Printで
MsgBox "CommandButton" & "i"
などを確認すればすぐに解ることなので、そういう問題起きたら
動かねーって騒ぐ前に初歩的な確認を行う癖を付けようぜ。

421 :デフォルトの名無しさん:2009/03/26(木) 07:42:12
すいません。
書き間違えました。
ソースはしっかりiのみで、””で囲んではないです;;

422 :デフォルトの名無しさん:2009/03/26(木) 07:54:11
Me. Controls
  ↑このスペースはNGだ。

これも書き間違いなら
Me.CommandButton1.Caption = "test"
が動くか試せ。

423 :デフォルトの名無しさん:2009/03/26(木) 07:59:19
ソースはコピペしろ
書き間違いがなくなるし早いだろ

424 :デフォルトの名無しさん:2009/03/26(木) 09:28:58
すいません。セルを選択して、選択したところから左側のセルに、
「時刻」「日付」をそれぞれセルに書き込むコードを書いたのです。
該当部分のコードは


なのですが、そうしたら、時刻しか現れず、日付が出ません。
あれこれやって見て分かったのですが、
時刻と日付の順序を反対にすると

ActiveCell.Offset(0, -13).Range("A1").Select
Selection.Value = Date
ActiveCell.Offset(0, -14).Range("A1").Select
Selection.Value = Time

こうすると、日付は出るものの、今度は時刻が現れません。
色々試行錯誤をしたのですが、なぜか分からず困っています。
識者の方、何卒ご教授お願い致します。

なお、
excel:2000
OS;win2000です。
宜しくお願い致します。

425 :デフォルトの名無しさん:2009/03/26(木) 09:33:11
>>424
セルの書式

426 :424:2009/03/26(木) 09:33:52
>>424です。コードが一部抜けてました。>>424は破棄し、
丸々訂正させてください。丸々1から書き直すと下記になります。

すいません。セルを選択して、選択したところから左側のセルに、
「時刻」「日付」をそれぞれセルに書き込むコードを書いたのです。
該当部分のコードは
ActiveCell.Offset(0, -14).Range("A1").Select
Selection.Value = Time
ActiveCell.Offset(0, -13).Range("A1").Select
Selection.Value = Date

なのですが、そうしたら、時刻しか現れず、日付が出ません。
あれこれやって見て分かったのですが、
コードの時刻と日付の順序を反対にすると

ActiveCell.Offset(0, -13).Range("A1").Select
Selection.Value = Date
ActiveCell.Offset(0, -14).Range("A1").Select
Selection.Value = Time

こうすると、日付は出るものの、今度は時刻が現れません。
色々試行錯誤をしたのですが、なぜか分からず困っています。
識者の方、何卒ご教授お願い致します。

なお、
excel:2000
OS;win2000です。
宜しくお願い致します。


427 :デフォルトの名無しさん:2009/03/26(木) 09:45:43
あのさ、そのコードだと日付と時刻のセルの間が12〜13列空くってことは解ってるか?
間違っても日付と時刻が隣同士にはならないぞ。

とりあえずエスパーすると
ActiveCell.Offset(0, -14).Range("A1").Value = Time
ActiveCell.Offset(0, -13).Range("A1").Value = Date
で良いんじゃないかと思うのだが。

428 :424:2009/03/26(木) 09:58:12
>>427
有難うございます!!!あっけなく出来ました。
感謝です。
しかし、
>そのコードだと日付と時刻のセルの間が12〜13列空くってことは解ってるか?
これは分かってますが、
>間違っても日付と時刻が隣同士にはならないぞ。
え?これがなぜだかサッパリ分かりません。
少なくとも隣り合うと思うのですが。
>>426でも
(0,-14)(0,-13)
と位置を指定したのですから、-14の次の数字は-13ですから、
少なくとも隣り合うと思っていたのですが。。。
一応本は読みました。

私のコードのどこがいけないのか、
もう少しご指摘願えないでしょうか。

429 :424:2009/03/26(木) 09:59:37
>>425
有難うございます。しかしそれではなかったです。

430 :デフォルトの名無しさん:2009/03/26(木) 10:00:21
offsetで - の値を使うときは用心すべし。
どうしても使うならば、

if activecell.columns < 13 then
を挟むとかしてエラー回避しないと、何ともお粗末になってしまうよ。

431 :デフォルトの名無しさん:2009/03/26(木) 10:04:17
if activecell.columns < 13 then

if activecell.column < 13 then   に訂正。

>>429
ActiveCell.Offset(0, -13).Range("A1").Select
Selection.Value = Date
ActiveCell.Offset(0, -14).Range("A1").Select
Selection.Value = Time

activecell.column が100で開始したとき、
offset(0,-13) で、87 を "select" してるでしょ。
んで、次に offset(0,-14) を "select” してるから、73に書かれる。
select したら activecellの場所変わるでそ。

432 :424:2009/03/26(木) 10:14:10
>>430
>>431
431さんご親切に有難うございます。

>select したら activecellの場所変わるでそ。
そういうことか!!!と思いました。
ご指摘頂きやっと意味が分かりました。
>>431のご説明は、間違えたコードの下にメモとしてコーピーさせて頂きます。
勉強不足を感じました。
本当に有難うございました。


433 :デフォルトの名無しさん:2009/03/26(木) 12:39:51
Controls("CommandButton" & i)でもやはり動きません…
subかfunctionがないと言われます。

またMeなどつけてもオブジェクトがおかしいと言われます。

何か宣言しないといけないとかありますか?

434 :デフォルトの名無しさん:2009/03/26(木) 17:50:32
>>433
Controlsはフォーム上のコンポーネントにしか使えない。
ワークシートに貼り付けたボタンの場合はControlsじゃなくて
Worksheets("Sheet1").OLEObjects("CommandButton" & i).Object.Caption = "test"

435 :デフォルトの名無しさん:2009/03/26(木) 19:40:44
>>433
>>414ではコマンドボタンのオブジェクト名が bt1、bt2…だけど、実際のオブジェクト名は?

436 :デフォルトの名無しさん:2009/03/26(木) 19:47:13
エラーメッセージが「Sub または Function が定義されていません。」なら
>>434で正解の可能性が高い。
質問するときはエラーメッセージを1文字も間違えずにそのまま書くのが基本だよ。
たとえ意味が通じても、勝手に略しちゃだめ。悪い例→「subかfunctionがない」
それにメッセージをそのまま検索すればたいてい解決方法が見つかる。

437 :デフォルトの名無しさん:2009/03/27(金) 00:11:47
質問です。

ブックオープン時に、publicのstringに
セルを読み込んでいます。

最初のうちはうまい事その中身を使えるんですが、
ずっとブックを開いたままにしていると、
気が付いたら変数の中身が変わってるのか、
消えるのか分かりませんが、最初の状態ではなくなってしまいます。

変数に値を入れたものを
ずっと保持しておく事はできないんでしょうか?

438 :デフォルトの名無しさん:2009/03/27(金) 00:18:40
>>434>>436
ありがとうございます!
ご教授頂いた記述でうまくいきました。

>>435
携帯から書き込んでいて面倒だったので省きましたが、実際は普通にCommandButton1です。



439 :デフォルトの名無しさん:2009/03/27(金) 02:34:06
>>437
Option Explicitは書いてある?

440 :デフォルトの名無しさん:2009/03/27(金) 07:44:28
>>439
書いてないです。
それを書けば延々保持され続けるんでしょうか?

441 :デフォルトの名無しさん:2009/03/27(金) 09:00:01
モジュールレベル変数の値は
・任意に代入、初期化
・モジュール内編集
しない限りは保持される。

誤って気付かない内に初期化するコードを書いてる可能性が無いのに不意に初期化されてるなら、
「モジュール内編集」に因るものの可能性が高い。

「モジュール内編集」とは、モジュールレベルの宣言部(Public xxx As Stringとか書いてるところ)
を書き替えるとか、新しいプロシージャを作成・削除するとか(既存のプロシージャ内の編集は非該当)
デザインモードを使用するとかね。

「モジュール内編集」を行ったらモジュールレベル変数が初期化されるのは当然のことでそれはどうしようも無い。

442 :デフォルトの名無しさん:2009/03/27(金) 12:41:21
まぁ、それ以外にも初期化されることがあるんだけどな

443 :デフォルトの名無しさん:2009/03/27(金) 13:16:52
例えば?

444 :デフォルトの名無しさん:2009/03/27(金) 13:52:32
[VBA] Public 宣言された変数の有効期間
http://support.microsoft.com/kb/408871/ja

445 :デフォルトの名無しさん:2009/03/27(金) 13:56:29
あー、そのページで、「モジュール内編集」以外が何なのか明記しておいた方がいいか。
・プロジェクトの構造の変更
・コンパイルエラーの発生
・コントロールを削除して [元に戻す] を実行する

ちなみに、そのほかにも初期化されることが経験上あった。

いずれにせよ「何もしてないつもりでも、変数が初期化されることはありうる」という前提で
プログラミングすべきで、意図しない初期化が困る場合は、シートに値を保存するなどを
しておく必要がある。

446 :デフォルトの名無しさん:2009/03/27(金) 13:58:27
あー、さらに追加。
「そのほかにも」の内容は、「なにもしてないつもり」だったので、何なのかは具体的にはわからない。

447 :デフォルトの名無しさん:2009/03/27(金) 15:29:13
へー

448 :デフォルトの名無しさん:2009/03/27(金) 22:23:21
>>437
static

449 :デフォルトの名無しさん:2009/03/27(金) 23:01:14
staticでも無力ですがな

450 :デフォルトの名無しさん:2009/03/27(金) 23:38:26
モジュールレベルの変数が初期化されるとき
つまりモジュールが初期化されるときは
モジュールレベルのプロシージャも初期化され
プロシージャレベルで保持されるStatic変数も
プロシージャの初期化に伴い当然初期化される

451 :デフォルトの名無しさん:2009/03/28(土) 00:23:02
ななめ読みしてレスで悪いんだけど、非表示シートに書き込んでおけば?

452 :デフォルトの名無しさん:2009/03/28(土) 02:06:03
すいません。
もし選択したセルがA1であれば、B1の値を7にする。
というのは何とかできました。

If ActiveCell = Range("A1") Then
Range("B1").Value = 7
End If

これと似たように
もし選択したセルがA1からA10のいずれかであれば、B1の値を7にする。
というのが出来ず困っています。一応下記のようにしましたが

If ActiveCell = Range("A1:A10") Then
Range("B1").Value = 7
End If

どうしても出来ません。

もし出来なければ、
「選択したセルがA列のいずれかであればB1の値を7にする。」

ということでも良いのですが。

識者の方お力をかしていただけないでしょうか。
宜しくお願い致します。
なおexcel:ver2000
OS:win2000になります。

宜しくお願い致します。

453 :デフォルトの名無しさん:2009/03/28(土) 02:34:27
If ActiveCell.Column = "1" Then

454 :デフォルトの名無しさん:2009/03/28(土) 02:45:24
>>453
有難うございます!
今日はもう遅いので、明日試させていただき、
追って報告します。


455 :452:2009/03/28(土) 02:53:18
すいません。列のいずれか、というのを教えていただき本当に助かります。
感謝してます。

しかし出来れば、

「もし選択したセルがA1からA10のいずれかであれば、B1の値を7にする。」
というケースも分かれば嬉しいなと思います。、
どなたか教えていただければ助かります。


456 :デフォルトの名無しさん:2009/03/28(土) 03:16:16
If Not Intersect(ActiveCell, Range("A1:A10")) Is Nothing Then
 Range("B7").Value = 7
End If

457 :デフォルトの名無しさん:2009/03/28(土) 13:00:11
ここは質問スレだがおまえの宿題手伝いスレじゃねーぞ
んなクソ簡単な命令くらい自分で調べて作れアホ

458 :452:2009/03/28(土) 13:39:05
>>453
有難うございます!出来ました!助かりました。
>>456
有難うございます!
出来ました。

お二人に助けていただき、エラーを防ぐプログラムが出来るようになりました。
本当に感謝します。

>>457
勘違いしてます。私は既に自分で調べて、試行錯誤して、
それでも分からなかったのでここで聞いてます。

>んなクソ簡単な命令くらい自分で調べて作れアホ
クソ簡単って。。。
自分まだVBA初めて10日ぐらいなんですよ。
あなたにとってはそんな簡単なこと、でも私にとっては
チンプンカンプンで難しいことが一杯あるんですよ。
でもなんとか自分で試行錯誤してるうちに、
これでも最初に比べれば飛躍的に自分で対処できるようになったんですよ。

459 :デフォルトの名無しさん:2009/03/28(土) 13:54:26
>>458
> 自分まだVBA初めて10日ぐらいなんですよ。

>>361
> VBA;多少使えます。
> VBA;多少使えます。
> VBA;多少使えます。
ふ〜ん

460 :デフォルトの名無しさん:2009/03/28(土) 13:57:14
>>1
> ★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み
>    コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。
>    ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。
お前のやってることはまるで教えてクンだ

461 :デフォルトの名無しさん:2009/03/28(土) 16:10:19
まあ俺の顔に免じてゆるしてやれよ

462 :デフォルトの名無しさん:2009/03/28(土) 17:33:27
>>457
心のちーせーやろーだなぁw


463 :デフォルトの名無しさん:2009/03/28(土) 18:34:21
亀レスだけど・・・。

>>437
シートに保持させるのが嫌なら、レジストリに放り込んでおくとか、
CGIでインターネットに変数保管しておくのはどう?

464 :デフォルトの名無しさん:2009/03/28(土) 20:22:59
>>463
>CGIでインターネットに変数保管しておくのはどう?

ネットにつながらない環境の時とか接続に失敗したらどうするのさ

465 :デフォルトの名無しさん:2009/03/28(土) 20:41:40
それが問題になるなら、それを選択しなければ良いだけじゃね?

466 :デフォルトの名無しさん:2009/03/28(土) 22:32:23
bookopenのイベントでレジストリキー書き換えが強固だな。


467 :デフォルトの名無しさん:2009/03/28(土) 23:08:18
437です。

レジストリに値をってのはやり方は全くわかりませんが、
その動作や処理自体特に問題のないものなんでしょうか?


468 :デフォルトの名無しさん:2009/03/28(土) 23:20:46
WSHでレジストリに変更加える訳でも無ければ、
ExcelVBAから触れるレジストリ領域は一か所だけだね。
VBAで触れる部分をどんだけ滅茶苦茶にしても問題は無いと思うけど。

個人的には、レジストリやINIの肥大化が嫌いなんで、
きちんと管理出来ないなら使わない方が良いかも。と思うよ。
レジストリエディタでVBAを介さずに値の削除、書き込みが出来ない内はお勧めしないよ。

今回の状況だと、素直にワークシートに値を書き込んでおくのが良いんじゃないかな。

469 :デフォルトの名無しさん:2009/03/28(土) 23:21:36
ExcelVBAのビルドイン関数って意味ね。

470 :デフォルトの名無しさん:2009/03/29(日) 01:02:17
>>468
ありがとうございます。
もう少し色々調べたいと思います。


471 :デフォルトの名無しさん:2009/03/29(日) 14:14:12
初歩的な質問ですみません。マクロの記録で操作記録されないようでお手上げです。

OS ビスタ
Excel2007使用です。

スピンボタンの設定で

LINKEDCELL = TARGET.ADDRESS

という部分をその左隣のセル指定に変更したく色々やりました。

稚拙な質問ですみません。よろしくお願いします。

472 :デフォルトの名無しさん:2009/03/30(月) 09:55:25

特定のフォルダに「品番」.jpg
A1〜A10に「品番」の羅列
B1〜B10に「品番」.jpgを自動的にセルのサイズに合わせて貼り付け(もし該当するファイルがなければunknown.jpg
A列の品番が変わると自動的に差し替え

現在は
A列にフルパスで参照したい画像のファイル名
挿入の数だけ下記のマクロ作ってやってます

Range("A2").Select
ActiveSheet.Pictures.Insert(Cells(1, 1)).Select

OSはXP エクセルは2003です
宜しくお願い致します

473 :デフォルトの名無しさん:2009/03/30(月) 17:44:24
丸投げ感たっぷりだなぁ

474 :デフォルトの名無しさん:2009/03/30(月) 19:33:18
すいません
最初考えた時はできなくて現在の妥協案になりまして
やっぱりもう一度やり直そうと考えたんですが、やっぱり挫折・・・
正直、丸投げしました

475 :デフォルトの名無しさん:2009/03/30(月) 19:59:32
>>472
ChangeイベントでTargetやTargetからの相対位置を対象とすれば良し

これで解らなければ、諦めるか、この程度は理解できるレベルまで自分で勉強しろ

476 :デフォルトの名無しさん:2009/03/30(月) 20:07:04
shell関数について質問です。

アプリケーションをwinword.exeを指定した時、
空白を含むパスのファイルが開けません。

C:\test 1\test.txtだと、
file:///test%201/test.txtと記述しないとうまくいきません。

セルからパスを読み込ませ開きたいのですが、
うまく開く方法はないでしょうか?

477 :デフォルトの名無しさん:2009/03/30(月) 20:13:47
>>476
"""C:\test 1\test.txt"""

セルに「C:\test 1\test.txt」と入っているなら
"""" & Range().Value & """"

478 :デフォルトの名無しさん:2009/03/30(月) 21:23:54
>>477
ありがとうございます。
今は外にいるのでまた明日試したいと思いますが、
ご教授頂いた記述はどういった意味になるんでしょうか?

479 :デフォルトの名無しさん:2009/03/30(月) 21:33:33
>>478
ここは初心者スレじゃない
基礎的な構文規則くらい自分で調べろ

480 :デフォルトの名無しさん:2009/03/30(月) 22:06:18
初心者スレなんてないんだから、初心者の質問でもいいだろ。
まぁ俺は答える気ゼロなんだがなw

481 :デフォルトの名無しさん:2009/03/30(月) 22:15:01
プログラム起動時のパラメータはスペースで分割される。
スペース入りのパスを渡す場合には、分割されないようダブルコーテーションで囲む必要がある。
ダブルコーテーションの中にダブルコーテーションを書く場合場、""と書く。

以上をあわせると、
"""abc def"""
"""" & range.value & """"
の意味がわかるはず。

482 :デフォルトの名無しさん:2009/03/30(月) 22:15:55
質問スレだろ?
変な研究とかの丸投げじゃなきゃ質問に答えてやれよ
どーせ分からないだけだろ

483 :デフォルトの名無しさん:2009/03/30(月) 22:22:22
>>482
偉そうなこと言ってる暇があるならお前が教えてやればいい
それとも質問者本人が煽ってるだけなのかな?

484 :デフォルトの名無しさん:2009/03/30(月) 22:22:58
これわからない奴なんてほとんどいないだろw

485 :デフォルトの名無しさん:2009/03/30(月) 22:26:30
>>483
そんなくだらん煽りなんかしないで、お前が答えてやれよ。

486 :デフォルトの名無しさん:2009/03/30(月) 22:27:15
丸投げでも良いじゃない。人間だもの。

487 :デフォルトの名無しさん:2009/03/30(月) 22:41:46
いや、俺にはわからん。
A2なのに(1, 1)になる理由とか、、、
>>484はわかるのか。すごいなあ。

488 :デフォルトの名無しさん:2009/03/30(月) 22:49:44
>>481
ご親切にありがとうございます。

489 :デフォルトの名無しさん:2009/03/30(月) 22:50:44
>>487
わかんねーなら黙っとけ糞が

490 :デフォルトの名無しさん:2009/03/30(月) 22:53:50
ExcelVBA覚えるのにおススメの本ありませんか?

当方のレベルは、超簡単なシェルスクリプトぐらいなら作りますが
VBAの文法とか構造がさっぱりわからなくて初学者向けから勉強したいと思ってます。

491 :デフォルトの名無しさん:2009/03/30(月) 22:59:25
Excel VBAのプログラミングのツボとコツがゼッタイにわかる本―最初からそう教えてくれればいいのに!

492 :デフォルトの名無しさん:2009/03/30(月) 23:05:29
本屋に行って手に取ってみるぐらいの労力惜しむなよ…

493 :デフォルトの名無しさん:2009/03/30(月) 23:11:58
>>492
書評ってなんで必要だと思う?

494 :デフォルトの名無しさん:2009/03/30(月) 23:13:09
大村あつしの入門書っぽいの選んどけ

495 :デフォルトの名無しさん:2009/03/30(月) 23:22:34
うちのばあちゃんが、人の悪口ってのはコンプレックスの裏返しだって言ってた。
つまり>>489自己紹介乙

496 :デフォルトの名無しさん:2009/03/30(月) 23:24:28
>>493
(1) 書評欄を埋めるため
(2) 評論家がゼニをふんだくるため

497 :490:2009/03/30(月) 23:46:29
ありがとうございます
>>491
よさそうですね。見てみます。エロゲみたいなタイトルですが

>>492
>>494
実はすでに大村あつしの入門書を見たんですが最初は簡単だったのにいきなりむずかしくなって
自分には合わないなって思いました。
ほかたくさんあったんですがイマイチピンとこずここで聞きました。

498 :デフォルトの名無しさん:2009/03/30(月) 23:52:18
>>493
書評は別に必要ではないだろ

499 :デフォルトの名無しさん:2009/03/30(月) 23:56:12
できる大辞典 Excel VBA
がオススメ

大村あつしは知識はあるが根本的にバカなので
こいつの書いた本は素人にはオススメしない
バカな内容に引きずられないだけの基礎スキルを持っていて
知識だけ上乗せしたい中級者以降なら構わないが

500 :472:2009/03/31(火) 00:04:55
ヒントありがとうございます。助かります。

別のイベントで指定すれば良いんですね。やってみます。


501 :デフォルトの名無しさん:2009/03/31(火) 00:57:31
(^p^)あうあうあー

502 :デフォルトの名無しさん:2009/03/31(火) 01:13:54
>>475
changeイベントなんて1文字打ち込むごとに…

503 :デフォルトの名無しさん:2009/03/31(火) 01:22:15
…は発生しない
確定された時にのみ発生する

あとは変更確定されたセルが、目的のセル範囲かで条件分岐して処理すれば良いだけ

504 :デフォルトの名無しさん:2009/03/31(火) 08:02:57
1文字打ち込むごとにchangeイベントが発生するのはComboBoxやTextBoxなどだな

505 :デフォルトの名無しさん:2009/03/31(火) 08:04:59
>>499
著者は誰?


506 :デフォルトの名無しさん:2009/03/31(火) 15:10:37
Excel-VBAでXMLデータを引っ張ってるのですが
--------------------------------------------------------------
NGパターン
Set xmlHttp = CreateObject("MSXML2.XMLHTTP.4.0")
xmlHttp.Open "POST", "https://192.168.1.1:8080/xml/", False
xmlHttp.Send xmlData
--------------------------------------------------------------
--------------------------------------------------------------
OKパターン
Set xmlHttp = CreateObject("MSXML2.XMLHTTP.4.0")
xmlHttp.Open "GET", "https://192.168.1.1:8080/xml/", False
xmlHttp.Send xmlData
-証明書確認画面が出る。(主導ではいを選択)-
Set xmlHttp = CreateObject("MSXML2.XMLHTTP.4.0")
xmlHttp.Open "POST", "https://192.168.1.1:8080/xml/", False
xmlHttp.Send xmlData
--------------------------------------------------------------
POSTでリクエストを出すとエラーが返ります。
GETでサーバ証明書を取得後にPOSTを続けるとエラーが出ないので、証明書関連だと
おもってるのですが、オレオレ証明書でも無視して続行する方法を
教えて頂けないでしょうか。

507 :デフォルトの名無しさん:2009/04/01(水) 01:57:32
>>506
ぐぐれ

508 :デフォルトの名無しさん:2009/04/01(水) 15:26:40
XPのExcel2007です。

次の流れのプログラムを作成しました。
1.テキストファイルを読み込み
2.不要データの削除
3.作表(列の追加など)
4.罫線・セルの色付け

プログラム自体は稼働し、結果も希望通りのものができました。

しかし、一度実行した後にもう一度実行すると、初回時に比べて処理時間がかかります。
マクロの最初と最後に、画面更新の停止と解除(screenupdating)も追加してみたのですが、改善にいたりませんでした。
一度ファイルを終了し、再度開きなおした場合の初回はやはり処理は早いです。

そういった現象を回避できる手掛かりを探しています。
ご助言をいただけましたら幸いです。


509 :デフォルトの名無しさん:2009/04/01(水) 15:28:50
再実行の前に、初回の実行したときのデータをすべて削除してるか?


510 :デフォルトの名無しさん:2009/04/01(水) 15:37:54
>>509
ありがとうございます。

データの削除は最初に行っています。
(Cells.Delete Shift:=xlUp)

使用しているシートは2つ。(2つとも削除しています)
1.テキストファイルを読み込むシートと読み込んだ後に、
2.別シートにすべてコピーしてから、不要データの削除や罫線処理を行っています。

何度か確認したところ、別シートにコピーしてからの処理が重くなるようです。

511 :デフォルトの名無しさん:2009/04/01(水) 16:34:06
>>507
証明書を入れて回避する方法は探せたけど
認証を無視する方法がみつからない。(回避じゃダメなので)
ぐぐって見つかるサイトがあるならURLを教えてください。

512 :デフォルトの名無しさん:2009/04/01(水) 16:36:58
>>510
とりあえずブックうp
外部に出せないデータとかは、適当な文字列と置き換えていいから

513 :デフォルトの名無しさん:2009/04/01(水) 17:08:14
>>508,510です。
ファイルあげてみました。よろしくお願いします。
ttp://uproda.2ch-library.com/lib116394.xls.shtml
DLパスは変更なしです。

外に出せないコードは削除してあります。
しかし一回目早く、2回目以降が遅いという現象はおきます。
何分手探りでVBAやっているため、コードが見づらいと思います。
(基本マクロ記録からいじくっているのが多いです)
よろしくご教授ください。

514 :デフォルトの名無しさん:2009/04/01(水) 17:11:57
>>513 ですが、一回削除してからうpしなおしました。

ttp://uproda.2ch-library.com/lib116395.xls.shtml
パス変更なしです。
お願いします。

515 :デフォルトの名無しさん:2009/04/01(水) 17:20:32
>>513-514です。
たびたび本当に申し訳ありません。
うまくあがってなかたったので、再度あげました。
ttp://uproda.2ch-library.com/lib116397.xls.shtml
お願いします。

516 :デフォルトの名無しさん:2009/04/01(水) 17:29:06
事務所名でてるから早く消せ

517 :デフォルトの名無しさん:2009/04/01(水) 17:32:07
>>516
最後にあげたのは全部消したはずなので、大丈夫だと思います。

518 :デフォルトの名無しさん:2009/04/01(水) 17:45:18
>>517
マクロの中に

519 :デフォルトの名無しさん:2009/04/01(水) 18:06:53
ありがとうございます。
先程削除しました。
今後はあげるのやめときます。
お騒がせしてすいませんでした。

520 :デフォルトの名無しさん:2009/04/01(水) 18:55:05
諦めるって事か
お疲れさまでした

521 :デフォルトの名無しさん:2009/04/01(水) 19:33:11
>>510
>データの削除は最初に行っています。
これは、マクロの中でやってるのか?
再実行する前に手で全部削除(コピー残すんじゃなくて)して再実行してみてどうだ

考えられる可能性は、コピーを残すことによりデータ量が増えて遅くなってるとか
空シートのクリアは早いがデータの多いシートのクリアは遅いとか

まあ、まずマクロのどこ(どの命令)が遅いか確認したら?

522 :非508:2009/04/01(水) 20:12:53
落としたやつを動かしてみたが、枠線とか背景色とかをいじってる所が遅くなるようだ。
セルでなくシートを削除して、新しいシートで実行すると速度が変わらないので、Excelの仕様の問題かと。
シートの中に何か覚えている部分があるんだろう。

523 :デフォルトの名無しさん:2009/04/02(木) 00:40:12
>>521、522
ありがとうございました。

その後、メモリの消去の命令とかいろいろ追加してみましたが、やっぱり駄目でした。
仕様ということであきらめてみます。
お見苦しいところを、多々お見せして、申しわけありませんでした。


524 :デフォルトの名無しさん:2009/04/02(木) 01:45:51
>>523
upし続けてくれる?
直ぐ消すと
見てくれる人も見てくれないよ

525 :デフォルトの名無しさん:2009/04/02(木) 20:01:17
開放する命令を出さないとダメだぞ。

526 :デフォルトの名無しさん:2009/04/03(金) 00:36:17
open ?

527 :デフォルトの名無しさん:2009/04/03(金) 01:45:48
初心者なんですが質問をさせてください。
ワークシートのセルに関数を入れて

 4(=index(〜)とかで4になったもの)
n = ↑のセル
range("a1")=n

とかにするとa1には=index(〜)がそのままはいってしまって。
値(この場合4)にしたいんだがどうすればいいか教えてください。説明が下手で申し訳ありません。

528 :デフォルトの名無しさん:2009/04/03(金) 01:59:19
自己解決しました。
マクロの記録でコピペして値のみでできました。
もし他にも方法があったら教えてください。

529 :デフォルトの名無しさん:2009/04/03(金) 02:06:10
ここって日本の掲示板だよな?
あまりにも日本語の質問が少ないんで
何処か日本以外の国の掲示板に迷い込んだのかと錯覚する…

530 :デフォルトの名無しさん:2009/04/03(金) 04:30:14
自然言語がちょっと乱れた程度で外国語と間違えそうになるなんてすごいです。
尊敬します。先生と呼ばせてください。

ところで先生は文末に約物だけを付けるのは正しい日本語とみなす派なんですね。

531 :デフォルトの名無しさん:2009/04/03(金) 04:34:51
どうしたの?

532 :デフォルトの名無しさん:2009/04/03(金) 07:05:43
自分で不自由て自覚あるみたいだから好きに呼ばせておけばいいよ

533 :デフォルトの名無しさん:2009/04/03(金) 19:57:19
4(=index(〜)とかで4になったもの)

もうね。メタ文字が入ってると、どんなパターンなのか考えてしまってダメだわ。


534 :デフォルトの名無しさん:2009/04/04(土) 01:52:17
日本語でOK

535 :デフォルトの名無しさん:2009/04/04(土) 15:28:15
>>527-528
だいたい俺んとこじゃそういうふうにならないんだが。
仮にC1に=INDEX(D:D,4)となってて
n=Range("C1")
Range("A1")=n
と.Valueを省略して書いてもA1には値が入るぞ?

536 :デフォルトの名無しさん:2009/04/04(土) 16:16:24
かつてoffice2003で作ったxlsファイルでVBAを組んだのですが
それをoffice2007のxlsxで開こうとするとエラーになってしまいます。
もちろん保存するときにxlsで保存すれば開けるのですが。

xlsで作ったVBAはあくまでもxlsファイルでしか開けなく
互換性はないのでしょうか?

537 :デフォルトの名無しさん:2009/04/04(土) 16:55:47
>>536
マクロ付きの場合、xlsxではなくxlsmになる。
名前を付けて保存のダイアログのファイルの種類のところから、それ選べ。

538 :デフォルトの名無しさん:2009/04/05(日) 09:46:08
ボタンが一個置いてあり、その下に、数字がはいった二つのセル(仮にセルA、セルBとする)がある。
で、ボタンを押すと、別シートの表の中からセルAと一致
するセルをもつ行のうち最初にみつかったセルの1マス右側のセルにセルBの内容を書き込む・・・

というようなことをVBAでやりたいのですが、
単純化したサンプルでいいんでどういうコードになるか教えていただけませんか

539 :デフォルトの名無しさん:2009/04/05(日) 10:28:13
オートシェイプにMouseMoveとかのイベントはありませんか?

オートシェイプ上にカーソルが移動すると
オートシェイプに合わせたデータを表示する
というのプログラムを組みたいのですが

540 :デフォルトの名無しさん:2009/04/05(日) 10:32:32
>>538
With Sheet2
.Range(.Cells(1, 1), .Cells(10, 1)).Find(what:=Sheet1.Cells(1, 1)).Offset(0, 1) = Sheet1.Cells(2, 1)
End With

Sheet2が別シート、Sheet1がボタンがあるシートな。


541 :デフォルトの名無しさん:2009/04/05(日) 11:04:03
>>540

ありがとうございました。
ちなみにセルAとセルBじゃなくて、
列Aと列Bだったとして、
列Aの内容と一致するデータを別シートから検索し、右隣のセルに列Bの
内容を書き込む、みたいな場合はどうなるんでしょうか

542 :デフォルトの名無しさん:2009/04/05(日) 11:11:31
丸投げよくない

543 :デフォルトの名無しさん:2009/04/05(日) 11:48:36
>>539
シェイプ系には無い
ActiveXオブジェクトには有る

矩形で良いならコントロールツールのイメージオブジェクト使うのが手っ取り早い
凝った形が良いならActiveXオブジェクト作って取り込めば良い

544 :デフォルトの名無しさん:2009/04/05(日) 12:38:49
>>539
無い。けど、マウス座標からObject位置判定を自前でやれば同じことはできる

できたとしても、定義済みシェイプを使う方法が面倒だと思う
シェイプと情報をうまく自動リンクさせる手法の方が難しいと思われ

545 :デフォルトの名無しさん:2009/04/05(日) 13:58:18
デフォルトプロパティって書くべきなんだよな?

546 :デフォルトの名無しさん:2009/04/05(日) 13:59:21
関数だと必ず()にして表記したほうがわかりやすいよな
仕事としての意味で

547 :デフォルトの名無しさん:2009/04/05(日) 14:25:50
>>451
非表示シートって表示できるの?
矛盾した質問で申し訳ない

548 :デフォルトの名無しさん:2009/04/05(日) 15:16:03
セルの値を二元配列に組み込みたいのですが、
簡単にする方法はありますか?
data(0, 0) = A1.value
data(0, 1) = A2.value
data(1, 0) = B1.value
data(1, 1) = B2.value
data(1, 2) = B3.value
のように一度に格納したいのです

549 :デフォルトの名無しさん:2009/04/05(日) 15:21:55
>>547
出来ない理由でも?

550 :デフォルトの名無しさん:2009/04/05(日) 16:05:28
>>548

Dim ary As Variant

ary = Range(Cells(1, 1), Cells(3, 3)).Value

これで配列に入る。
添え字は1始まり。

551 :デフォルトの名無しさん:2009/04/05(日) 16:11:28
>>550
ありがとうございます

552 :デフォルトの名無しさん:2009/04/05(日) 17:01:28
>>549
拾ってきたソースで非表示シートに値を入れてるのがあって
それを目で追うために見えるようにしたかったんだよ

553 :デフォルトの名無しさん:2009/04/05(日) 17:11:41
表示できない場合、うっかり非表示にしちゃったときどうするんだ

554 :デフォルトの名無しさん:2009/04/05(日) 17:16:02
>>545
保守的には書いたほうが良い。書くべき。
けど、VB6に限れば書かない方が速度が速い。もしかしたらVBAも・・・?
まあ、所詮Excelなんで筋違いか。2008は知らん。

555 :デフォルトの名無しさん:2009/04/05(日) 17:26:50
どこぞのサイトに書く場合と書かない場合の計測結果があったな

556 :デフォルトの名無しさん:2009/04/05(日) 18:06:51
書いた方がわずかに早いけど、そこまでスピードにこだわる処理にVBAは向いてない気が

557 :デフォルトの名無しさん:2009/04/05(日) 19:43:34
質問です。
Variantに複数のRangeを代入した際の動きって
どこかにドキュメントとかありますか?
いまいちアレが配列になる理由がわからない。

558 :デフォルトの名無しさん:2009/04/05(日) 19:57:49
>>557
どゆこと?

559 :デフォルトの名無しさん:2009/04/05(日) 20:06:05
それは代入以前の問題だろ

君は複数範囲のRangeオブジェクトのValueプロパティが、配列を返すってことを理解してないだけじゃん。
変数は単にValueプロパティが返した値をそのまま保持しているだけで、Variant型変数に代入したときに
何か変換とかが行われてるわけじゃないし。

560 :デフォルトの名無しさん:2009/04/05(日) 20:09:38
>>557
variantでメモリを確保します
最低16バイトです
そこに配列の値を入れていきます。増えたらVariantが確保してるメモリ量も増大します
終わり

多分可変長ってところでひっかかてるんじゃないかな

561 :デフォルトの名無しさん:2009/04/05(日) 20:51:12
>>558,560
複数のRangeといったのは、下記のような代入です。
Dim var as Variant
var = [A1:B3]

なんでvarに配列が入るのか不思議だったので聞きました。
(普通に先頭要素の値が文字列として入ると思っていたから)

>>559
うーん、そういうExcelのCOMの作り方であって、
別にVBA的な何かというわけではないのですね。

デフォルトプロパティの動作についてドキュメントないのかな。
CVarでも動作同じなのかな。

562 :デフォルトの名無しさん:2009/04/05(日) 20:53:46
つまり勘違いしてただけか

563 :デフォルトの名無しさん:2009/04/05(日) 21:32:03
Range型に不用意にVariantを使用しない。後で意味が分からなくなる。
デフォルト云々の前に、Variantは不定形型ということを理解すべき。

564 :デフォルトの名無しさん:2009/04/05(日) 21:38:54
range == stringの認識も改めたほうがよさそだね

565 :デフォルトの名無しさん:2009/04/05(日) 22:45:48
>>563
なにいってんの?ばか?

566 :デフォルトの名無しさん:2009/04/05(日) 22:46:10
>>564
を見てふと思ったんだけど、
やっぱり比較演算子と代入演算子が同じってのは分かりにくいよね。

>>563
ユーザー定義関数なんかで、セル指定or文字 を引数で使うみたいに、
明確にvariantじゃなきゃ条件分岐がしっかり出来ないって用途は限定されるしね。
まぁ、そんな目的だとしてもTypenameあたりでしっかりと何型が入ったかを判定させるべきだと思う。
入れっぱなし、とりあえず問題なく動くからOK。って作り方はわしゃ好まん。

567 :デフォルトの名無しさん:2009/04/05(日) 23:10:16
VBAでカレーライスって作れますか?

568 :デフォルトの名無しさん:2009/04/05(日) 23:12:10
>>567
外部マイコンをVBAで制御すればできる
もちろん、マイコンでカレーライスが作れるように設定しておいてくれ

569 :デフォルトの名無しさん:2009/04/06(月) 00:27:07
だがそれは、はたしてVBAで作ったことになるのだろうか?

570 :デフォルトの名無しさん:2009/04/06(月) 00:41:36
『パソコンはC言語で動いてる』の考え方次第じゃない?
目に見える結果にプログラミング言語は限定されないと思う
しいて言うなら、カレーライス製造装置の制御ソフトの大半がVBAなら、VBAで出来てるといえるのでは?
最悪、かーちゃんにメールするだけでも成立しそうだが

激しくスレチ乙

571 :デフォルトの名無しさん:2009/04/06(月) 00:44:00
なるよ

572 :デフォルトの名無しさん:2009/04/06(月) 01:05:33
「パソコンで年賀状作った」
「それはプリンタに作らせただけだろう」
みたいな話か

573 :デフォルトの名無しさん:2009/04/06(月) 06:53:16
最後にちょっと国内で加工すれば国産になるのと同じ道理ですな

574 :デフォルトの名無しさん:2009/04/06(月) 21:04:10
>>563は何か勘違いしてるの?
セルの値の配列をいっぺんに入れるならVariant型しかないじゃん。


575 :デフォルトの名無しさん:2009/04/06(月) 21:38:27
Range.Value()の代入先がVariant()型に限るってのもVBAの妙な仕様の一つだよな。
別にDouble()やString()を許容してくれてもよさそうに思えるのに。

576 :デフォルトの名無しさん:2009/04/06(月) 22:02:15
プロパティの定義が
Value As Variant
なんだから、妙でもなんでもなく当然だろ?

というか、配列じゃないときに変換関数も通さず別型の変数に代入できてしまう方が妙だ。
自動型変換なんてのは行われないのが普通だからね。

VB6以前やVBAにどっぷりハマっていると、自動型変換されるのが当然で、プロパティの戻り値を
プロパティの型とは別型の変数に代入できないという当たり前のことが不自然に感じてしまうものなのか?

577 :デフォルトの名無しさん:2009/04/06(月) 22:22:28
ならばセルに数値が入ってる時TypeName(Range("A1").Value)ってやると
Doubleが返ってくるのをやめてほしい。
Range("A1").ValueTypeみたいなデータ型を調べるプロパティを用意すべき。

578 :デフォルトの名無しさん:2009/04/06(月) 22:39:47
>>577
オブジェクト指向を一から勉強し直せ

579 :デフォルトの名無しさん:2009/04/06(月) 22:40:13
>>577
それはTypeNameが内部型を返すという仕様通りの結果だろ?
結局全てに置いて理解が浅いだけの話じゃん。
そして問題点を指摘しているのではなく、「俺の妄想通りに動かない」とブー垂れてるだけ。
ホント、どうしようもないな。

580 :デフォルトの名無しさん:2009/04/06(月) 22:53:11
じゃあ問題なのは一部の演算子で自動的に型変換が行われてしまうってこと?
VBAだと暗黙の型変換を禁止する方法ってないよね?

581 :デフォルトの名無しさん:2009/04/06(月) 22:55:04
>>580
何いってんの?馬鹿なの?

582 :デフォルトの名無しさん:2009/04/06(月) 23:11:21
>>580
それ、結構重要だと思うわ
最近のスクリプト言語でも思う
勝手に型変換して書いたソースをなんとか動く形に解釈してしまうのは
俺もダメだわ

583 :デフォルトの名無しさん:2009/04/06(月) 23:20:39
単純な変数への代入だと勝手に型変換してくれるのに
配列への代入だと型変換してくれない。
なんで統一してくれないの?

584 :デフォルトの名無しさん:2009/04/06(月) 23:22:08
VBAは中途半端に型があるからなぁ
VBSみたいに、もう型なんてバリアント以外禁止!にすればよかったんだよ

実行環境が勝手に型変換するのは、勝手に型変換するコードを書くからなんだがな
それは問題なんじゃなくて、そういう言語だと理解して使うしかない


585 :デフォルトの名無しさん:2009/04/06(月) 23:25:23
>>577
それって意味あるの?
ValueTypeプロパティがあったとして、
VarType/TypeNameが廃止なら、現状のVarType/TypeNameと何も変わりない。
見た目が変わるだけ。

一方、VarType/TypeNameが存在するとしたら、そっちは何をするんだ?
例えば、Variantであるという戻り値なら、そんなものソースコードを見れば自明だ。
ほかの方法は思いつかない。まさかValueTypeと同じとは言わないだろうし。

586 :デフォルトの名無しさん:2009/04/06(月) 23:30:16
「variantの使い方は気をつけよう」でおk?

初心者はよく勉強すること
熟練者は的確なスレをすること
反論だけのキチガイはスルーすること

587 :デフォルトの名無しさん:2009/04/06(月) 23:33:36
スレをする?

588 :デフォルトの名無しさん:2009/04/06(月) 23:40:27
Variantはまだいい方。
一番わかりにくいのはRangeオブジェクトだと思う。
よく使われることを想定したためか、かなりの省略が許容されているおかげで誤解も多い。

589 :デフォルトの名無しさん:2009/04/06(月) 23:46:17
別に解りにくいなんて思ったことは無いけどな
理解度が低かった初心者の頃以外は

590 :デフォルトの名無しさん:2009/04/06(月) 23:59:16
EntireRowとかのRow自体のRangeとか、
結合セル時のOffsetとか、Find・FindNextとかはわかりづらいと思った。

591 :デフォルトの名無しさん:2009/04/07(火) 00:10:04
理論的な思考が出来る人なら問題にはならないけどね
結局は個人の問題

592 :デフォルトの名無しさん:2009/04/07(火) 00:15:09
んなアホな

593 :デフォルトの名無しさん:2009/04/07(火) 00:24:04
まあ出来ないうちはそう思うのは仕方ない
解ってみれば単純な物だが

594 :デフォルトの名無しさん:2009/04/07(火) 00:26:06
うゎ、こいつうぜ

595 :デフォルトの名無しさん:2009/04/07(火) 00:31:57
ここはヒトの理解というものについて考察するスレじゃないというのは、
論 理 的な思考が出来る人なら問題にはならないけどね。

596 :デフォルトの名無しさん:2009/04/07(火) 00:36:17
悔しかったの?

597 :デフォルトの名無しさん:2009/04/07(火) 00:39:06
Cellsの使い方がおかしい奴は多いねぇ。
Set r = Range("a1:b5")
r.Cells(2,1).hogehoge
なんてやつ見るとアフォかと。

598 :デフォルトの名無しさん:2009/04/07(火) 00:40:46
なにやってんのそれ?w

599 :デフォルトの名無しさん:2009/04/07(火) 00:49:29
やってることはどうでもRange("a1:b5") がセルの集合だからCellsを使うのはおかしいってこと。

600 :デフォルトの名無しさん:2009/04/07(火) 00:58:52
>>599
ただの相対参照じゃねーの?

601 :デフォルトの名無しさん:2009/04/07(火) 01:07:32
>>597
複数セルに対するCellsで第二引数まで指定するのは確かにおかしいが
やってる奴は滅多に見ないぞ

複数セルに対するCellsで第一引数のみの指定や
単一セルに対するCellsで第二引数まで指定するのならよく見るが、これらはちゃんと意味有るし

前者は範囲内、若しくは範囲の延長上で右下方向に何番目のセルという指定で
Range("A1:E5").Cells(12)なら、A1:E5の5行5列範囲で右下方向12番目ということで
1  2  3  4  5
6  7  8  9  10
11 12
のような感じで3行2列目のB3を返す

後者はOffsetの初期インデックス違いのようなもので、Offsetが0始まりなのに対して、Cellsが1始まり
Debug.Print Range("A1").Cells(3, 3).Address(0, 0)
Debug.Print Range("A1").Offset(2, 2).Address(0, 0)

因みに前者のような使い方があるので、「(親が)セルの集合だからCellsを使うのはおかしい」って言い方は不適切だな

602 :デフォルトの名無しさん:2009/04/07(火) 01:35:18
問題は、RangeもCellsもRangeオブジェクトを返すのに、その明確な
使い分けができてないことだろ

603 :デフォルトの名無しさん:2009/04/07(火) 01:40:10
使ってればそのうち使い分けられるようになるさ。

604 :デフォルトの名無しさん:2009/04/07(火) 01:54:34
いや、たしかに自然と使い分けてるんだが、
問題としては、使い分けの方法ってか、指針を説明できないってことなんだ

今だから白状するが、俺は初心者の頃は、Cellsは単一セルそのものを返してると思ってた
まあ、だからRangeとCellsの使い分けはあんまり悩まなかったが、かといって
範囲が1×1のレンジ操作はCells使えってのも、なんかちょっと違う気がする

605 :デフォルトの名無しさん:2009/04/07(火) 09:06:00
>>597がおかしいのは
r.Cells(2,1).hogehoge じゃなくて
rItem(2,1).hogehogeとかr(2,1).hogehogeって書けって意味だよ。
r.Cells(2,1).hogehoge ってr.Cells.Item(2,1).hogehoge の意味だけどセルの集合にわざわざ再度Cellsを使うのは無駄ってもんだ。
例えばCells(2,1)もCells.Cells.Cells(2,1)も同じセルををさすが、動けばいいってもんじゃねーからな。
EntireRowとかのセルの集合じゃないものにCellsを使うのは意味があるが>>597ではCellsは無意味だね


606 :デフォルトの名無しさん:2009/04/07(火) 09:19:44
r.Cells(2,1).hogehogeがr.Cells.[_Default](2,1).hogehogeの意味だって突っ込みは無しよ。

607 :デフォルトの名無しさん:2009/04/07(火) 11:41:21
>>605
デフォルトプロパティを省略するなって議論が上の方にあったな
だが実際問題、Cells.Item(2,1)なんて書かないなぁ
デフォルトプロパティがインデクサとして作用するなら普通みんな書かないんじゃない

まあ、そのせいで、Cells(2,1)はプロパティ取得じゃなくて、
Cellsというメソッドを2と1という引数で呼び出してると勘違いしてる時期があった

VBAの入門書とか、そのへんちゃんと解説してるようなのはほとんどないと思う
ちゃんとしたコード読まないと、ちゃんとしたコードかけるようにならないってことだな

ただ、Range.RangeとかCells.Cellsとかは感覚的におかしいと思うんだが
Range.Cellsは感覚的におかしいと思わないんだよなぁ

608 :デフォルトの名無しさん:2009/04/07(火) 13:12:17
>>607
Excel95の頃はCellsはメソッドじゃなかった?
中身は実質変わってないのかな?

609 :デフォルトの名無しさん:2009/04/07(火) 15:27:47
ソース見てRangeがオブジェクトかプロパティかわからない俺参上
Range("A1") = "abc"
たとえばこれはオブジェクトでデフォルトプロパティのValueが省略、でいいの?

610 :デフォルトの名無しさん:2009/04/07(火) 15:52:48
Rangeはオブジェクトを返すプロパティだよ

611 :デフォルトの名無しさん:2009/04/07(火) 17:35:05
EXCEL2003です

セルの書式設定の[表示形式]定義が[文字列]かどうか
判断する方法を教えて下さい。
やりたい事は「日付を表すデータ」([表示形式]が[日付]とは限らない)が
元々どのように入力されているか判断したいのです。
具体的には、
文字列で「3/1」、「2009/3」「2009/3/1」と入力されて
いるのか、日付データで「2009/3」等と入力されているのかの
判断方法は、どうすれば良いかということです。

よろしくお願い致します。






612 :デフォルトの名無しさん:2009/04/07(火) 17:40:30
>>611
NumberFormatLocal

613 :デフォルトの名無しさん:2009/04/07(火) 22:14:32
文字列で"0.1"とか"1"をDoubleに変換したいです。
且つ、"abc"のようなものなら失敗して欲しいです。
CDbl()でよいと思うのですが、"abc"などを渡した場合どのように失敗を通知してくれるのでしょうか?
例外などですか?このときの例外の補足の仕方を教えていただけますか?
宜しくおねがいします


614 :デフォルトの名無しさん:2009/04/07(火) 23:24:36
On Error GoTo xxxx
でエラートラップ
Err.Numberでエラーの種類しらべてしかるべき処理

はっきりいってVBAのエラー処理はおまけみたいなもんだ
変換してエラーでる可能性があるとわかってるなら、
変換する前に変換元が数字かどうかぐらい自分でチェックするほうがいいと思うぞ


615 :デフォルトの名無しさん:2009/04/07(火) 23:34:04
>>614
それは他の言語とどこが違うの?

616 :デフォルトの名無しさん:2009/04/07(火) 23:41:15
>>614
ありがとうございます。m(_ _)m

アドバイス助かります。自分でエラーチェックすべきか、
オブジェクトの例外スローに期待すべきかも悩んでました。
とりあえず試してみます。
例外が送出され、それを捕らえて上手くメッセージが出せたらそれに越したことはないものですから。。



617 :デフォルトの名無しさん:2009/04/08(水) 03:42:55
>>615
エラー処理ルーチンにうつった場合の、それ以降の処理が非常にややこしくなるんだ
まあ、詳しくは構造化エラー処理あたりでぐぐってみてくれ

で、613はJava系のプログラマか?
VBAで例外スロー、キャッチとか考えんほうがいいぞw


618 :デフォルトの名無しさん:2009/04/08(水) 03:50:08
つーか、IsNumericじゃダメなの?

619 :デフォルトの名無しさん:2009/04/08(水) 06:07:31
IsNumericかregexを使う

620 :デフォルトの名無しさん:2009/04/08(水) 10:11:12
vbのエラー処理ってこんなかんじだったかな

1:
on error resume next
(処理)
if err.number = xxx then

end if
on error goto 0

2:
on error goto eh
(処理)
exit sub/function
eh:
(errで分岐したり処理したりする。resume next で戻ることも出来るが、大体はそのままプロシージャを抜ける。)

621 :デフォルトの名無しさん:2009/04/08(水) 10:15:33
負の日付を判断する関数ってあります?
もしくは負の日付か判断する方法があったら教えてください

isDate(負の日付)や変数 = 負の日付とかするだけでエラーに飛んでしまって・・・

622 :デフォルトの名無しさん:2009/04/08(水) 13:07:38
まず、負の日付の定義についておしえてくれ


623 :デフォルトの名無しさん:2009/04/08(水) 13:45:02
1899/12/29以前ってことか?
俺のとこじゃDate型の変数にCdate("1872/8/13")を入れてMsgBox IsDate(変数)とすりゃTrueだけどな。
直にMsgBox IsDate(-10000)だとFalseだが。
エラーにはならんな。

624 :デフォルトの名無しさん:2009/04/08(水) 14:07:01
>>622-623
説明不足でもうしわけないです
表示形式が「日付」のセルに、例えば9999999999って値を打つと
####と表示され、マウスカーソルをあてると「負の日付または時間は####と表示されます。」
と出てきまして、そこの値をvbaの方で参照しようとして落ちているという状況です
(日付型のとこには0〜2958465以外の数値だと日付シリアル対象外でこうなるようで・・・)

関数があれば〜と言いましたが、代入するにしろ引数にするにしろ、
参照した時点で落ちてるので関数があっても意味がないと思い、
結局エラーに行かせた先で判断するようにしました

どうもありがとうございました

625 :デフォルトの名無しさん:2009/04/08(水) 14:19:05
>>624
Value2プロパティが2958465以下かで判断する方法もあるかもね。
ValueプロパティだとオーバーフローのエラーだがValue2だとオーバーフローしないから。

626 :デフォルトの名無しさん:2009/04/08(水) 14:59:38
>>625
知らないプロパティだったんで早速調べてみたんですがこれで行けそうです!
>>625氏の言うとおりの方法で範囲外なら無効な日付とメッセージを出すようにしてみました

出来ればエラーに飛ばしたくないと考えていたので助かりました
どうもありがとうございます!


627 :611:2009/04/08(水) 17:37:10
>612
レスありがとうございます


628 :デフォルトの名無しさん:2009/04/09(木) 00:08:50
EXCELファイルがどのバージョン(EXCEL97、2000、2003)で
作成されたものか調べる方法を教えてくれ神ども。

629 :デフォルトの名無しさん:2009/04/09(木) 05:48:16
拡張子は?

630 :デフォルトの名無しさん:2009/04/09(木) 16:18:51
>>629
全部xlsだろ。

631 :デフォルトの名無しさん:2009/04/09(木) 17:06:50
>>628
CalculationVersionプロパティじゃダメと言うなら
ttp://support.microsoft.com/kb/178605/ja?spid=1743&sid=579

VBAで書かれてないからそのままコピペじゃ動かないけど
アルゴリズムとしては使えるわけだからそれを参考に組めば良い
バージョン確認部分に置いてVBAで出来ないことはやってないから

632 :デフォルトの名無しさん:2009/04/09(木) 18:18:28
質問です。
保護されたセルのキャプションやプロパティを変える方法ってありますか?

633 :デフォルトの名無しさん:2009/04/09(木) 18:23:13
キャプション?
プロパティ?

それってセルではないのでは?
というか保護されてるのに変えられたら保護されてる意味無いのでは?

単に保護の解除、変更、再保護を自動化したいってなら可能だけどね。

634 :デフォルトの名無しさん:2009/04/09(木) 21:01:10
>>633
ついオブジェクト等のノリで書いてしまいました。
セルのバリューやフォント等です。

使う人には入力不可能にしたいんですが、
一定の状況下では処理で内容を書き換えたりしたいと思ってます。

635 :デフォルトの名無しさん:2009/04/09(木) 21:26:13
それなら一番下の行の方法だね

636 :デフォルトの名無しさん:2009/04/09(木) 23:31:00
マクロの記録って素晴らしいよな
この機能のおかげでVBAに取っ付き易いし、ヘルプより役に立つときもある
似たような感じで、JAVAとか勉強できないのかね

637 :デフォルトの名無しさん:2009/04/09(木) 23:55:16
アプリケーションマクロじゃないと「記録」にならないからな
純粋な開発言語では記録する対象が存在しない
Excelのマクロの記録だって、記録されるのはApplication以下のオブジェクトに対する操作だけだろ

638 :デフォルトの名無しさん:2009/04/10(金) 00:34:54
そうやって欠点ばかり見るのは君の悪い癖 来い、キスしてやる

639 :デフォルトの名無しさん:2009/04/10(金) 00:46:15
何処の誤爆だ?

640 :デフォルトの名無しさん:2009/04/10(金) 00:50:28
キスされたい

641 :デフォルトの名無しさん:2009/04/10(金) 01:05:12
ぶちゅうっ

642 :デフォルトの名無しさん:2009/04/10(金) 14:35:43
ズキューン!!

643 :デフォルトの名無しさん:2009/04/10(金) 18:09:16
EXCEL2003です。

シート上にあるオートシェイプ(テキストボックス)の名前と位置を
VBAで知る方法を教えて下さい。

よろしくお願いします。

644 :デフォルトの名無しさん:2009/04/10(金) 20:56:05
Debug.print ActiveSheet.Shapes(1).Name,ActiveSheet.Shapes(1).top,ActiveSheet.Shapes(1).left

645 :デフォルトの名無しさん:2009/04/10(金) 23:52:46
どなたか教えてください。
VBAを使ってボタンを配置したいのですが、コントロールボックスが灰色になっていて配置できません
これはなぜなんでしょうか?
元々もらったファイルなのでなにか設定されているのでしょうか?

646 :デフォルトの名無しさん:2009/04/11(土) 00:59:55
>>645
enable=true

647 :デフォルトの名無しさん:2009/04/11(土) 08:00:40
ユーザーフォームで入力された変数を、そのフォームを呼び出した親フォームで受け取りたい場合、
グローバル変数で受け渡すしかないんでしょうか?

ユーザーフォームをクラスにして、それにPublicなメンバ変数を持たせて、
呼び出し側の親フォームは、このユーザーフォームのインスタンスの生存期間中、そのメンバ変数にアクセスしたいとか思ってます。
VBAでも可能なのでしょうか?


648 :デフォルトの名無しさん:2009/04/11(土) 08:20:17
ListBoxにAddItemした文字列があるとします。
その文字列自体ではなく、その文字列にマッピングした数字を得ようとする場合、いい方法あります?

Win32だと、LV_ITEM::lParamなんかに、そのアイテムに紐づく任意の値を保持できるじゃん。
そしてListCtrlをソートしたり、アイテムを追加削除した後でも、ユーザが選択した文字列から、それに紐づく任意の値がとれるじゃないですか。

VBAで、ListBoxで、AddItemした場合、追加した順番がそのままListIndexに対応するって考えていい?
ソートしたり(できるか知らんけど)、アイテムを後から削除してまた追加したりすると、ずれる?

649 :デフォルトの名無しさん:2009/04/11(土) 09:12:05
>>647
子で取得した変数を親で呼び出したいって事だよね?
publicを使うとしても、いきなりpublicに子から代入するんだと、拡張性が著しく落ちるんで、
子の処理の最後に、publicに受け渡す方が良いと思う。

>>648
LV_ITEM::lParamをAPIとして呼び出して使えば良いんでない?

650 :デフォルトの名無しさん:2009/04/11(土) 09:21:42
>>648
レスサンクス。

結局Win32のListViewを使うことにしました。
で、
mylistview.ColumnHeaders.Add(0, "_Name", "名前", 50,,)
ってやってみたんだけど(もちろんどっかのサイトのサンプルをぱくって)
これだと文法エラーの赤い表示にされる。。
でもカッコ('('と')')を取り除くとOK。引数の数はどっちでもあってるのになんで(?_?)
VBA難しすぎる。

651 :デフォルトの名無しさん:2009/04/11(土) 09:46:03
VBでは、戻り値を使わないなら括弧を付けない。使うなら括弧を付ける。
関数とステートメントが区別されていた古代のBASICの名残だと思う。
Callを使えばCall mylistview.ColumnHeaders.Add(0, "_Name", "名前", 50,,)と、
戻り値が無くても括弧を付けて書ける。

652 :デフォルトの名無しさん:2009/04/11(土) 10:17:19
>>651
おおおおおお!!!!
ありがとうございます!!
そういうわけだったのかぁ。。
ぜんっぜん気がつきませんでした
どうもっす!

653 :デフォルトの名無しさん:2009/04/11(土) 11:09:30
いつもお世話になっております

マクロが登録されているオブジェクト(セルではないです)のプロパティ(色やフォントサイズ)
を取得したいのですが、どのように指定すればよいのでしょうか?

やりたいこととしては
青色と赤色と黄色それぞれで塗りつぶしたオートシェイプが1つずつあり
赤色の方にマクロを登録します
青色と黄色のオートシェイプを選んだ状態で
マクロが登録された赤色のオートシェイプをクリックすると
青色と黄色のオートシェイプが赤色に変化する
といったことです

説明不足等がありましたらご指摘ください
よろしくお願いします

654 :デフォルトの名無しさん:2009/04/11(土) 21:44:17
ひんと:
foreach shape in Selection.Shapes
 debug.print shape.name
next


655 :デフォルトの名無しさん:2009/04/11(土) 22:16:21
>>654
レスありがたいのですが
そのマクロを実行すると
オブジェクトはこのプロパティまたはメソッドに対応していません。
と出てしまいます。
foreachはfor eachですよね?

656 :デフォルトの名無しさん:2009/04/11(土) 23:26:36
シェイプ名で管理しておいて、
赤が押された時に、黄色と青色のシェイプが選択されているかを判定して、
それを通った場合に、赤くした方が良い。


657 :デフォルトの名無しさん:2009/04/12(日) 01:29:31
只今、どこに選択セルがパッと見分からないので、
選択したセルを自動的に行、列共に罫線で囲い、
選択セル位置が変化したら、次の位置を行、列、共に罫線で囲う。
というプログラムを作っています。それでプログラムを作ったのですが、
半分上手くいき、半分上手くいきません。というのは、
次のセルを選択しても、前のセル位置でつけた罫線が、
残ってしまうのです。
コードは

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Application.EnableEvents = False
With Target.Cells

Union(.EntireRow, .EntireColumn).BorderAround Color:=RGB(255, 0, 255)

End With
Application.EnableEvents = True
End Sub

です。どなたか、ご指摘願えればなと思います。
また、excel2003 osはxpになります、宜しくお願い致します。

658 :657:2009/04/12(日) 01:40:24
お騒がせしました。その後自分で解決し、分かりました。
何時も皆様にお世話になって得るので、
このプログラムは結構便利だと思うので、もし良かったら買いときますので
お役立て下さい。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Cells.Borders.ColorIndex = xlColorIndexNone

Application.EnableEvents = False
With Target.Cells
End With
Application.EnableEvents = True
End Sub

こうすれば十字に罫線を引けました。


659 :デフォルトの名無しさん:2009/04/12(日) 01:59:37
選択セルって何もしなくてもぶっとい枠で囲まれるじゃん。行列番号も色が変わるし。

660 :デフォルトの名無しさん:2009/04/12(日) 02:00:03
Excelのプログラム用のライブラリというものはないかね。
自前で書く手間を省いて時間を節約したいんだが。

661 :デフォルトの名無しさん:2009/04/12(日) 02:17:41
いくらでもあるよ

662 :デフォルトの名無しさん:2009/04/12(日) 02:26:41
えっ、どこにある

663 :デフォルトの名無しさん:2009/04/12(日) 02:53:36
ここ
ttp://www.google.co.jp/search?hl=ja&q=excel+vba+%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA

664 :デフォルトの名無しさん:2009/04/12(日) 08:17:00
>>657
static使うと前のセル情報をstaticに保持しておけるよ。

665 :643:2009/04/12(日) 09:05:41
>>644
レスありがとうございます

666 :デフォルトの名無しさん:2009/04/12(日) 10:52:53
関数からNullを返したいんですけど
”実行時エラー(94):Nullの使い方が不正です”って言われます。

Private Function foo() as String
  foo = Null
End Function

の様に書いてます。

なぜでしょう、またどうすればいいの?

667 :デフォルトの名無しさん:2009/04/12(日) 11:03:19
>なぜでしょう
基礎を何も理解してないから。
>またどうすればいいの?
まともに学習すること。

668 :デフォルトの名無しさん:2009/04/12(日) 11:37:21
ググっても基礎なんてさっぱり出てこないし、
MSDNもでかすぎてどこで探したらいいか分からないし
言語仕様を知ってる人に手っ取り早く教えて欲しいです。
教える気がないならレスはいらないです。


669 :デフォルトの名無しさん:2009/04/12(日) 11:38:20
>>668
"null"

670 :デフォルトの名無しさん:2009/04/12(日) 11:42:55
言語仕様以前の問題だろ?
String型の戻り値にString型以外の値を渡せばエラーになるのは当然のこと

671 :デフォルトの名無しさん:2009/04/12(日) 11:43:50
それを言語仕様っていうんだよ


672 :デフォルトの名無しさん:2009/04/12(日) 11:45:11
ほんとVBのコミュニティーはレベルが低いね
こんなものなくなってくれりゃC++でバリバリかける
よっぽどはええ

673 :デフォルトの名無しさん:2009/04/12(日) 12:01:06
ここのアホの相手してたら時間が無駄になった。
自分で探したほうがよっぽど早かったww
ほんっとお前ら使えないな。
VBしか出来ないんだろ?どーせww
だからろくに引数の説明も戻り値の説明もない関数インタフェースを載せてるオナニーサイトばっかりなんだよ
戻り値もなけりゃ不定時の動作の説明もエラーの返却方法も書いてない
ゴミみたいなサイトばっかりw言語がゴミだからやってる奴も文系まるだしのゴミばっかw
なにがObjectだよ
COMだろがどーせw
おまえら威張り腐るからにはCOMがVBでどう生成されてるかぐらい書けるんだろーな?


674 :デフォルトの名無しさん:2009/04/12(日) 12:19:12
哀れだな

675 :デフォルトの名無しさん:2009/04/12(日) 12:24:09
>>671
型というものの存在自体を知らないならね

しかし型というものを知っている上で気付かないのは
無知(言語仕様知識が足りない)ではなく単なる馬鹿

676 :デフォルトの名無しさん:2009/04/12(日) 13:19:57
>>672
C++とかどんだけCOMの呼び出しとか
文字列の扱い諸々面倒なんだ…
しかもシートに処理対象のデータ定義とかかけないし…

グルー言語ってご存知?
http://ja.wikipedia.org/wiki/%E3%82%B0%E3%83%AB%E3%83%BC%E8%A8%80%E8%AA%9E

677 :デフォルトの名無しさん:2009/04/12(日) 19:17:23
>>672
確かにCは何でも出来るよね。
でも、VBAを使ってる人たちは、VBAが仕事の役に立つからやってるだろうね。
Excel帳票を処理する仕事に対してVBAってスクリプトが一番向いてるのは間違いないよ。

Cは何でも出来るけど、裏を返せば自分で全部やらなきゃいけない。
なんでも出来るけど自分で全部0から作らなきゃいけないって事の裏返しだよ。

Cが向いてる仕事ならCで作れば良いじゃない。
心配しないでも、このスレの連中は特化した言語って言う概念を持ってるから大丈夫。
VBAでゲーム作るって言った馬鹿に対して、Flashで作れ。って返答があったしね。

あと、シェアが高いってのは言語を扱う上で凄く大切だから覚えておくと良いよ。

678 :デフォルトの名無しさん:2009/04/12(日) 20:57:38
ObjectでIDispatchの名前が出てこない奴は偽者。
ObjectのつもりでIUnknownを返しても、
ExcelはvtblがIDispatchであることを前提にアクセスしてくる。

679 :デフォルトの名無しさん:2009/04/12(日) 23:06:09
>確かにCは何でも出来るよね。
C++
何おかしなレスしてるのか。

680 :デフォルトの名無しさん:2009/04/12(日) 23:55:21
方法を模索したのですが分かりませんでした。
宜しくお願い致します。以下、コードは簡単なのですが・・・

Sub 数式ある無し判定()

If Range("AZ27").HasFormula Then
Range("AZ27").Interior.ColorIndex = none
Else
Range("AZ27").Interior.ColorIndex = 13
End If

End Sub

つまり、「AZ27に数式があれば色なし、なければ背景色に色を付ける」
という式なのですが、これをAZ27からAZ330までの行全てに、
適応させねばなりません。
そうすると、end ifの判定を一つのセルに一つ必要で、
そうするとこの式が300個以上必要になり、困っています。
そんなことをせずとも解決する方法があると思うのです。
分かる方、宜しくお願い致します。
excel2003 osはxpになります。

681 :デフォルトの名無しさん:2009/04/13(月) 00:09:46
AZ27が何行、何列か知らんが、例えば、
1,1〜100,100までfor使って走査したら?

682 :デフォルトの名無しさん:2009/04/13(月) 00:14:11
>>680
Dim eachRange as range
For Each eachRange In [AZ27:AZ330]
eachRange.Interior.ColorIndex = IIf(eachRange.HasFormula, none, 13)
Next


683 :デフォルトの名無しさん:2009/04/13(月) 00:24:23
>>681
数値でループするなら
Range("AZ27").Cells(rowIndex, columnIndex)
という相対指定ができたような気がする
うろ覚えだけど

684 :デフォルトの名無しさん:2009/04/13(月) 00:27:44
680です。
>>681
for next を使うということでしょうか。何のことか分かりませんでしたが、
本で調べたら載っていました。これを応用すれば出来そうです。
ありがとうございます。

>>682
ありがとうございます。
親切にコードまで書いていただき感謝しています。
お陰さまで解決しました。本当にありがとうございました。


685 :デフォルトの名無しさん:2009/04/13(月) 00:38:36
>>682
ループの中でIIfは使わないようにした方がいいよ
300くらいならさほど問題にもならないだろうが
IIf関数はIf...Thenステートメントの5〜10倍の時間が掛かるから

686 :デフォルトの名無しさん:2009/04/13(月) 01:04:38
みんな詳しいなー

何時も感心しますわ。マジで、

687 :デフォルトの名無しさん:2009/04/13(月) 02:57:17
ちょっとスレ違いだが、
VSTO 使っている人いる?

VBA からの移行のために勉強中。

688 :デフォルトの名無しさん:2009/04/13(月) 12:06:36
>>666じゃないけどnullは0文字の文字列って定義じゃないの?
それをstringに格納できないのは良く分からない
>>671
の言うとおり、言語仕様ってことでいいのかな?

689 :デフォルトの名無しさん:2009/04/13(月) 12:26:53
Nullは文字列(String)じゃないよ

Debug.Print TypeName(Null)
Debug.Print TypeName("")

690 :デフォルトの名無しさん:2009/04/13(月) 12:54:53
>>675
俺は671じゃないが
その型を定義してるのが言語仕様でなくてなんなのだと?
まさか、型はどんな言語でも必ず同じだとおもってるのか?

>>688
VBAには一応型の観念があるんだが、これが非常にあいまいで
必要に応じて自動的に違う型として扱われたりするんだ

で、NULLは文字列でも数字でもない、特殊な型だと思ってください

VBAではNULLを文字列として評価すると、空文字列("")として評価されます
でもNULLは文字列型ではありません
数字として評価するとゼロになるけど数字型でもありません


691 :デフォルトの名無しさん:2009/04/13(月) 12:59:12
>>689>>690
なるほど、そういうことでしたか
ありがとうございました。

692 :デフォルトの名無しさん:2009/04/13(月) 13:28:02
>>690
型という物が存在することを知っていながら型違いを疑わないのは、
言語仕様という知識の不足ではなく、発想や思考の貧困さが原因

型という物の存在自体を知らずに、型違いによるエラーで悩んでるなら
言語仕様知識の不足と言えるが

693 :690:2009/04/13(月) 15:10:57
>>692
型違いはエラーになるから疑う必要がある、というのは言語仕様の知識なんだが
お前さんVBAの型については詳しいのか?
世の中には型チェックが厳密な言語だけじゃないんだよ

ま、質問関係ないしこれ以上はスレチか

694 :デフォルトの名無しさん:2009/04/13(月) 16:17:23
ダメだこりゃw

695 :デフォルトの名無しさん:2009/04/13(月) 16:46:20
>>693
VariantこそがVB!!!

696 :デフォルトの名無しさん:2009/04/13(月) 19:46:34
俺はどうもVBSの全部variant型が気に食わないな・・・。


697 :デフォルトの名無しさん:2009/04/13(月) 20:25:54
JavaScriptのフリーダムさに比べたら大分マシ。
逆に中途半端な気もするが。

698 :デフォルトの名無しさん:2009/04/13(月) 20:26:53
PerlもJavaもかなりアバウトだよな
代入するだけで型変換までしてくれる

699 :デフォルトの名無しさん:2009/04/13(月) 21:35:48
Javaは別にアバウトではないよ。(strongly typed languageと自分で言ってる。)
プリミティブ方とかauto-boxingはアレだけど。ジェネリックはまあ…、ちゃんとしてる。

Perlに関して言えば、変数名について型を宣言できない。(VBScriptやJScriptと同様)
Lispとかも自由だね。ただ値をスロットに埋めるだけだもんね。

型が厳しいっていったらDB2のSQLとか、Haskellとか、OCamlとかかなあ。
OCamlは小数点同士とかの足し算にいちいち配慮するのが面倒。

700 :デフォルトの名無しさん:2009/04/14(火) 09:18:19
ボタンでプログラム割り当てたんだけど
それぞれのボタンにどんなプログラムが割り当てられてるか
確認するにはどうしたらよいでしょうか?
office2007です。

701 :デフォルトの名無しさん:2009/04/14(火) 09:57:47
フォームのボタンなら、ボタンオブジェクト(シェイプ)のOnAction調べれば良い
コントロールのボタンなら、コントロール名_Clickのはず

702 :デフォルトの名無しさん:2009/04/14(火) 11:36:53
>>701
挿入からフォームのコントロールで作ったボタンなんですが
よくわかりませんでした。
すみません。

703 :デフォルトの名無しさん:2009/04/14(火) 11:52:49
良く解らなかったら解るまで調べれば良いだけだね
解らなかったらそこで思考停止する人はここには来ないはずだから>>1★5

704 :デフォルトの名無しさん:2009/04/14(火) 12:08:14
>>702
そのボタンを右クリック→マクロの登録で、一番上に表示される「マクロ名」を見る

705 :デフォルトの名無しさん:2009/04/14(火) 14:10:02
Dim b As Button
For Each b In ActiveSheet.Buttons
Debug.Print b.Caption, b.OnAction
Next
End Sub

706 :デフォルトの名無しさん:2009/04/15(水) 08:54:32
>>704
どうもありがとうございます。
ようやくわかりました。

707 :デフォルトの名無しさん:2009/04/15(水) 17:54:29
>>702
マクロ表示でもいけそうな気がする

708 :デフォルトの名無しさん:2009/04/15(水) 22:11:57
すいません、教えてください。
セルの値が変更されたら、文字の色を変更したいと思い
changeイベントで実現出来るのは分かったのですが、
数式が入っているセルは色が変更しませんでした。

どうやったらSumなどの数式が入っているセルも
同じように実現できるのでしょうか?

709 :デフォルトの名無しさん:2009/04/15(水) 23:55:13
>>708
Changeイベントはセルの値が変更されたときに動くイベントだが
数式の入ってるセルは、表示は変わってもセルの値である式は変わらない
だから、トリガーとすべきは数式が入ってるセル自体ではなく、数式が参照しているセル

A1 | 3
A2 | 4
A3 | =A1+A2

で、A3の色を変えたいなら、A1とA2をチェックする

710 :デフォルトの名無しさん:2009/04/16(木) 11:35:24
知ってる方がいれば教えて欲しいのですが、
ExcelでOpenXML(xlsx)形式が利用可能かどうか調べる方法は無いのでしょうか?

Application.FileConvertersを見ればいいのかと思ったのですが、
Excel2003 + Office2007互換パックの環境でFileConvertersがNullになっていました

711 :デフォルトの名無しさん:2009/04/16(木) 16:11:03
VBってパッチを当てて自動更新みたいな事はできます?

どっかサーバにマスター置いといて、
そのファイルのバージョンが今自分が開いたのと違ったら、
変わってるコードだけ書き換えるような。

712 :デフォルトの名無しさん:2009/04/16(木) 16:46:32
>>710
拡張子の関連付けを調べたらどうだろう

>>711
モジュールの追加、削除なら可能
あとは工夫次第

713 :デフォルトの名無しさん:2009/04/16(木) 20:11:03
excelの文章を縦書きにする事ってできますか?
枠自体を縦にしたいのですが

714 :デフォルトの名無しさん:2009/04/16(木) 20:56:43
>>711
VSTO+clickonce

715 :デフォルトの名無しさん:2009/04/16(木) 22:32:49
>>713
スレタイと>>1をよく読め

716 :デフォルトの名無しさん:2009/04/16(木) 22:37:31
Excel VBAで彼女できますか?

717 :デフォルトの名無しさん:2009/04/16(木) 22:45:41
冴子先生でよければ

718 :デフォルトの名無しさん:2009/04/18(土) 10:03:26
EXCEL2003です。

シート上にあるオートシェイプとグラフオブジェクトの数を
知る方法を教えて下さい。

よろしくお願いします。


719 :デフォルトの名無しさん:2009/04/18(土) 11:11:44
>>718
shapes.count
charts.count

720 :718:2009/04/18(土) 13:08:51
>>719
レスありがとうごさいます。


721 :デフォルトの名無しさん:2009/04/18(土) 16:49:51
VBAの初心者ですが、形式を選択しての値の複写のマクロの記録なのですが、
出来たら、1行にしてあらわしたいのですが、うまくいきませんでした。
どう修正するのがいいでしょうか?

Range("A5:A20").Copy
Range("F5:F20").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False


722 :デフォルトの名無しさん:2009/04/18(土) 17:26:48
>>721
Range("F5:F20").Value = Range("A5:A20").Value

723 :デフォルトの名無しさん:2009/04/18(土) 17:36:18
あぁー、なるほど。サンクスです。


724 :デフォルトの名無しさん:2009/04/18(土) 19:28:02
すみません。ご教授下さい。

変数に入っている時刻データを、テキストボックスに表示するときに、
「0.622.....」とかじゃなく、ちゃんと時間で表示するにはどうすればよいでしょうか。

725 :デフォルトの名無しさん:2009/04/18(土) 19:34:14
>>724
format
ttp://officetanaka.net/excel/vba/tips/tips110.htm


726 :デフォルトの名無しさん:2009/04/19(日) 00:49:08
Excelの上級機能を残らず学習するだけでも大変なのに、VBAまで学習のは至難の業
ではないでしょうか。

727 :デフォルトの名無しさん:2009/04/19(日) 00:52:12
[ ]内が抜けてしまいました。
学習の[するの]は

728 :デフォルトの名無しさん:2009/04/19(日) 00:53:46
エクセルの上級昨日ってなんかあったっけ
VBA覚えたら割と何でもできるから楽だよ


729 :デフォルトの名無しさん:2009/04/19(日) 01:10:30
シナリオ、ソルバー、ゴールシーク、フィルタオプション、自動集計、アウトライン
ピボットテーブル、MS-Query等ある。

730 :デフォルトの名無しさん:2009/04/19(日) 01:13:23
>>729
それ中級でしょ?

731 :デフォルトの名無しさん:2009/04/19(日) 01:17:45
自分が上級者であることを自慢したいようだな。

732 :デフォルトの名無しさん:2009/04/19(日) 01:50:17
逆でしょ

733 :デフォルトの名無しさん:2009/04/19(日) 01:53:44
中級とか大口を叩いてる割には、その機能を用いたVBAコードが無いじゃないか。

734 :デフォルトの名無しさん:2009/04/19(日) 02:04:30
で?

735 :デフォルトの名無しさん:2009/04/19(日) 02:04:55
エクセルの上級機能なんてそれこそVBAそのものだと思うんだけど
ソルバーとかもそうなるのかね、使ったことないや


736 :デフォルトの名無しさん:2009/04/19(日) 02:09:51
自分は配列数式や複素数で目から鱗が落ちてきた。

737 :デフォルトの名無しさん:2009/04/19(日) 02:18:24
>>734
>で?
お前の言う中級機能を使ったVBAコードをアップしてみろ。

738 :デフォルトの名無しさん:2009/04/19(日) 02:21:07
何でそんなに必死なの?

739 :デフォルトの名無しさん:2009/04/19(日) 02:28:19
上級機能だと思って鼻高々だった機能を中級だと言われて怒り心頭。
こういう子は弄らず生暖かく見守ってやるに限る。

740 :デフォルトの名無しさん:2009/04/19(日) 02:29:05
何だ、結局口だけのようだな。

741 :デフォルトの名無しさん:2009/04/19(日) 02:31:38
その中級機能すらコードを書けないくせに。

742 :デフォルトの名無しさん:2009/04/19(日) 02:33:54
中級とか言うなら、それを使ったコードを見せてから言えよな。

743 :デフォルトの名無しさん:2009/04/19(日) 02:36:16
( ゚д゚)ポカーン

744 :デフォルトの名無しさん:2009/04/19(日) 02:40:51
>>721くらいが理解できればエクセル中級と言っても過言ではないと思う。
その程度か、と言う気もするが、VBAを知らない人間が圧倒的に多いことを考えればそんなもんだと思う。

745 :デフォルトの名無しさん:2009/04/19(日) 02:44:33
中級機能のコードを書けないのに、口だけの自称上級者が、恥をかいたようです。

746 :デフォルトの名無しさん:2009/04/19(日) 02:45:44
そういう事にしておきたいのですね、解ります。

747 :デフォルトの名無しさん:2009/04/19(日) 02:47:19
恥かいてるくせに、虚勢を張らなくていいんだぞ。

748 :デフォルトの名無しさん:2009/04/19(日) 02:52:40
言ってて情けなくならないか?
ならないとしたら君は幸せな人だ

749 :デフォルトの名無しさん:2009/04/19(日) 02:55:06
口だけで虚勢を張る人間のほうが情けないな。
そして、そうやってほっとけないお前もな。

750 :デフォルトの名無しさん:2009/04/19(日) 02:59:17
ダメだこりゃw

751 :デフォルトの名無しさん:2009/04/19(日) 03:02:16
自称上級者の恥の上塗り
回りから注目を集めろ、自称上級者。

752 :デフォルトの名無しさん:2009/04/19(日) 03:06:38
己が嘲笑を買っていることには気付かないのでした。

753 :デフォルトの名無しさん:2009/04/19(日) 03:07:57
素直に負けを認められないのが、さすが自称上級者だな。

754 :デフォルトの名無しさん:2009/04/19(日) 03:13:24
この子おもしれーなぁ

755 :デフォルトの名無しさん:2009/04/19(日) 03:14:46
自称上級者って、ほんとおもしれーなぁ

756 :デフォルトの名無しさん:2009/04/19(日) 03:20:21
その話題VBA関係ないだろ。スレ違いじゃ。
いくら知識や能力があっても基本的なルールが守れない自称上級者は
どこ行っても嫌われるだけ。

757 :デフォルトの名無しさん:2009/04/19(日) 03:21:17
もしかして自分が弄られてるだけだってことに気付いてなかったりする?

758 :デフォルトの名無しさん:2009/04/19(日) 03:25:00
いつまで意地を張ってるのだろうか。
まあ、自称上級者は失うものが大きいから、黙っておけないんだろうな。
こっちは自称上級者に弄られようが、失うものは何もないがな。

759 :デフォルトの名無しさん:2009/04/19(日) 03:31:36
こんな面白い玩具を失うのは確かに大きい痛手だ

760 :デフォルトの名無しさん:2009/04/19(日) 03:34:29
さすがは自称上級者らしい書き込みだな。

761 :デフォルトの名無しさん:2009/04/19(日) 03:38:44
いつまで意地を張ってるのだろうか。

762 :デフォルトの名無しさん:2009/04/19(日) 04:24:25
がきどもおちつけ

763 :デフォルトの名無しさん:2009/04/19(日) 04:34:23
ここで質問するのは場違いかも知れませんが、
csv形式のファイルを読み込むと通常(普通)なら
左からA,B,C、・・・・と並ぶのに
なぜか右からA,B,C、・・・・と並んで表示されます。
エクセル形式のファイルは普通の並びです。
しかしながら、CSV形式のファイルをエクセルのSHEETにペースト
すれば通常の並びです。 
CSV形式のファイル表示を通常の並びにする方法を知りませんか?



764 :デフォルトの名無しさん:2009/04/19(日) 04:37:44
>763
OS:WIN XP
VER:2003
です。


765 :デフォルトの名無しさん:2009/04/19(日) 05:28:25
>>763
VBA関係ない質問はこっち

Excel総合相談所 81
http://pc11.2ch.net/test/read.cgi/bsoft/1239169475/

上級者と愉快な仲間たちはここらへん

【質問不可】Excel総合相談所スレの雑談・議論スレ2
http://pc11.2ch.net/test/read.cgi/bsoft/1151651536/

766 :デフォルトの名無しさん:2009/04/19(日) 07:13:11
>>761
何だ、まだやってたのか、自称上級者。
そんな無意味な書き込みはしなくていいから、早く中級機能を用いたコードを
見せてみろよな。

767 :デフォルトの名無しさん:2009/04/19(日) 09:10:29
初級:罫線・印刷・グラフ・関数(SUM等)・ショートカットキー
中級:VBAをマクロの記録で使える・ピボットテーブル・関数(indirect・row・ifやvlookupを入れ子で使える)・検索が出来る・オートフィルタ・シリアル値を理解している
上級:VBAをマクロの記録無しで使える・関数(clean・char)・論理和論理積を使える・エクセルの仕様(バグ)を理解している

一般的にはこの程度だろうな
このスレならVBAのマクロの記録ができて初級者、配列やAPIを理解できればで中級者ってところか

768 :デフォルトの名無しさん:2009/04/19(日) 09:22:22
COM(CreateObject関数)を使いこなせる、くらいが上級者じゃね?

769 :デフォルトの名無しさん:2009/04/19(日) 10:49:11
私は操作方法はあまり知らないけど
表計算の「腕試し問題」を解くのは得意な頭の良い初心者です。

770 :デフォルトの名無しさん:2009/04/19(日) 10:53:11
自分で頭の良いなんていっちゃった

771 :デフォルトの名無しさん:2009/04/19(日) 11:10:31
釣りだろう

772 :デフォルトの名無しさん:2009/04/19(日) 12:25:11
VSTOを一通り使っている、というのも上級者の条件かもしれない。
プライマリ相互運用機能アセンブリ使うのと似たようなものと考えているけど、
実際使ってみたら結構違うんだろうなあ。

773 :デフォルトの名無しさん:2009/04/19(日) 12:50:30
また、vba初心者ですが教えてください。
9時前なら、A処理を行うを次のとおり、if文を書いたのですが、判別文が
効いてません。直してください、よろしくおねがいします。

ntime=Now
If ntime <= TimeValue("09:00:00") Then
A処理
End if

774 :デフォルトの名無しさん:2009/04/19(日) 12:51:13
仕事によって使うObjectが違うから、COM必須とは言い難いけど、
COM使いこなせれば、ほとんどのVBA技術はググって調べられるだろね。

775 :デフォルトの名無しさん:2009/04/19(日) 13:06:42
>>773
TimeValueの返す日付は、1900年1月1日か2日あたりになるだろうから、
その条件を満たすことはほぼ無いだろ。
ntimeからも時間の部分だけ取り出さないと。

776 :773:2009/04/19(日) 13:36:58
サンクス。おかげで、Dim ntime As Dateとしていましたので、
ntime=Now を ntime=Time と修正したらうまくいきました。


777 :デフォルトの名無しさん:2009/04/19(日) 23:35:44
>>711で質問した者です。

VSTO+clickonceについて調べてみたんですが、さっぱりで。。。
ほとんど初心者なんですが、理解しやすいHPがあったら教えて頂きたいのですが、宜しくお願いします。

778 :デフォルトの名無しさん:2009/04/20(月) 10:18:32
シートのコピペで値だけにしたいのですが、
Selection.Copy
Selection.PasteSpecial Paste:=xlValues
この方法だと、条件付書式は値だけにならない事が分かりました。
条件付書式も同様に値に変更する方法ありますでしょうか?

779 :デフォルトの名無しさん:2009/04/20(月) 10:37:34
文字列の中から複数の
yyyy/mm/dd HH:MM:SSを取り出したいのですが
上手い方法はないでしょうか?

例)
2009/04/10 13:55:32 会議出席
2009/04/11 15:30:22 会議終了

780 :デフォルトの名無しさん:2009/04/20(月) 12:11:14
>>725
ありがとうございます

781 :デフォルトの名無しさん:2009/04/20(月) 12:34:28
>>779
ワイルドカード使って検索すればいんじゃない

782 :デフォルトの名無しさん:2009/04/20(月) 13:47:18
>>778
Sub Macro3()
Range("B1").Select
Range("c1") = WorksheetFunction.Text(Selection, Selection.NumberFormatLocal)
End Sub
text関数に一回入れてしまえば良いんじゃないかなぁ

783 :デフォルトの名無しさん:2009/04/20(月) 13:47:41
宜しくお願い致します。コピーし貼り付ける、という簡単なコードですが、
これをontimeメソッドを使い、時間になったら実行、というコードを作りました。
しかし、時間になってもならず困っております。コードは下記です。

Sub RSS最終気配値をコピー貼付()

Range("CV27:CV320").Select
Selection.Copy
Range("CU27:CU320").Select
Selection.PasteSpecial Paste:=xlPasteAllExceptBorders, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False

Application.CutCopyMode = False

End Sub

===================================

Sub RSS最終気配値時間で実行()

Application.OnTime TimeValue("13:12:57"), "RSS最終気配値をコピー貼付"

End Sub

以上です。コードのどこかにミスが無いか確認したのですが、分かりませんでした。
ご指摘の方宜しくお願い致します。OSはXP,excelは2003になります。
宜しくお願い致します。

784 :デフォルトの名無しさん:2009/04/20(月) 15:07:56
TimeValue("13:12:57")が返す値とは、1899/12/30 13:12:57
→Debug.Print Format(TimeValue("13:12:57"), "yyyy/mm/dd hh:mm:ss")

そんなのとっくの昔に過ぎ去っていて、PCの時計を弄らない限り二度と訪れない
だから当然実行もされない

今日の13:12:57なら、Date + TimeValue("13:12:57")
→Debug.Print Format(Date + TimeValue("13:12:57"), "yyyy/mm/dd hh:mm:ss")

785 :デフォルトの名無しさん:2009/04/20(月) 15:53:06
>>784
783です。謎が氷解しました!!!
教えていただけなかったら、自力ではずっと分かっていなかった思います。
>TimeValue("13:12:57")が返す値とは、1899/12/30 13:12:57
これがサッパリ分かっていませんでした。dateが必要だったのですね(汗
教えていただき大変助かりました。
本当に有難うございます!

786 :デフォルトの名無しさん:2009/04/20(月) 16:08:04
ウォッチウィンドウとか使うといいよ


787 :デフォルトの名無しさん:2009/04/20(月) 20:45:43
(汗

788 :デフォルトの名無しさん:2009/04/20(月) 20:53:55
ステップ実行中にローカル変数のウォッチウィンドウの+をクリックすると
Outlookの新しいプロファイルの作成が開いてしまいます
対処法をご存知の方いらっしゃいましたらご教授お願いします

789 :788:2009/04/20(月) 20:55:24
環境はXPSP3+Excel2003です。

790 :デフォルトの名無しさん:2009/04/20(月) 21:26:54
それ、俺も数日前になったわ。Outlook入れていないのに。
修正パッチ絡みで何かあったのかね?

791 :デフォルトの名無しさん:2009/04/20(月) 21:57:27
ご指導お願いします
エクセルで 毎日16:50 にコピー&貼り付け をするにはどうすればよろしいでしょうか

792 :デフォルトの名無しさん:2009/04/20(月) 22:59:42
>>791

>>783
>>784

にまんま載ってるよ。>>783は間違えがあるけど、>>784で補正されてる。

793 :デフォルトの名無しさん:2009/04/21(火) 07:51:19
>792
すぐ上にあったのですね ありがとう一度試してみます

794 :デフォルトの名無しさん:2009/04/21(火) 21:36:53
Excel2007でシート1に
黒澤明 七人の侍
木下恵介 笛吹川
周防正行 変態家族兄貴の嫁さん
黒澤明 乱

これをVBAかExcelの機能を使って
シート2に
黒澤明 2
木下恵介 1
周防正行 1
みたいに集計を出したいのですが
そうすればいいのでしょうか?

795 :デフォルトの名無しさん:2009/04/21(火) 21:52:45
>>794
VBA不要なのでスレ違い

796 :デフォルトの名無しさん:2009/04/21(火) 21:56:08
そうしてください。

797 :デフォルトの名無しさん:2009/04/22(水) 06:16:28
COUNIF

798 :デフォルトの名無しさん:2009/04/22(水) 06:59:35
>>794
ピボット

799 :デフォルトの名無しさん:2009/04/22(水) 14:50:42
C言語でなら分かるのですが、VBAでの書き方が分からないって場合ここで質問して大丈夫でしょうか?


800 :デフォルトの名無しさん:2009/04/22(水) 15:03:49
いいよ

801 :デフォルトの名無しさん:2009/04/22(水) 15:19:13
質問させてください。

現在の環境は
WindowsXP
Excel2003
なのですが

CDOを利用したメール送信で、SMTPサーバにMicrosoft exchange server
のサーバを使用することってできますか?

また、できるのであれば、その指定方法を教えていただきたいです。


802 :デフォルトの名無しさん:2009/04/22(水) 16:20:41
>>801
 >>1★3★4

803 :デフォルトの名無しさん:2009/04/22(水) 16:24:21
>>801
Microsoft exchangeのメール機能はSMTPと互換性がないので無理

804 :デフォルトの名無しさん:2009/04/22(水) 16:24:31
>>800
それではお言葉に甘えて

iはループ用の変数
A,Bはセルから読み込んできた値
xは操作を加えたいセル上の値です

for(i = 0; i <= A; i++)
{
if(x < B * (i+1) )
{x = x - (B*i);
break;}
}

という操作をしたいです。
お願いします。

805 :デフォルトの名無しさん:2009/04/22(水) 17:07:49
Dim i As Long
Dim A As Long
Dim B As Double
Dim x As Double

' セルから値を取得
A = Range("A1").Value ' A1セル
B = [A2]       ' A2セル
x = Cells(3, 1).Value ' 3行1列目(A3)セル

' お望みの処理(たぶん)
For i = 0 To A
  If x < B * (i + 1) Then
    x = x - (B * i)
    Exit For
  End If
Next i

' xをセルに代入
Range("A3").Value = x



806 :デフォルトの名無しさん:2009/04/22(水) 18:12:23
>>805
ありがとうございます。うまくいきました!
因みにこれを行数がたくさんあるデータにあてはめたい場合は(例えば100行まであるデータに当てはめる)

Dim i As Long
Dim j As Long
Dim A As Long
Dim B As Double
Dim x As Double

' セルから値を取得
A = Range("A1").Value ' A1セル
B = [A2] ' A2セル

For j = 1 To 100
x = Cells(j, 2).Value ' j行2列目(Bj)セル

For i = 0 To A
If x < B * (i + 1) Then
x = x - (B * i)
Exit For
End If
Next i

' xをセルに代入
Cells(j, 2).Value = x
Next j

このような感じの書き方で大丈夫でしょうか?
さらに行数が未知のデータに適応させる(空白のセルを判定?してその手前のセルまで上記の操作を適応させる)にはどのようにしたらいいでしょうか?


807 :デフォルトの名無しさん:2009/04/22(水) 19:31:15
>>806
複数行対応はすれでOK

末行取得は
For j = 1 To Cells(Cells.Rows.Count, 2).End(xlUp).Row

808 :デフォルトの名無しさん:2009/04/22(水) 22:42:05
一つのメソッドの中でセルの指定の仕方がこうも違うと逆に爽快だな!

809 :デフォルトの名無しさん:2009/04/22(水) 23:19:19
何故cellsで複数行指定できるようにしなかったんだろう
第三引数で列数、第四で行数選べるようにすればよかったのに
RANGEめんどくさいよrange

810 :デフォルトの名無しさん:2009/04/22(水) 23:46:10
>>809
そういうときにRange使う奴はバカ
普通はResize使う

Cells(3, 4).Resize(5, 6)

これでCells(3, 4)を基準に5行6列範囲だ

811 :デフォルトの名無しさん:2009/04/22(水) 23:54:39
1000行ぐらい(実際の行数は可変、1行の幅も微妙に可変)
あるデータがあるんですけど
印刷範囲の設定、具体的には改ページを綺麗にいれていく方法ってないでしょうか?

812 :デフォルトの名無しさん:2009/04/23(木) 00:21:57
行の幅が取れるんだから計算すればいいんじゃないの

813 :デフォルトの名無しさん:2009/04/23(木) 02:49:33
>>811
「綺麗」ってのは主観なのでプログラミングできない。
客観的な基準、ルールが必要。

814 :デフォルトの名無しさん:2009/04/23(木) 07:44:41
>>810
ありがとう!普通に知らなかったわw

815 :デフォルトの名無しさん:2009/04/23(木) 09:10:17
>>811
rowheightを足して行って、○○になったら改行ってやればいいと思うよ。

816 :デフォルトの名無しさん:2009/04/23(木) 09:33:52
改行じゃなくて改ページだろ

817 :デフォルトの名無しさん:2009/04/23(木) 12:47:02
具体的には1ページに印刷できる行数が知りたいわけです

818 :デフォルトの名無しさん:2009/04/23(木) 12:48:52
マージン設定でも全然違ってくるし、
行の高さによっても全然違うだろよ。

改ページプレビューで、デフォルト何行で改ページされてるか数えればいいじゃん。

819 :799:2009/04/23(木) 15:53:14
>>807
ありがとうございます。
若干目標と違う結果になってしまったのでEnd(xlDown)でやってみました。

>>808
>一つのメソッドの中でセルの指定の仕方がこうも違う
値取得の際にRangeとCellsが混じっているということでしょうか?
これは統一できるところは揃えた方がいいのですか?

>>809
改善方法があるようでしたらご教授いただきたいです。
申し訳ありませんが初心者なので出来ましたら具体的にお願いします。


820 :デフォルトの名無しさん:2009/04/23(木) 17:17:17
Dim a(2, 2)
と配列宣言し、fornext等で処理を行い、配列に値を格納しました
この値をセル(A1:C3)に入れるにはどうすればよいでしょうか?
fornextでcells(i,j)等とし、配列の値を順次入れていくんでしょうか

821 :デフォルトの名無しさん:2009/04/23(木) 17:28:23
>>820
Range("A1:C3").Value = a

822 :デフォルトの名無しさん:2009/04/23(木) 17:44:09
>>821
アリガトーゴザマース!!

823 :デフォルトの名無しさん:2009/04/23(木) 18:24:16
>>820
エクセルのワークシートは2次元配列を視覚化した物だから、
2次元配列と凄く相性良いから覚えておくと良いよ。
複数シート使えば3次元配列も簡単に展開できるしね。

824 :デフォルトの名無しさん:2009/04/23(木) 19:43:19
.NETとかで制御するときは、アウトプロセスで呼び出しコストが高くなるから、
二次元配列で大量のデータを一気に転送できるこの方法は特に重要だな。
VBAでも速度を稼ぎたければ十分使う価値はある。

825 :デフォルトの名無しさん:2009/04/23(木) 20:20:20
セルに書き込む度に一斉描画が始まるから
一度拡大率を最大にして書き込んで元に戻すと超速いよ
そんなことしなくても描画更新停止ってある?(笑)

826 :デフォルトの名無しさん:2009/04/23(木) 20:23:47
とうとう俺がVBAに本気だすことになったから。
一応言っておく
おまえらチビるなよ

827 :デフォルトの名無しさん:2009/04/23(木) 20:36:20
教えてほしいんですが
Function Test(arg1 , arg2)
End Functionと会った場合

Test("aaa" , "bbb")
と実行するとエラーになってしまいます
引数が一つなら問題なく動くのですが
二つになるとどうしても動かなくなるんでしょうか?

828 :デフォルトの名無しさん:2009/04/23(木) 20:56:45
わからねぇ。
あきらめろ

829 :デフォルトの名無しさん:2009/04/23(木) 21:00:52
>>827
Function Test(arg1 As String, arg2 As String)
End Function
か?

830 :デフォルトの名無しさん:2009/04/23(木) 21:14:09
>>829
コンパイルエラー:
構文エラー
になります

831 :デフォルトの名無しさん:2009/04/23(木) 21:15:37
>>827

Call Test("aaa" , "bbb")

Test "aaa" , "bbb"

Dim ret
ret = Test("aaa" , "bbb")

もしかしてこういうことかも

つーか、エラーが出たって言う奴は、なんでどういうエラーが出たか書かないんだ?

832 :デフォルトの名無しさん:2009/04/23(木) 21:25:51
>>825
Application.ScreenUpdating = Falseでも不十分?

833 :デフォルトの名無しさん:2009/04/23(木) 21:26:12
worksheetを使うのに、なぜworksheetsコレクションを使わないと駄目なんですか?

834 :デフォルトの名無しさん:2009/04/23(木) 21:27:44
特に重要というか普通に使うレベルじゃないの?
むしろ違うやり方を聞きたいくらいだ。
forでまわして1セルずつとか言って笑わせんなよ?

835 :デフォルトの名無しさん:2009/04/23(木) 21:34:08
>>833
ThisWorksheet使えば?

836 :デフォルトの名無しさん:2009/04/23(木) 21:35:54
>>833
コレクションはオブジェクトの集まり
いっぺんに処理できた方が便利なことが多いからコレクションが使えるようになってる
初心者は知らずにループ回して一つずつ処理することがある

837 :デフォルトの名無しさん:2009/04/23(木) 22:07:20
ワークシートをコピーする
コピーしたワークシートに好きな名前をつける

ここまではできるのですがワークシート名に任意の日付をつける事は
できないでしょうか?1日や20090401など日付ならとくに表示形式にはこだわらないのですが


838 :デフォルトの名無しさん:2009/04/23(木) 22:12:12
>>837
指定した場所にコピーされる訳だ。
コピーされたシートの場所は、indexで調べられる。
日付を取得する。
sheets(X).name = 日付
で名前を変更出来る。


コピー先+1の名前変えても良いし、好きにやって良いんだぜ。

839 :デフォルトの名無しさん:2009/04/23(木) 22:17:09
ありがとうございます。
がんばってみます

840 :デフォルトの名無しさん:2009/04/23(木) 23:17:40
>>832
やっぱ、あるんだ・・・そうだよねw
ありがとうございます
明日、試してみます〜

841 :デフォルトの名無しさん:2009/04/24(金) 13:42:19
Private Sub CommandButton2_Click()
Dim a
Dim i As Long, j As Long, k As Long
a = Range("a1:k100")
For i = 2 To 15
For j = 2 To 15
If a(i, j) = 0 Then
End If
Next
Next
End Sub

If a(i, j) = 0 Thenでインデックスの範囲を超えていますとエラーてが出ます・・
助けてください!

842 :841:2009/04/24(金) 13:43:09
すいません解決しました
k列(12列目)を超えてるってことなんですね、失礼しました

843 :デフォルトの名無しさん:2009/04/24(金) 14:46:39
IE8にしてからVBA内のinnerHTMLが認識されなくなってしまったのですがこういうものなのでしょうか
何かいい解決法があれば教えて欲しいです…
よろしくお願いします。

844 :デフォルトの名無しさん:2009/04/24(金) 21:19:00
> VBA内のinnerHTML
って何?

COM(CreateObjectや参照設定するやつ)の話じゃなくて?

845 :デフォルトの名無しさん:2009/04/24(金) 23:38:59
InnerHtmlは文字列からURLのみを取り出す命令です。
この際言ってしまいますが、この問題が出るのはAozoraGetterという青空文庫にあるファイルを一括でダウンロードするという
excelのマクロを利用したアプリケーションです。
IE6の頃にはちゃんと動作していたのに
IE8にアップデートしてからは何故かマクロがうまく動作してくれません。
何故うまくいかないのかデバッグで確かめてみるとどうやら
>HTMLソース = IEオブジェクト.Document.Body.InnerHtml
がIE8だと対応できていないようなのです。そんな命令知りませんみたいな事を言われます。

846 :デフォルトの名無しさん:2009/04/25(土) 00:01:25
IEオブジェクト、及びその下位メソッドなどの使い方についてはスレ違いだよ。>>1★3★4
それはCOMコンポーネントっていうVBA用ってわけじゃない汎用コンポの質問になるからね。

それとinnerHTMLの提議も間違ってるから、ちゃんと勉強しようね。
「innerHTMLで出来ることの1つ」と「innerHTMLは〜です」という提議は別物だからね。

847 :デフォルトの名無しさん:2009/04/27(月) 11:23:43
変数名の一部に変数を使うことってできますか?

Counter = Counter + 1
"hoge" & Counter = バリアント型のデータ

hoge1
hoge2
hoge3と処理したいんです。

848 :デフォルトの名無しさん:2009/04/27(月) 11:41:10
Counter = Counter + 1
hoge(Counter) = バリアント型のデータ

849 :デフォルトの名無しさん:2009/04/28(火) 05:38:00
WindowsXP、Excel200でVBAの勉強をしています
A1に1 A2に2 A3に3、、、と入力した際に
A1からA3までの数字を足してC1に合計を表示するVBAを作ってみたのですが
Aの列に入力するたびにアクティブセルがC1になってしまうようになってしまいました
処理が終わったら自動的に直前まで作業していたセルに戻ってくるようにしたいのですがどのようにしたらいいのか教えていただけないでしょうか
よろしくお願いいたします

Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("A1:A10")) Is Nothing Then
Exit Sub
Else
Dim Counter As Integer
Dim Total As Integer
Total = 0

Counter = WorksheetFunction.CountA(Range("A1:A10"))
Range("A1").Select
For i = 0 To Counter - 1
Total = ActiveCell.Offset(i, 0).Value + Total
Next
Range("C1").Value = Total
End If
End Sub


850 :デフォルトの名無しさん:2009/04/28(火) 06:04:37
間違えていました

誤Excel200
正Excel2000

誤アクティブセルがC1になってしまう
正アクティブセルがA1になってしまう
でしたごめんなさい

851 :デフォルトの名無しさん:2009/04/28(火) 07:29:49
> Range("A1").Select
これはわかってるかも知れないが、セルをSelectしたらアクティブセルも変わる。
単一セルのSelectは、「Range("A1").Activate」と同じだからね。

とりあえず質問の件の目的を達するだけなら
Range("A1").Select
を消して
Total = ActiveCell.Offset(i, 0).Value + Total
   ↓
Total = Range("A1").Offset(i, 0).Value + Total
もしくは
For i = 0 To Counter - 1
  Total = ActiveCell.Offset(i, 0).Value + Total
   ↓
For i = 1 To Counter
  Total = Cells(i, 1).Value + Total
かな。
直前まで作業していたセルに『戻る』のではなく、最初からアクティブセルを変更せずに処理を行う。

どうしても途中でアクティブセルを変更する必要があって後から戻したいなら、処理に入る前(Total = 0の前当たり)に
Dim bActiveCell As Range
Set bActiveCell = ActiveCell
というように処理前のActiveCellを変数に保持して、処理が終わったて(Range("C1").Value = Totalの後当たり)から
bActiveCell.Activate 'と、『処理前に保持したActiveCell(bActiveCell変数)』をアクティブにする命令を出す。

まぁ、ぶっちゃけこのコードなら
If Not Intersect(Target, [A1:A10]) Is Nothing Then [C1].Value = WorksheetFunction.Sum([A1:A10])
の一行でも事足りると思うが、>>849はテスト段階で、実際にやりたいことは違うんだろうからな。
他にもいろいろ言いたいことはあるが、少しずつ覚えていったらいいさ。

君は、ちゃんと環境も書いてるし、コードも端折らず全部書き、まともな日本語で質問している優良質問者なのでこういうのは大歓迎だよ。
まともな人ならそんなの当たり前だと思ってくれるのだろうが、そんな当たり前のことが出来ない奴が多くてね。

852 :デフォルトの名無しさん:2009/04/28(火) 07:42:13
こうじゃないのか?

Private Sub Worksheet_Change(ByVal Target As Range)
  Range("C1") = Val(Range("A1").Value) + Val(Range("A2").Value) + Val(Range("A3").Value)
End Sub

853 :デフォルトの名無しさん:2009/04/28(火) 08:45:06
>>852
初心者をからかうなよ

854 :デフォルトの名無しさん:2009/04/28(火) 08:53:41
' Range("A1").Select
For i = 1 To Counter
Total = Cells(i, 1).Value + Total
Next

855 :デフォルトの名無しさん:2009/04/28(火) 08:57:58
' Range("A1").Select
For i = 1 To Counter
Total = Range("A" & i).Value + Total
Next

856 :デフォルトの名無しさん:2009/04/28(火) 09:06:04
Target.Select
End Sub

857 :デフォルトの名無しさん:2009/04/28(火) 09:09:51
>>851
詳しく書いていただきありがとうございました
処理前に保持したActiveCellを元に戻して上手く直前に戻ることができました

>>852
ありがとうございます
足すことが目的ではなく元のセルに返ってくる方法が何かないかと思い質問させていただきました

858 :デフォルトの名無しさん:2009/04/28(火) 09:10:57
Dim R As Range
Dim Total As Integer
Total = 0

For Each R In Range("A1:A10")
Total = R.Value + Total
Next

859 :デフォルトの名無しさん:2009/04/28(火) 10:15:59
>>857
Sub dd()
Dim r
Dim c
r = ActiveCell.Row
c = ActiveCell.Column
'処理
Cells(r, c).Select
End Sub

こんなんでいいの?

860 :デフォルトの名無しさん:2009/04/28(火) 11:17:39
何でわざわざ余計なことするの?

861 :デフォルトの名無しさん:2009/04/28(火) 15:49:02
選択された複数アドレスのコピーをする時、行でコピーするのは
Selection.EntireRow.Copyで出来る事はわかったのですが、
列方向を使用している分だけをコピーすると少し時間短縮されるので
列方向を(下記例だとA〜H列に)変更する方法がありますでしょうか?

例1)選択アドレス[$C$2:$C$3,$C5] -> [$A$2:$H$3,$A$5:$H$5]
例2)選択アドレス[$2:$3,$5] -> [$A$2:$H$3,$A$5:$H$5]
例3)選択アドレス[$C$2:$D$3,$C$5:$D$5] -> [$A$2:$H$3,$A$5:$H$5]

862 :デフォルトの名無しさん:2009/04/28(火) 18:37:25
いまいち分からないんだけど、行全部じゃなくて使用している部分だけをコピーしたいって事かな?

SpecialCells(xlLastCell) → Ctrl+Shift+End や
CurrentRegion → Ctrl+Shift+: とか
cells(1,256).end(xltoleft).row あたりで

最終の列を取得するなんてどう?

863 :デフォルトの名無しさん:2009/04/28(火) 20:13:58
>>861
Debug.Print Intersect(Selection.EntireRow, [A:H]).Address

864 :デフォルトの名無しさん:2009/04/29(水) 09:44:35
Excel2007で並べ替えの記録マクロをとると、2003までとは全然違う見たこともないようなコードになっています。
2003と同じような記録マクロを取る方法はないですか?

865 :デフォルトの名無しさん:2009/04/29(水) 12:20:54
質問です。
例えばセルに、1,15,30,31と入ってとします。
それを各数字を分けて認識するにはどうしたらよいのでしょう?

stringに入れてそれを指定の区切り文字単位で
走査する方法があるのでしょうか?

866 :デフォルトの名無しさん:2009/04/29(水) 12:22:18
splitで配列にぶち込む

867 :デフォルトの名無しさん:2009/04/29(水) 12:24:21
>>865
dim var as variant
var = split(cells(1,1),",")



868 :デフォルトの名無しさん:2009/04/29(水) 12:54:25
>>864
思うに、見たことのないマクロとは「excel4macro」のことではなかろうか。
2007ではマクロの記録に、このexcel4macroが所々出てくる。
ここの常連さん達は消える運命と教えられた人が多い。
通常のvbaに書き換えることはできるけれど、設定等で長くなるから、そのまま
使うのが、ベストと思う。
「excel 4macro」で検索してみて、その後、その部分だけアップして翻訳依頼してみたら
どうでしょうか?


869 :デフォルトの名無しさん:2009/04/29(水) 12:59:21
もれ追加
excel4macroで記述されないように設定することができるかについては
折れにはできなかったとしか答えられません。
おそらく、復活したので、これが優先されるようになっていると考えています。


870 :デフォルトの名無しさん:2009/04/29(水) 15:06:19
OS:WindowsXP Pro
バージョン:Excel 2000

作成したデータをテキストに出力するVBAを組んでいますが、保存名のところでつまづいています。
ネットで調べると、保存ダイアログを表示させて保存する方法が載っていたのですが
A1のデータ + ".txt" という具合に保存名が決まっているので、ダイアログを表示せずに保存ができると思い

cnsFILENAME = A1 & ".txt"

上記のように指定しましたが、定数を入れなければならないのでエラーを吐いてしまいます。
うまいこと保存名をどこかのセルから取得する方法はないでしょうか?

871 :デフォルトの名無しさん:2009/04/29(水) 15:32:42
BASICなんだから Open して Write# か Print# して Close するのが基本でしょう?
なにやってんの?

872 :デフォルトの名無しさん:2009/04/29(水) 17:32:52
>>871
今どきこんなのやらねーな

873 :デフォルトの名無しさん:2009/04/29(水) 19:46:42
cnsFILENAME = A1 & ".txt"
ActiveWorkbook.SaveAs Filename:=consFILENAME,FileFormat:=xlCurrentPlatformText

FileFormatが無くても保存できそうなんだけど

874 :デフォルトの名無しさん:2009/04/29(水) 19:55:10
cnsFILENAME = range("A1").value & ".txt"
ActiveWorkbook.SaveAs Filename:=cnsFILENAME,FileFormat:=xlCurrentPlatformText

ちょっとだけ修正

875 :デフォルトの名無しさん:2009/04/29(水) 20:15:49
cnsって何だよ

876 :864:2009/04/29(水) 20:32:18
>>868
記録マクロは下のようコードだけど、これって化石マクロ?
メソッドじゃなくオブジェクトになっちゃってるみたいね。

' Macro1 Macro
'

'
  ActiveWorkbook.Worksheets("Sheet2").Sort.SortFields.Clear
  ActiveWorkbook.Worksheets("Sheet2").Sort.SortFields.Add Key:=Range("A2:A6"), _
    SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
  With ActiveWorkbook.Worksheets("Sheet2").Sort
    .SetRange Range("A1:B6")
    .Header = xlYes
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
  End With

877 :デフォルトの名無しさん:2009/04/29(水) 20:47:06
>>875
定数ってことじゃない

878 :デフォルトの名無しさん:2009/04/29(水) 21:48:10
>>867
ありがとうございます。
試してみます。

879 :デフォルトの名無しさん:2009/04/29(水) 22:19:11
>>877
その予測は誰でも最初によぎるが、定数として使われてるのではなく
A1セルの内容によって変動する変数として使われてるから聞いているのでは?


880 :デフォルトの名無しさん:2009/04/29(水) 22:55:30
じゃあ
チェンジ ネーム スンゲー の略

881 :868:2009/04/29(水) 23:32:29
>>864
全く、普通のマクロですw
見慣れないのはどこでしょうかと訊く気もしませんので、退散します。


882 :デフォルトの名無しさん:2009/04/29(水) 23:54:12
VBAを学び始めたきっかけは、何ですか?

883 :デフォルトの名無しさん:2009/04/30(木) 00:12:25
モテるから

884 :870:2009/04/30(木) 02:17:52
>>874
レスが遅くなりましたが、ありがとうございました。

885 :デフォルトの名無しさん:2009/04/30(木) 11:54:45
>>879
そんな屁理屈聞いてんじゃねえんだよ

886 :861:2009/04/30(木) 12:04:06
>>862
>>863
ありがとうございます。

Intersectで出来たんですね、勉強になりました。

887 :デフォルトの名無しさん:2009/04/30(木) 12:15:50
>>885
どうしたの?

888 :デフォルトの名無しさん:2009/04/30(木) 12:38:57
>>887
馬鹿にかまうな。

889 :デフォルトの名無しさん:2009/04/30(木) 12:59:32
>>888
On Error Resume Next

890 :デフォルトの名無しさん:2009/04/30(木) 23:42:42
質問です。

Dim wSheet As Worksheetと宣言し、
最終的にはこのwSheetに


891 :デフォルトの名無しさん:2009/04/30(木) 23:47:25
ミスりました。。。

Dim wSheet As Worksheetと宣言し、
最終的にはこのwSheetに
「Workbook("test01.xls").Worksheet("test02")」と入力しようとしてます。

ただ、「01」「02」の部分はstring型の変数に入っているので、
Set wSheet = "Workbook(" & """" & "test" & num1 & ".xls" & """" & ").Worksheet(" & """" & "test" & num2 & """" & ")"
と書いています。

これではエラーが出てしまい、何がいけないのか分かりません。
上記のように、途中変数等をはさんでシート名をWorksheet型の変数に入れるにはどうしたらよいのでしょう?

892 :デフォルトの名無しさん:2009/05/01(金) 00:10:26
文字列を代入したいのなら型はString
Worksheetはオブジェクトなので文字列は代入出来ない。
コレクションのIndexには要素のNameを示す文字列を使用出来るので以下の表記が正解

Set wSheet = Workbooks("test" & num1 & ".xls" ).Worksheets("test" & num2)

893 :デフォルトの名無しさん:2009/05/01(金) 08:49:15
>>892
ありがとうございます!
意味も分かりやすく助かりました!

894 :デフォルトの名無しさん:2009/05/01(金) 18:20:02
Sub 四則演算()
a = 10
a = a ^ a

MsgBox a, Title:="10の二乗は?"

End Sub

1時間前から勉強し始めたのですが、
答えが100になりません。
どこが間違ってますか?

895 :デフォルトの名無しさん:2009/05/01(金) 18:31:07
>>894 こうかな?

Sub 四則演算()
a = 10
b = a ^ a

MsgBox b, Title:=a & "の" & a & "乗は?"

End Sub

896 :デフォルトの名無しさん:2009/05/01(金) 18:34:58
aが10なんだから
a = a ^ a
は10の10乗だろ

aの二乗なら
a = a ^ 2

VBA以前に中学校数学の問題


因みに冪乗は四則演算じゃないからね
加減乗除の4つが四則で、冪乗(10の3乗=1000 とか)、冪根(9の平方根=3 とか)は含まれない

897 :デフォルトの名無しさん:2009/05/01(金) 18:42:37
>>895-896
どうもありがとう。

898 :デフォルトの名無しさん:2009/05/01(金) 18:46:20
OSがMacOSX、Office2004なのですがアドバイスをいただきたいと思い質問させていただきました

VBAを利用してEXCELのセルA1などに本日の株価を表示させたいと思っているのですが
ソースを取り込む方法がわからないでいい方法がないか探しているのですがなかなか見つかりません

http://stocks.finance.yahoo.co.jp/stocks/detail/?code=6501
からソースを取り込み
正規表現でマッチングしていけば 本日の現在値である345をえることができると思っているのですが
VBAのハイパーリンクの機能などを使ってソースを取り込むいい方法はないでしょうか?
OSがマックということもありVBAの基本的な機能は使用できるのですがIE周りの機能が使えないのですが可能でしょうか?
スレ違いかもしれませんがWindows2000+Office2000だとこうすればIE使わないで可能だよなど
アドバイスがありましたらよろしくお願いいたします

899 :デフォルトの名無しさん:2009/05/01(金) 19:02:05
>>898
Webクエリ

上記では出来ることがかなり限られてくるが
それ以上のことがしたい場合はスレ違いになるのでよろしく>>1★3

900 :デフォルトの名無しさん:2009/05/01(金) 19:12:35
http://table.yahoo.co.jp/t?s=6501.T&g=d

こちらのページをエクセルで直接開いて、日付で検索するのはどうよ

901 :デフォルトの名無しさん:2009/05/01(金) 21:04:21
教えてください
スクロールボタンを直接シートに貼ろうとしてもできません
エクセル2002で
表示-ツールバー-コントロールツールボックス-デザインモード
ここまではできたのですが選択後ドラッグできません
なんか設定があるのでしょうか


902 :デフォルトの名無しさん:2009/05/01(金) 23:14:38
>>901
他のボタンとかは貼り付いた?

903 :デフォルトの名無しさん:2009/05/01(金) 23:58:25
>>902
全部だめ
やり方はopenofficeでいけたのであってると思います
色変わるのかないけるとき

904 :デフォルトの名無しさん:2009/05/02(土) 00:22:31
>>903
寝言は寝て言え。
OpenOfficeでできたから、Microsoft Excelでもできるって
どんな脳内理論だよ。

905 :902:2009/05/02(土) 00:28:08
ドラッグ&ドロップじゃなくて、選択してドラッグ

もれのExce97だとね

906 :デフォルトの名無しさん:2009/05/02(土) 01:06:59
いや普通にマニュアル通りでopenのほうは
できたってことだよ


907 :デフォルトの名無しさん:2009/05/02(土) 07:57:10
>>898
スレ違いなので詳しく説明しないけど,VBAじゃなくてAutomatorでできるよ。

908 :デフォルトの名無しさん:2009/05/02(土) 20:29:15
質問です、お願いします。
VBAを使って あるサイトにいって”自動ログイン”って可能ですか??
詳しい方おしえてください。おねがいします。

909 :デフォルトの名無しさん:2009/05/02(土) 20:32:53
余程特殊なログイン方法でない限り可能です。
スレ違いなので具体的な方法の説明は伏せますが>>1★3,4

910 :デフォルトの名無しさん:2009/05/02(土) 20:36:55
>>909
ありがとうございました。

911 :デフォルトの名無しさん:2009/05/02(土) 21:16:59
このスレのユーザーの方でMSのVBA資格受けた人いますか?
自分は昨日からVBA勉強し始めたのですが、腕試しに受験しようかなと思ってます。
良かったら受験記お願いします。

912 :デフォルトの名無しさん:2009/05/02(土) 21:20:30
昨日から勉強となると、流石に厳しいかもなぁ・・・。
他言語やってても、試験の内容のレベルまで到達するのに半年近くかかったよ・・・。

913 :デフォルトの名無しさん:2009/05/02(土) 23:03:44
ttp://namidame.2ch.net/test/read.cgi/lic/1170877742/
VBA Standard(古い方)はそんなに難しくなかったよ。
基本情報でCをかじったレベルから30時間程度で取れたよ

914 :デフォルトの名無しさん:2009/05/02(土) 23:07:59
それはレベルが低すぎないか?

915 :デフォルトの名無しさん:2009/05/03(日) 04:50:06
「やさしくわかる Excel VBAプログラミング 第3版」

今、読了。
自分は飽きっぽいので、興味が冷めないうち、
GWの間に更に完成度を高めたい。

916 :デフォルトの名無しさん:2009/05/04(月) 12:28:40
>>915
がんばれ

917 :デフォルトの名無しさん:2009/05/04(月) 12:45:51
VBAエキスパートなんて資格があるのか
なんかExcelとAccessだけみたいだけど

資格はどうでもいいんだけど、教える時の体系だったあんちょこを探してたのでこれは役立つ、のかな?

918 :デフォルトの名無しさん:2009/05/04(月) 17:31:04
WinXP,Office2003を使用しております。
元々あったエクセルのファイルを使いやすいものにしようと思い
標準モジュールを挿入して
sub A、sub B、function Cの3個の関数を作成し
A、B両方からCを呼び返り値をそれぞれのセルに代入すると言うVBAを作成しました。
ただオリジナルをいきなりいじるのは怖かったのでバックアップを弄るようにしました。
問題なくバックアップの方でマクロの実行ができましたので
オリジナルの方に移植しようと
標準モジュールを挿入してコードをコピをしてマクロの事項をしてみたところ
function Cで
「コンパイルエラー:ユーザー定義型は定義されていません」とエラーが出るようになってしまいました。
これを解決するいい方法はないでしょうか?

919 :デフォルトの名無しさん:2009/05/04(月) 17:49:06
参照し忘れている予感

920 :デフォルトの名無しさん:2009/05/04(月) 17:54:48
おおお
本当だ、、、、、

参照ってエクセル自体じゃなくてファイル毎に設定されてるんですね
勉強になりました
2時間ぐらいなんでだろと悩んでたもやもやが消えました!

921 :デフォルトの名無しさん:2009/05/04(月) 18:48:34
ファイルっつーよりWorkbookみたいな?

922 :デフォルトの名無しさん:2009/05/06(水) 00:24:35
Sub speakmsg()
Dim strSpeech As String
Application.Speech.speak "Hello !"
strSpeach = "Excel VBA World !"
Application.Speech.speak strSpeach

End Sub

で、” ” に、ひらがなを入れると喋ってくれないのですが、方法はありませんか?

923 :デフォルトの名無しさん:2009/05/06(水) 01:30:41
日本語対応の読み上げソフトインストールする

924 :デフォルトの名無しさん:2009/05/06(水) 05:16:28
XPならコントロールパネルの音声認識の
音声合成の音声の選択を
けんじかなおこにしないと駄目
みたいよ

925 :デフォルトの名無しさん:2009/05/06(水) 21:11:57
VBA初心者ですが、宜しくお願いします。
ver:Office 2000

新しいパスワードをつけるマクロを実行すると「実行時エラー438
オブジェクトは、このプロパティまたはメソッドをサポートしていません」となります。

ソースはここです↓
ActiveWorkbook.Password = "TEST"

ほかの端末(office2003)では実行できるのに何故でしょうか

926 :デフォルトの名無しさん:2009/05/06(水) 22:03:59
PasswordというメソッドがOffice2000では使用できないからじゃないの?

927 :デフォルトの名無しさん:2009/05/07(木) 00:08:19
>>926
ありがとうございます。
解決しました。
ActiveWorkbook.SaveAs Filename:=myFilename, Password:="TEST"
にしました。

928 :デフォルトの名無しさん:2009/05/07(木) 03:41:17
'ROUND2 関数
'数値を四捨五入して指定した有効桁数にします。
'書式 ROUND2(数値, 有効数字の桁数)
'数値      四捨五入の対象となる数値を指定します。
'有効数字の桁数 数値を四捨五入した結果の有効数字の桁数を指定します。
Function ROUND2(aa, nn) '数値を任意の有効桁数に四捨五入する
ActiveSheet.ActiveCell.NumberFormatLocal = "0.000"
ROUND2 = Application.Round(aa, -Int(Application.Log(Abs(aa))) - 1 + nn)
End Function

有効数字に四捨五入する前に、セルの書式を変えたいのですが、
計算させてみると#VALUE!となります。
どういう風に書けばよいのでしょうか?



929 :デフォルトの名無しさん:2009/05/07(木) 06:08:22
>>928
念のために聞くけど、例えば3.14の有効桁数はいくつだと考えている?

930 :デフォルトの名無しさん:2009/05/07(木) 07:08:06
有効桁数ってなんでしゅか?

931 :デフォルトの名無しさん:2009/05/07(木) 08:40:39
>>929
小数点以下2桁なので2

932 :デフォルトの名無しさん:2009/05/07(木) 08:56:47
>>928
ワークシート関数Round()との違いは何?

933 :デフォルトの名無しさん:2009/05/07(木) 09:51:40
>>929
3桁です。

>>932
ワークシート関数ROUND()は
=ROUND(0.105,2) → 0.11
=ROUND(0.0955,2) → 0.1
=ROUND(9.55,2) → 9.95
となるのに対して、
=ROUND2(0.105,2) → 0.11
=ROUND2(0.0955,2) → 0.096
=ROUND2(9.55,2) → 9.6
と有効桁数を揃えることができます。
ただ、
=ROUND2(9.55,4) → 9.550
のはずが、末尾の0が表示されないので9.55になります。
セルの書式を弄れば良いのではと思い、試しに小数以下第3位まで表示するため、
ActiveSheet.ActiveCell.NumberFormatLocal = "0.000"
としました。



934 :デフォルトの名無しさん:2009/05/07(木) 13:40:47
>>928
ユーザー定義関数からセルの書式を変えることはできない。
どうしても表示桁数を変えたいなら文字列にするしかない。

935 :デフォルトの名無しさん:2009/05/07(木) 14:24:57
ユーザー定義関数の中で使用できないメソッドを使ったから#Value!エラーが出た。
そういうこと。

936 :デフォルトの名無しさん:2009/05/07(木) 17:57:21
ActiveSheet.ActiveCell.NumberFormatLocal = "0.000"

Application.ActiveCell.NumberFormatLocal = "0.000"
または、ActiveCell.NumberFormatLocal = "0.000"

937 :デフォルトの名無しさん:2009/05/07(木) 19:19:32
>>933
指数表示にすれば解決。
ていうかそれ以外の解決方法はない。

938 :デフォルトの名無しさん:2009/05/07(木) 20:56:56

教えてください。

ActiveSheet.Range("a3:c7").Rows(5).Interior.ColorIndex = 3

5行目だけじゃなくて、5行目から10行目まで,塗りつぶすにはどう書いたら良いですか?

939 :デフォルトの名無しさん:2009/05/07(木) 21:18:21
>>938
Resize

940 :デフォルトの名無しさん:2009/05/07(木) 21:23:33
range(rows(5),rows(10))
で良いのでは?

941 :デフォルトの名無しさん:2009/05/07(木) 21:50:18
>>939-940
ありがとうございます。
小出しにして申し訳ないのですが、
A列からC列の5行目から10行目だけを塗るつぶすには、どう書けばいいですか?

942 :デフォルトの名無しさん:2009/05/07(木) 21:56:48
ActiveSheet.Range("a3:c10").Range("a5:c9").Interior.ColorIndex = 3

すいません,できました。
↑でいいんですよね?

943 :デフォルトの名無しさん:2009/05/07(木) 22:05:08
Range("a3:c10") は何のためにあるの?
ActiveSheet.Range("a5:c9").Interior.ColorIndex = 3 でいい気がする。

944 :デフォルトの名無しさん:2009/05/08(金) 00:16:05
質問です。

i = 1
Do While i < endYline   'endYlineは最終行
  Worksheets("Sheet1").Range(Cells(i, 1), Cells(i, 10)).Copy _
  Destination:=Worlsheets("Sheet2").Cells(i, 1)
  i = i + 1
Loop

上記のようにSheet1からSheet2へ1行ずつ10列分のコピーをしているのですが、
「表示しない」で表示を隠している行までコピーされてしまいます。
表示していない行はコピーしないようにするにはどうしたらよいでしょうか。

よろしくおねがいします。

945 :デフォルトの名無しさん:2009/05/08(金) 00:23:32
>>944
Range( ).EntireRow.Hiddenプロパティで行ごとに表示されているかどうかチェックできるので、
1行ずつ非表示かどうか調べながらコピーする。

946 :944:2009/05/08(金) 00:30:30
>>945
できました!
即レスありがとうございました。

947 :デフォルトの名無しさん:2009/05/08(金) 01:01:42
>>945
すいません,横レスですが、そういうことが分かるようになるまで、どれくらい勉強しましたか?

948 :デフォルトの名無しさん:2009/05/08(金) 01:13:38
同じ経験をして
解決方法を考えて
Hiddenプロパティを見つけて解決し覚える。
若しくは解決するためにネットで調べて方法が書いてあり覚える
とにかく一定期間勉強すると分かるというよりも、問題があるときに調べて覚えるので
調べ方を覚えれば「そういうことが分かる」ようになったと言えるのではないでしょうか。

949 :デフォルトの名無しさん:2009/05/08(金) 01:18:47
>>948
どうもありがとう。
自分は4月から勉強し始めました。
文を読めば、どういう処理をするのか想像できるようになったのですが、
”こういう処理をする文を書け”という問題になると、
どうしたら良いのかがわからない時が多いもので、
勉強の仕方が間違っているのかと思って、お尋ねしてみました。
どうもありがとう。

950 :デフォルトの名無しさん:2009/05/08(金) 01:19:10
>>947
VBAを使うようになって2年ぐらい。
とくに勉強したわけじゃなく
わからない→ぐぐる、の繰り返しで
基本はサンプルのコピペだから
ちっょと難しいプログラムはお手上げ。

951 :933:2009/05/08(金) 01:23:49
勉強不足で申し訳ありませんでした。
ユーザー定義関数からセルの書式を変えることはできないんですね。
次は、文字列でやってみようと思います。
みなさん、本当にありがとうございました。

952 :デフォルトの名無しさん:2009/05/08(金) 07:12:20
Rangeのプロパティ、メソッドを一通り目を通せば意外と使えるものがある。
すぐに役立つかどうかはわからないけどお薦めするよ。

953 :デフォルトの名無しさん:2009/05/09(土) 00:29:57
今から必死に練習すれば野球選手あるいはサッカー選手になれるのか?
と自分に問えば、答えはNOに決まっている。
それなのに、なぜプログラム言語を学べばどこかに採用されるはずだと思っているのだろう?
それなりに何年かその職種で頑張ってきた人たちでさえ、求職に苦労しているのに、
未だ何のキャリアもなく、定職に就いた事も無い自分が採用される可能性など万に一つもないはずなのに。。
こんな事はすぐわかる事なのに、俺みたいに外部とのつきあいが無いと、
助言してくれる人がいないから、なかなか気づけずにただ無駄に時間だけを無駄遣いしてしまう。
やっぱり、俺には肉体労働か単純労働しかないのか?

954 :デフォルトの名無しさん:2009/05/09(土) 01:49:49
質問です。

Application.GetOpenFilenameでExcelファイルを開き、
開いたExcelファイルのどのワークシートに対してマクロ機能を使うかという処理なのですが、
シート名を選択するような方法はないでしょうか?

メッセージボックスで「マクロ機能を使いたいシートをアクティブにして下さい。」のように表示し、
手動でアクティブにした後、コマンドボタンを押したら・・・というのは考えられるのですが。

Excelファイル開く→シート名が一覧で表示される→任意のシート名を選択する
のように一連の動作としたいです。

よろしくお願いします。

955 :デフォルトの名無しさん:2009/05/09(土) 02:54:07
開かれたブックからシート名をすべて取得してユーザーフォーム。
Inputbox に文字でシート名と番号を表示して、番号を入力させるちょっと見た目ショボイ方法でもいいかも。

※左下のタブ表示移動の三角を右クリックするとシートが多いときに出てくるダイアログは Application.Dialogs では出せなかった。

956 :デフォルトの名無しさん:2009/05/09(土) 02:54:10
for each sht in thisWorkbooks.Sheets
debug.print sht.name
next

でシート名を引けるからリストボックスなりにアイテム追加すればいい


957 :デフォルトの名無しさん:2009/05/09(土) 03:10:06
>>955
>>956

レスありがとうございます。
やはりユーザーフォームを使うしかないのですね。
GetOpenFilenameのようにシート選択も標準メソッドとしてあったらよかったのですが・・・

シート名を取得してユーザーフォームに表示する方法で進めてみます。
アドバイスありがとうございました。

958 :デフォルトの名無しさん:2009/05/09(土) 05:26:23
>>953
>未だ何のキャリアもなく、定職に就いた事も無い自分
確かにそうだろうが、好きなら趣味でやれば良い。
好きでもないのに、義務感?でやってるなら、他の事をすれば良い。

959 :デフォルトの名無しさん:2009/05/09(土) 07:55:30
>>953
野球選手やサッカー選手って、0歳から教育してたとしても、
なれるのは更にそのごく一部だよな。
ピアニストやバイオリニスト考えても、子供の内から学んでも、
音大行ける奴はごく少数。更にプロになれるのは更にそのごく一部。

まず、比較対象を間違えてる。

事務系の仕事でサッカー上手かったり、ピアノ弾けたとしても、ちょっとモテル程度。
でも、事務系の仕事でVBAが少しだけでも分かれば、それは仕事面でのプラス。

断言しておくよ。職場にExcelがある仕事で、VBAを覚えておいて損な事は無い。
もしプログラムが苦手で、自分で組むのが得意じゃないとしても問題ない。
プログラマーに依頼するにも知識は必要だからね。

その言語が出来る事、向いてる事、出来ない事。
これを知るだけでも仕事上では役に立つ。
作るのは出来る奴にやらせりゃいいんだよ。


960 :デフォルトの名無しさん:2009/05/09(土) 10:37:36
>>953
経験が無い方が、逆に変な癖とか無いし企業側としては教えやすいっていう場合もありますよ。
生半可な知識持ってるとタチが悪いのも結構あります。

就職活動は行動する前に自己完結せずに行動を起して判断は相手に任せればいいのです。


961 :デフォルトの名無しさん:2009/05/09(土) 12:38:08
>>953
毎日10時間を10年続ければその道のプロになれます
よく阿呆な大人は脳波年を取ると動かなくなると言いますが
あれは嘘です
脳は年齢に関係なくしっかり動きます
ただ自分には無理だと思う人には無理です

962 :デフォルトの名無しさん:2009/05/09(土) 12:52:04
とりあえずスレタイを読み直そうぜ。

963 :デフォルトの名無しさん:2009/05/09(土) 13:38:51
10年続けるのかあ
10年後にVBAが使われてるかどうか…
使われてるだろうなあ。

昔あった2000年問題も「このボロコンピュータがそんな先まで使われてないだろう」って
思い込んでしまったのが原因だし。

964 :デフォルトの名無しさん:2009/05/09(土) 13:48:17
>963
Excel97 がでてからもう10年以上たってるし、
この先も使われるだろうね…

965 :デフォルトの名無しさん:2009/05/09(土) 14:01:39
>>953 です。
昨日、夜中にスレ違いな書き込みしてすみませんでした。
レスしてくれた方々、ありがとうございました。

久しぶりに庭で蛇を見たw

966 :デフォルトの名無しさん:2009/05/09(土) 14:50:28
何度も質問してすみません。

標準モジュールでフォームのPrivate Subプロシージャの真偽を判定したい場合は、
標準モジュールでpublic変数を宣言し、Private Subプロシージャ内でpublic変数に真偽を設定し、
それを標準モジュールで判定するという方法しかないでしょうか?

よろしくお願いします。


967 :デフォルトの名無しさん:2009/05/09(土) 14:50:32
>>965
安定剤飲んで寝とけ。

968 :デフォルトの名無しさん:2009/05/09(土) 16:07:46
>>966
処理の結果を一つだけ別のプロシージャに返したい場合はSubじゃなくてFunctionの方を使うのが普通。
結果が複数ある場合は参照渡しをする。
変数でPublicを使うのはできるだけ避けた方がいい。

そういう話じゃなくて?

969 :デフォルトの名無しさん:2009/05/09(土) 16:25:57
>>968
解りづらい説明で申し訳ありません。

問題としていることは、
・標準モジュールよりUserForm.Showでフォーム画面を開く
・コマンドボタンのクリックイベント「はい」または「いいえ」を押すと、Unload Meをしフォーム画面を閉じる。
・標準モジュールに戻ってきたが、「はい」か「いいえ」のどちらでフォーム画面を閉じたのか解らない

という感じです。
標準モジュール内で値渡しや参照渡し、Functionプロシージャによる戻り値は一通り理解したのですが、
標準モジュールからフォームへ上記を行うにはどうしたらよいのかと・・・

よろしくお願いします。

970 :デフォルトの名無しさん:2009/05/09(土) 18:38:43
例えば
str = msgbox(msg, vbYesNo)
if str = vbYes then
else
end if

ところで、コマンドボタンをクリックした時に、何かアクションさせないのかなあ?

971 :デフォルトの名無しさん:2009/05/09(土) 18:44:01
じゃぁ
どっかのセルに書き込めばOK

972 :デフォルトの名無しさん:2009/05/09(土) 18:50:00
例えば
if UserForm1.ActiveControl.Name = "ComamandButton1" then
elseif UserForm1.ActiveControl.Name = "ComamandButton2" then
end if

973 :デフォルトの名無しさん:2009/05/09(土) 20:07:14
たびたび説明下手ですみません。

上の「はい」「いいえ」はあくまで例でして、実際にやりたいことは

Sub マクロ()
  Call ファイル選択関数()
  Call シート選択関数()
  Call シート内検索関数()
End Sub

のように処理内容ごとに関数をわけてます。
2番目のシート選択関数で、シート名をフォームの
コンボボックス及びコマンドボックスを使って抽出しているのですが、
抽出したシート名を3番目の関数でも使いたいのです。

Public変数を宣言しておいて、
2番目の関数のフォーム内でPublic変数にシート名を代入
3番目の関数でPublic変数名のシートを検索
という感じではとりあえず動きは問題なさそうですが、
Publicはあまり使わないほうがいいのかなと・・・

974 :デフォルトの名無しさん:2009/05/09(土) 20:32:04
だから968が
>変数でPublicを使うのはできるだけ避けた方がいい。
って書いてるやん

まぁ出来るだけって事であって絶対使うなって事ではないし、あんたが作り易い方法で作れば
良いでしょ?


975 :デフォルトの名無しさん:2009/05/09(土) 21:03:43
>>974
そうですね、すみません。

皆さんありがとうございました。

976 :デフォルトの名無しさん:2009/05/09(土) 22:25:32
エクセル2003とXPを使用しています

A1~Q1を右寄せに
A3~Q3を右寄せに
、、、、、、
A49~Q49を右寄せに
としたいと思っているのですが
現状Range(Cells(1 + i*2, 1), Cells(1 + i*2, 19)).HorizontalAlignment = xlRight
をforでくくって複数回実行しているのですが

マウスで操作するように
A1~Q1、A3~Q3、、、、A49~Q49をまず選択して
HorizontalAlignment = xlRightを1回実行すれば49まで一気に右寄せにできるいい方法はないでしょうか?


977 :デフォルトの名無しさん:2009/05/09(土) 22:31:57
>>976
ループではRangeに渡す文字列を作るだけにして、ループを抜けてから
Rstr = "A1:Q1,A3:Q3,A5:Q5, … ,A49:Q49"
Range(Rstr).HorizontalAlignment = xlRight

978 :デフォルトの名無しさん:2009/05/09(土) 22:55:51
>>977
サンクス
そうか文字列足せばいいんだ
無事1回の実行でやりたいことができました

今までは実行したら右寄せが終わるまで砂時計が出ててカクカクしてたのがなくなりました

979 :デフォルトの名無しさん:2009/05/09(土) 22:58:06
>>977
それだと全部文字列書かないといけないジャン!

>>976
マクロ登録で複数選択して右寄せってやってみそ!

980 :デフォルトの名無しさん:2009/05/09(土) 23:21:34
>>978
どうしても一発出来ないような処理の場合
ScreenUpdatingでカクカクは見えなくできるよ

981 :デフォルトの名無しさん:2009/05/09(土) 23:29:00
range("A1:Q1")の範囲を拡張して
range("A1:Z1")に範囲を拡張したいと思ってるのですが
始点は変更せずに終点だけを変更するものって用意されているのでしょうか

>>979
マクロも便利ですね
こっちの方もちょっと勉強してみようと思います


982 :デフォルトの名無しさん:2009/05/09(土) 23:41:55
ちょっと違うが
Set extRange = Union(Range("A1:Q1"), Range("R1:Z1"))

983 :デフォルトの名無しさん:2009/05/09(土) 23:46:46
>>981
A1を起点として変動する最終列のセルを求めるなら

LastC = Cells(1, 256).End(xlToLeft).Column

984 :デフォルトの名無しさん:2009/05/09(土) 23:49:37
↑訂正
×最終列のセルを求めるなら
○最終列番を求めるなら

985 :デフォルトの名無しさん:2009/05/10(日) 00:08:08
>>981
「拡張」の意味がよくわからんが。
始点が変わらないなら Range("A1:Q1").Range("A1:Z1") みたいに書けば
最初のRangeの範囲の左上をA1とみなした相対的なサイズを指定したことになる。

986 :デフォルトの名無しさん:2009/05/10(日) 00:30:30
>>976
単に奇数行を右寄せしたいだけなら
Sub Test2()
Dim bRow As Byte
Dim bCol As Byte
Dim bLastRow As Byte
Dim bLastCol As Byte

With ActiveCell.CurrentRegion
bLastRow = .Rows.Count
bLastCol = .Columns.Count

For bRow = 1 To bLastRow
If bRow Mod 2 <> 0 Then
For bCol = 1 To bLastCol
.Cells(bRow, bCol).HorizontalAlignment = xlRight
Next bCol
End If
Next bRow
End With
End Sub
じゃだめ?


987 :デフォルトの名無しさん:2009/05/10(日) 00:31:18
>>986
長すぎ。それから質問をよく読め

988 :デフォルトの名無しさん:2009/05/10(日) 00:32:17
インデントが無効になった・・・orz
見づら過ぎてすまん

989 :デフォルトの名無しさん:2009/05/10(日) 00:35:04
>>977のレスをちゃんとプログラムに起こすとこうなるかな。
Dim Rstr As String
Rstr = "A1:Q1"
For i = 3 To 49 Step 2
  Rstr = Rstr + ",A" & i & ":Q" & i
Next
Range(Rstr).HorizontalAlignment = xlRight

990 :デフォルトの名無しさん:2009/05/10(日) 00:47:12
そんな汎用性のないコードを書いちゃいかんよ。
Rangeで扱える文字数をオーバーしたらどうすんだよ。
試しに49を70にしてみなよ。

991 :デフォルトの名無しさん:2009/05/10(日) 00:54:35
誰か汎用性のあるサブルーチンを要求する質問なんてしてたっけ?

992 :デフォルトの名無しさん:2009/05/10(日) 00:57:03
代案のコードも示さずに文句だけ言うやつなんか無視しとけ
何の役にも立たんどころか質問スレにとっては単なる荒らしと変わらん

993 :デフォルトの名無しさん:2009/05/10(日) 01:25:00
xlRight だが xlHAlignRight とは違うの?

994 :デフォルトの名無しさん:2009/05/10(日) 02:00:00
なんで馬鹿は自分の馬鹿を認めないのかね。
普通にループすりゃいいだけだろうがよ。
いっぺんにやろうとするのに無理があるんだよ。

995 :デフォルトの名無しさん:2009/05/10(日) 02:02:09
>>992
おまえこそ役にたたねーよ。
>>998がダメなのが分らないならVBAなんてやめるんだな。

996 :デフォルトの名無しさん:2009/05/10(日) 02:07:24
xlHAlignRightだよなあ
でも内部コードは同じだからxlRightでも同じ結果になるんだよなあ
なんでコンパイル通っちゃうんだろう

997 :デフォルトの名無しさん:2009/05/10(日) 02:08:51
ふだん、「その関数は遅いから論外」「こっちの関数のが100ミリ秒速い」とか言ってる
ベンチマーク狂の人に素晴らしい回答をお願いしたいところ

998 :デフォルトの名無しさん:2009/05/10(日) 02:11:10
>>997
速いとか遅いとかじゃねーっだよヴォケ。
確実に動くことが大事なのが分らんの?
ヴァカにはわからんだろうね。



999 :デフォルトの名無しさん:2009/05/10(日) 02:16:43
分るわけねーよ。2chなんだからw
質問者の言うことをなんでも聞けばいいと思ってるんだろう。
ループの方が確実と教えるだけの能力がないんだよ。

1000 :デフォルトの名無しさん:2009/05/10(日) 02:17:41
Excel VBA質問スレ Part11
http://pc12.2ch.net/test/read.cgi/tech/1241885130/

1001 :1001:Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。

264 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)