Excel VBA質問スレ Part6 at TECH
[2ch|▼Menu]
1:デフォルトの名無しさん
08/03/11 19:31:39
ExcelのVBAに関する質問スレです

質問前に 【 >>2-3 】 あたりを良く読むこと

前スレ
スレリンク(tech板)

★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 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み
   コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。
   ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。

2: ◆EXCEL8qygs
08/03/11 19:48:40
とりあえず死兆星おいときますね。
              ☆         
          ☆               
                ☆       
                           
             ☆            
                           
               ☆       
                           
               ★☆     
                    ☆     


3:デフォルトの名無しさん
08/03/11 22:09:44
過去スレ
01 スレリンク(tech板)
02 スレリンク(tech板)
03 スレリンク(tech板)
04 スレリンク(tech板)
05 スレリンク(tech板)

4:デフォルトの名無しさん
08/03/12 13:39:54
指定したセル以外の入力を避けたいのですが
Range("C3,E3,D5").Select
Range("D5").Activate
でやると、一応完成するのですが、間違いを消去した時
全てのセルデータまで消えてしまうのですが・・・
どう処理したらいいのでしょう?


質問1っパツ目ではずかしい



5:デフォルトの名無しさん
08/03/12 14:08:31
間違いを消すときに、間違ったセルだけ消せば?

6:デフォルトの名無しさん
08/03/12 14:20:32
>間違ったセルだけ消せば?
これをマクロでしたのです。TEXTBOXを使えば簡単ですけど
あえて使わずして仕上げたいです。

7:デフォルトの名無しさん
08/03/12 14:36:28
・今どういうコードで「間違ったセルを消し」てるのか書け
・TextBoxを使えばどのように簡単になるのか、コードも添えて説明しろ

8:デフォルトの名無しさん
08/03/12 15:22:11
・今どういうコードで「間違ったセルを消し」てるのか書け
ただ、DELETEしてるだけ。
・TextBoxを使えばどのように簡単になるのか、コードも添えて説明しろ
TextBox プロパティで順番つけてるだけだよ。




9:デフォルトの名無しさん
08/03/12 15:35:04
「コード書け」の意味が理解できないのか?

10:デフォルトの名無しさん
08/03/12 16:28:07
Range("C3,E3,D5").Select
Range("D5").Activate
だけでコード書いてないよ。
TextBoxなら

cells(1,1)=textbox1
cells(1,4)=textbox2
cells(2,1)=textbox1
って所かな?あえて書けば・・・





11:デフォルトの名無しさん
08/03/12 16:41:27
>>10
だーかーらー、

>>6
>>間違ったセルだけ消せば?
>これをマクロでしたのです。
これのコードを書けって言ってるの。

>って所かな?あえて書けば・・・
何がどう簡単になったか説明しろって書いただろ?

>>4
>指定したセル以外の入力を避けたい
これの意味が曖昧だから、ちゃんと説明しろってこった。

12:エスパー君登場
08/03/12 16:45:00
つ「シート保護」

13:デフォルトの名無しさん
08/03/12 17:22:49
セルc3の次にセルe3へ入力その後セルd5へ入力またセルc3へ戻る
とエンターキーを押すごとにセルの移動が行われる様にしたい(繰り返し)
これは、例えば、
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Range("C3,E3,D5").Select
Range("D5").Activate
End Sub
で可能。でも、E3に入ったデータのみ修正したい場合C3、D5も消えちゃう
これでは、使い物にならい。

コントロールを使用した場合プロパティで順列の設定を指定しまうので
いちいちコードを書かなくていいから簡単ってこと。
textbox1の次にtextbox2へってENTER押せば設定した順の勝手にカーソル
うごくでしょ。cells(1,3)=textbox1
cells(3,5)=textbox2
とか書けば指定したセルにしか入力されないでしょ?
それを、使わないで、セルc3の次にセルe3へ入力その後セルd5へ入力またセルc3へ戻る
とエンターキーを押すごとにセルの移動が行われる様にしたい(繰り返し)
わかってくれた?

14:デフォルトの名無しさん
08/03/12 17:43:05
情報小出しは以後ヌルー

15:デフォルトの名無しさん
08/03/12 17:43:28
マクロで消してないじゃん・・・

16:デフォルトの名無しさん
08/03/13 08:57:37
Private Sub Worksheet_Change(ByVal Target As Range)
Select Case Target.Address
Case "$C$3"
Range("$E$3").Activate
Case "$E$3"
Range("$D$5").Activate
Case "$D$5"
Range("$C$3").Activate
End Select
End Sub

質問がアレすぎるけどな、こういうことか??
シートへの入力も消去もキー入力ということなら。

17:デフォルトの名無しさん
08/03/13 11:53:09

For Each myWS In Worksheets
If myWS.name =sh_name Then (シートが存在している処理)
Next myWS

でシートの存在を調べているのですが、グラフのみがあるシートが引っ掛かりません。
どう書けばよいでしょうか?

18:10
08/03/13 12:19:51
16さん ありがとう。これがしたっかです。
日本語がわるいのかぁ・・・
反省します。



19:デフォルトの名無しさん
08/03/13 18:47:58
>>17
ワークシートを調べる →Worksheets
グラフシートを調べる → Charts
ワークシート、グラフシート両方調べる → Sheets

20:デフォルトの名無しさん
08/03/14 09:21:57
関数を組みたいのですが、
文字列"1","2","3","振1","振2","振3”,"休1","休2","休3"のどれかをセルに入力したのち
それぞれを数字6500, 6600, 6700,,,, と処理していき最後は関数SUM()で合計値をだしていきたいのです

どういった関数でできるのでしょうか?
例でもあるとうれしいのですが、どなたか分かりますでしょうか?

1,1,1,1,1,0,0, ここに6500x5の合計値
2,2,2,2,2,0,0 ここに6600x5の合計値
振3,3,3,3,3,0 ここに6700x4と7000の合計値

といった具合にセルに入力されています

21:デフォルトの名無しさん
08/03/14 10:08:44
>>20
それワークシート関数(なんたらLookupとか)で実現できるけど、マクロでやりたいの?

22:デフォルトの名無しさん
08/03/14 10:18:52
>>21
マクロと関数の違いを理解していないのですが、
実現できれば問題ないです。

23:デフォルトの名無しさん
08/03/14 10:47:07
IF 1 ELSE 6500
IF 2 ELSE 6600
...
といった感じの関数を組んでいくのでしょうか?

もしくは文字列を数字に変換にする関数でもあるのでしょうか?

24:デフォルトの名無しさん
08/03/14 11:36:39
ワークシート関数でいいなら、シートのどこかに
1 6500
2 6600
3 6700

という表を作って、合計するセルに
=VLOOKUP(A1,$G3:$H11,2)+VLOOKUP(B1,$G3:$H11,2)+・・・
とかすればいい。
A1, B1, …はデータのセル、$G3$H11は上の表のセル範囲。

25:デフォルトの名無しさん
08/03/14 16:04:16
スレがVBAなので、VBAで解決してみよう
なお、>>24のほうが正解だと思われる。

値を入れたいエクセルを開いて、ツール→マクロ→VisualBasicEditor
(たぶん)左上あたりのプロジェクト枠のなかで、
右クリック→挿入→標準モジュール
module1ができるはずなので、 下記を貼付

Public Function MojiChange(moji As String) As Integer
Select Case moji
Case "1": MojiChange = 6500
Case "2": MojiChange = 6600
Case "3": MojiChange = 6700
Case "振1": MojiChange = 6800
Case "振2": MojiChange = 6900
Case "振3": MojiChange = 7000
Case "休1": MojiChange = 7100
Case "休2": MojiChange = 7200
Case "休3": MojiChange = 7300
Case Else: MojiChange = 0
End Select
End Function

ファイル→保存して終了を選ぶ

今度はエクセル側で、 たとえばA1に「1」を入れる。
A2に「=MojiChange(A1)」といれる。
するとA2には6500と入っている。


26:デフォルトの名無しさん
08/03/14 18:27:13
一つのセルの中に複数の値がスペース区切りで並べて書いてあるのですが
これを上手く取得する方法はないでしょうか?

27:デフォルトの名無しさん
08/03/14 19:22:52
>>26
つsplit関数

28:デフォルトの名無しさん
08/03/14 19:22:58
split

29:デフォルトの名無しさん
08/03/14 22:12:01
>>24
lookup()じゃなくて、vlookup()を使う理由は?
# 昼間lookup()版を書き込もうとしたらアクセス制限されてた(:;

30:デフォルトの名無しさん
08/03/14 23:17:45
vlookupのほうが有名だからだろ。

31:デフォルトの名無しさん
08/03/15 00:54:07
無印lookupはいらない子

32:デフォルトの名無しさん
08/03/15 01:52:35
このスレの住人なら知っていますね、あの糞開発ツールのことを

・自分のプログラムのバグなのかコンパイラのバグなのかわからない
・他の仕事に応用できない糞開発ツールの独自世界を必死に学習している
・テキストエディタで書いたほうが効率的なのに糞UIツールを懸命に使っている

糞だけど、政治的な理由で無理やり使わされているんですよね
もういい加減、我慢するのはやめませんか?

・糞開発ツールを部下に押し付ける上司の命令は無視しましょう。
 上司は糞開発ツールが使われる実績を作ることであの会社のごきげんをとっているのです。
・あの糞開発ツール提供会社には「糞開発ツールは話にならない」と突き放しましょう。
 バグレポートなどしてはいけません。改善要求などもってのほかです。
 あの会社はあなたたちのことをテスター/モルモットとしか思っていません。
・あの会議で「糞開発ツールを使ったら生産性がxx%アップしました」
 なんて話が出たら力強く机を叩き、会議室を出ましょう。
 あの人たちは糞開発ツールをマンセーすることで立場を確保しているのです。

糞な開発ツールを糞だと言える、そんな当たり前の環境をみんなの力で取り戻しましょう。

33:デフォルトの名無しさん
08/03/15 01:57:49
そんなものを使っている会社を辞めないお前も不思議な人間だ。

34:デフォルトの名無しさん
08/03/15 19:21:33
VBAスレなのに、関数で答えを返す謎なスレ。
簡単に関数で解決できても、小難しくVBA自作関数で返してやるのがこのスレの醍醐味だろ?

35:デフォルトの名無しさん
08/03/15 21:17:04
誘導

Excel総合相談所 66
スレリンク(bsoft板)

36:デフォルトの名無しさん
08/03/15 23:33:54
良回答認定

37:デフォルトの名無しさん
08/03/16 12:10:16
>>33
コピペにマジレス(´∀`)カコイイ!

38:デフォルトの名無しさん
08/03/17 13:28:51
マクロの登録で、ツール、分析ツール、相関を選択しました。
マクロが作成されましたが、いざ実行してみると〜.XLAファイルが見つかりませんとエラーがでます。
どうすればよいでしょうか?

39:デフォルトの名無しさん
08/03/17 15:35:24
マクロをメニューバーに追加したんですが、グラフ選択時に追加したのが消えてしまいます。
アクティブなグラフに変更を加えるマクロだったので正直使えません、グラフ選択時に消えなくする方法を教えて下さいm(__)m
長文失礼しました

40:デフォルトの名無しさん
08/03/17 21:36:12
Excel向けの月例パッチにバグ、マクロ実行時の計算に誤り
URLリンク(www.computerworld.jp)

この記事の内容が理解できないのだが
誰かわかりやすく説明してください。゜(ノД`)゜。

41:デフォルトの名無しさん
08/03/17 21:38:39
                【ヲタの一日】
    彡川三三三ミ      9:00 起床
   川出 ::::::⌒ ⌒ヽ      9:05〜9:20 朝食(昨日の残り物)
  出川::::::::ー◎-◎-)     9:25〜12:25 溜まっていたギャルゲーを消化
 ..川(6|::::::::  ( 。。))     12:30〜13:00 昼食(レトルトカレー)
 出川;;;::∴ ノ  3  ノ     13:05〜16:00 ゲーハー板で妊娠を煽る
   ノ\_;;;;;;;;;;;;;;;;ノ     16:01〜17:00 半角二次元板でエロ同人誌を漁る
  ( *  ヽー--'ヽ )      17:05〜17:55 ゲームをやる
  (∵ ;)  ゚ ノヽ  ゚ ):)  .  18:00〜19:28 アニメを見る
  (: ・ )--―'⌒ー--`,_)    19:30〜19:58 飯を食いながらアニメを見る
  (___)ーニ三三ニ-)     .20:00〜24:00 ゲーム(FF11)
  (∴ ー' ̄⌒ヽωニつ     1:02〜3:12 ゲーム(エロゲー)
   `l ・  . /メ / .     3:14〜3:26 エロ同人誌でオナニー
    ヽ ∵  /~- /.      3:27〜 就寝
    (__)))))_)))))    ※風呂に入るのは一週間に一度だけ

42:デフォルトの名無しさん
08/03/17 21:39:44
 MS08-014によって生じる問題とは、Excelで特定のタイプのマクロが実行されたときに、
Excelが正しい数値ではなくゼロを返すというもの。Excel 2003において、株価や在庫量
などのデータを外部ソースからリアルタイムで取得し、それらをExcelの配列にプラグイン
しているケースで発生する。

43:デフォルトの名無しさん
08/03/17 21:43:48
--
After you install security update MS08-014 on a computer that has Microsoft Office Excel 2003 installed,
array-entered functions that contain a Visual Basic for Applications (VBA) macro that refers to a Real Time Data source return an incorrect value.
The incorrect value is usually 0.
--
どこを説明しろと?

44:デフォルトの名無しさん
08/03/17 21:47:59
>>42

>>データを外部ソースからリアルタイムで取得し、それらをExcelの配列にプラグインしているケース

これってRTD関数を使ってる場合ってこと?
そんでVBA上で配列に格納すると発生するってこと??


45:デフォルトの名無しさん
08/03/17 23:34:29
Offset関数について教えてください。(Xp、オフィス2003)
RANGE("A1").Offset(3,0)としたとき、ターゲットはセルA4をさします。
ただ、A2とA3を結合していた場合、ターゲットはA5になります。
Offset関数は結合を無視することって出来ないんですか?
上の例で言えば、間に結合があろうがなかろうがA1を基準として
下に3セル分移動したA4を指定したいんですが・・・
相対指定はOffsetくらいですよね?

46:デフォルトの名無しさん
08/03/17 23:48:35
>>45
i =1
i = i + 3
RANGE("A" & i)

じゃあだめなのか?
セル値の固定はシートに任せると思ったとおり動かないことがあるので、
モジュール側で指定するようにしてる。
26進数変換モジュールを用意しておくと使い勝手もよくなる。

47:デフォルトの名無しさん
08/03/18 00:12:56
...

48:デフォルトの名無しさん
08/03/18 00:29:57
右行って下行って左行けばぁ?

49:デフォルトの名無しさん
08/03/18 08:24:08
つまり、結合したりしてるシートにOffset関数は使い物にならないということで?

50:デフォルトの名無しさん
08/03/18 09:42:40
Office 2000だと、range("A1").offset(3,0)はA4になるな。
仕様が変更されたのかな。

51:デフォルトの名無しさん
08/03/18 12:22:18
Replaceを使って置換するべき文字列を、変数定義した内容で置換する事は出来ますか?

52:デフォルトの名無しさん
08/03/18 13:14:08
>>51
もっと具体的に

53:デフォルトの名無しさん
08/03/18 18:22:10
>>52
あるExcelのシートの文字列の一部を置換したいとします。その文字列を入力のボックス作成、そこを手入力し、置換出来る様にしたいのです。
例えば"犬"を"猫"としたり、"犬"を"馬"と置換出来る様に組みたいです。
携帯なのでソースは別途見せます。

54:デフォルトの名無しさん
08/03/18 22:11:13
なんかいきなりVBAと謳われる神の言語を使用して
ツールを期限付き(超最短)で作るハメになったんだけど
これって1日半ぐらいあればマスターできますよね?

55:デフォルトの名無しさん
08/03/18 22:13:39
できます

56:デフォルトの名無しさん
08/03/18 22:15:30
>55
ありがとうございます!!

57:デフォルトの名無しさん
08/03/18 23:52:20
VBA初めて半年ぐらいの初心者です
セルに挿入されたコメント(セルの右上に赤い三角のでるやつ)
にかいてある文章を取得することってできるのでしょうか?
自分で色々ヘルプを見てみたところVBAでコメントの文章の設定はできるようなのですが、
取得する方法が分かりません。

具体的に言うと、ある人が仕事に使う表(約40シート、各シートに20×5セルぐらい)を
エクセルに打ち込んだんですが、表の中に何箇所か、セルに値を入れるところを
コメントに入れてしまったんです。

セル内におさまらなかったし、コメントだとカーソルをもっていくと長い文章も表示されて
見やすいからだそうですが、その仕事を引きついた自分はやりにくくてしょうがいないので
コメントの設定されているセルの値にそのままコメントの文章を入れたいのです。

手作業でやると結構時間がかかりそうな量なのです。
マクロの記録で「コメントの編集→コメント文章のコピー→セルに貼り付け」
をやってみたのですが、コメント文章のコピーの部分が記録されていませんでした
分かる方いたらお願いします。

58:デフォルトの名無しさん
08/03/19 00:12:02
range1.comment.text

59:デフォルトの名無しさん
08/03/19 00:23:43
Sub macro()
If Cells(1, 1).NoteText <> "" Then
Cells(1, 1) = Cells(1, 1).NoteText
End If
End Sub


60:デフォルトの名無しさん
08/03/19 00:32:21
さっそくの回答ありがとうございます
>>59さんのnotetextで取得できました・・・
これも試したはずなんですが、今やったら動いたので
なんか別の原因でエラー出てたみたいです
助かりました

>>58
せっかく回答いただいて申し訳ないのですが、うちの環境だと
comment.textはやっぱりエラーになりました
「オブジェクトまたはwithブロックが定義されていません」
とのことです
これも別の原因があるのかな?
ともかくありがとうございます


61:デフォルトの名無しさん
08/03/19 08:47:17
ComboBox1のリストを開いたままCommandButton1をクリックする度に
8行づつ表示したいのですが、難しくて作れません。
誰か助けてちょ。
Dim a As Long
On Error Resume Next
a = 1
If CommandButton14.Click Then
ComboBox1.ListIndex = a
a = a + 1
End If

CommandButton14.Click まずここだめー
そして

ComboBox1のリストが閉じちゃう。

ハイ、ダメェ〜

エンタの見すぎですいません



62:デフォルトの名無しさん
08/03/19 11:58:32
答える気にならんな

63:デフォルトの名無しさん
08/03/19 12:43:54
そこを何とか・・・

64:デフォルトの名無しさん
08/03/19 13:18:02
コンボボックスって、フォーカスを失っても開きっぱなしにすることできるのか?

65:デフォルトの名無しさん
08/03/19 13:25:53
エンタの神様って死ぬほどつまらん
それを真似されちゃぁねぇ
>>64
無理じゃないか・

66:デフォルトの名無しさん
08/03/19 13:54:00
ComboBox1.SetFocus も ComboBox1.Valueでも開かないな



67:デフォルトの名無しさん
08/03/19 14:07:00
ACCESSのフォームとVBAなら
DoCmd.GoToControl "コンボボックス名"
SendKeys "%{down}" , true
で開くけれどな

68:デフォルトの名無しさん
08/03/19 15:46:57
セルをセレクトせずに、仮想セレクトによって、オフセットを使うことは
可能でしょうか。

69:デフォルトの名無しさん
08/03/19 15:59:58
仮想セレクトって何?

70:デフォルトの名無しさん
08/03/19 17:13:30
>>69
Sub ppp()
Dim i As Byte
Dim hoge() As Byte
For i = 1 To 5
ReDim Preserve hoge(i)
Range("A" & i).Select: hoge(i) = Selection.Value
ActiveCell.Offset(0, 1).Value = "済"
Next i
End Sub

offsetを使いたい場合、上みたいにいちいちセレクト
しなくてはいかんのでしょうか・・ということなのですが。
hoge(i) = Range("A" & i).Valueで値をとって、そこから、
オフセットでセル移動をすることは出来ないですか?

71:デフォルトの名無しさん
08/03/19 17:36:36
基本的に、selectは必要ないと思っておいて、さほど間違いではない。

(1)
hoge(i) = Range("A" & i).value
Range("A" & i).Offset(0, 1).Value = "済"

(1')
with range("A" & i)
hoge(i) = .value
.offset(0, 1).value = "済"
end with

(2)
hoge(i) = Range("A" & i).value
Range("A" & i + 1).Value = "済"


72:デフォルトの名無しさん
08/03/19 17:54:41
>>71
あ、そういうことが出来るんですか。
ありがとうございます。早速試します。

73:デフォルトの名無しさん
08/03/19 21:00:41
必要ないというか、値を取得するだけなのに、そのためにセルのSelectやActivateをする
ってのはダメプログラムの良い証拠

74:デフォルトの名無しさん
08/03/20 01:22:17
質問です、行番号を変数redord_lineに取得する
スタート列変数 start
ゴール列変数 end
上記の3つの変数を使って指定したレコード範囲だけ色を変更することは
できるのでしょうか?色は何色でもいいです。

75:デフォルトの名無しさん
08/03/20 01:38:28
できます

76:デフォルトの名無しさん
08/03/20 02:22:59
Range(Cells(Row1,Col1),Cells(Row2,Col2))..Interior.Color = COLORREF

77:デフォルトの名無しさん
08/03/20 11:33:41
すいません、関数の引数にString型の配列を渡しているのですが
型が一致しませんとでてしまします。原因がわからないので教えてください。


Dim hogehoge(999) As String

'関数呼び出し
method(hogehoge)
---------------------------------------------

'関数実体
Function method(hogehoge() As String)

78:デフォルトの名無しさん
08/03/20 12:06:11
あれ?ここって全然ひといない?

79:デフォルトの名無しさん
08/03/20 12:16:15
質問はあげで

80:デフォルトの名無しさん
08/03/20 12:39:16
Function test()

Dim hogehoge(999) As String

'関数呼び出し
Call method(hogehoge)
End Function


Function method(hogehoge() As String)
'関数実体
MsgBox UBound(hogehoge())
'
End Function


81:77
08/03/20 13:20:50
>80
あざーす。
エラーは回避できたんだけどなぜCallをつけると
エラーがでなくなったのかという根本的な原因がよくわからなかったんでありますが
なぜかわかります?データ型の不一致っていうと根本的に
構文の使い方そのものが間違ってるイメージがあるんですが・・

Callステートメントについて少し調べたんだけど
このステートメントの役割は関数の呼び出しを明示的に宣言しているのと
参照渡しと値渡しの使い分けをこっちでしなくて済むってことらしいんですが



82:デフォルトの名無しさん
08/03/20 13:23:59
Dim hogehoge(999) As String

'関数呼び出し
method(hogehoge)
---------------------------------------------

'関数実体
sub method(hogehoge() As String)

83:デフォルトの名無しさん
08/03/20 17:19:36
トリビア
明示的という日本語は存在しない


84:デフォルトの名無しさん
08/03/20 17:33:50
そんなしょうもねぇ揚げ足とるくらいなら糞して寝てろや・・・

85:デフォルトの名無しさん
08/03/20 17:48:37
普通に戻り値だと
strTEXT = method(hogehoge)

実行したいだけだと
call method(hogehoge)

と使ってきたので、なぜと言われても困るなぁ…

86:デフォルトの名無しさん
08/03/20 18:13:15
要は戻り値がないメソッドを呼ぶときは
明示的にCallステートメントをメソッド名の前に付けなくてはならないという
暗黙の了解がVBAにはあるわけだ。あざーす

87:デフォルトの名無しさん
08/03/20 18:15:06
>>83
あるよ

88:デフォルトの名無しさん
08/03/20 18:35:11
言葉は生きてて、時代などを反映して生まれては消える。
広辞苑か何かに追加されてないといけないのか?


89:デフォルトの名無しさん
08/03/20 18:38:11
>>86
VBAは初めて?
普段は何で書いてるの?

90:デフォルトの名無しさん
08/03/20 18:48:11
>89
ヒミツのアッコちゃん

91:デフォルトの名無しさん
08/03/20 18:57:23
ネタだと思ったが
ヒミツのアッコちゃん
っつー言語は本当にあるんだな
織田信長の乗りだな

92:デフォルトの名無しさん
08/03/20 21:32:16
>>76さん
できました、ありがとうございます。

93:デフォルトの名無しさん
08/03/20 22:01:16
method(hogehoge)だとhogehogeに()をつけてからmethodに渡すと解釈するからじゃなくて?
もしそうなら、methodと括弧の間に空白が置かれていると思うし、method hogehogeで呼べるはずってことだけど。

94:デフォルトの名無しさん
08/03/20 23:02:30
日本語でおk

95:デフォルトの名無しさん
08/03/20 23:17:53
日本語だとVBAが走りません

96:デフォルトの名無しさん
08/03/21 02:21:41
メソッド(ほげほげ)

97:デフォルトの名無しさん
08/03/21 05:40:24
漏れは括弧を付けて呼びたいのに
勝手に括弧を消されるのが気に入らない

98:デフォルトの名無しさん
08/03/21 06:04:35
かっこわるい

99:デフォルトの名無しさん
08/03/21 08:32:13 BE:168148962-2BP(380)
valueやformulaはコピ〜されるのですが Numberformat がコピ〜されません
なにが悪いのでしょう?

With oThisSheet
.Rows(p_row + cnt).Value = .Rows(p_eval_row + 1).Value
.Rows(p_row + cnt).FormulaR1C1 = .Rows(p_eval_row + 1).FormulaR1C1
.Rows(p_row + cnt).NumberFormat = .Rows(p_eval_row + 1).NumberFormat
.Rows(p_row + cnt).FormulaR1C1Local = .Rows(p_eval_row + 1).FormulaR1C1Local
.Rows(p_row + cnt).NumberFormatLocal = .Rows(p_eval_row + 1).NumberFormatLocal
End With


100:デフォルトの名無しさん
08/03/21 12:11:13
dim name as string
name=range("a1")
if name=textbox1 then
msgbox("有")
end if

このtextbox1の入力 大文字 小文字でも 認識させたいのですが
どう処理したらいいのでしょか?
例えば range("a1")のデータが a0001 textbox1の入力がA0001
この場合もmsgbox(”有”)と拾ってもらいたいのですが・・・


101:デフォルトの名無しさん
08/03/21 12:14:06
>>100
なんとなく違う回避方法もある気がするが、
StrConv
で、小文字に統一してから比較する

102:デフォルトの名無しさん
08/03/21 12:37:55
StrConv の使い方は フォ-マットですか?
それとも、dim name as StrConv と書くのでしょか?


103:デフォルトの名無しさん
08/03/21 12:47:16
ヘルプ読め

104:デフォルトの名無しさん
08/03/21 13:17:57
>>100
if name=textbox1 then
→If StrComp(name, textbox1, vbTextCompare) = 0 then

ところで、msgboxの()は必要なの?

105:デフォルトの名無しさん
08/03/21 13:18:39
msgbox("変数同士は大文字小文字関係なく比較するのだが、" & vbnewline & _
      "textboxは厳密に判定するのか?")

' 実際にtextboxを配置してみての実験はしていない

106:デフォルトの名無しさん
08/03/21 13:20:41
if lcase(name) = lcase(textbox1.text) then
でいいんじゃあるまいか。

107:デフォルトの名無しさん
08/03/21 14:56:57
100です。皆様ありがと御座います。
本当はmsgbox()のところは、分かりやすく質問させてもらうため
簡単に仮に置いただけです。
本当は FOR EACH と組み合わせて、膨大な数あるデーターの中から
対象データを抜き出したいのです。
今のコードは下記の様に書いてるのですが、
Dim name As String
name = textbox1.text

Dim 範囲, 名前

Set 範囲 = Range("a1:z10000")
For Each 名前 In 範囲
If 名前.Value = name Then
名前.Select
end if
全てがそろってないと拾ってくれず、半分手作業状態で困ってました。
一応、上記コードでやって見ましたが、for each とうまくかみ合いません
再び、ご教授お願いします。

108:デフォルトの名無しさん
08/03/21 15:28:00
最初からやりたいことを書きましょう。

dim 範囲 as range, 名前 as range
set 範囲 = range("a1:z10000")
set 名前 = 範囲.find(textbox1.text, lookat:=xlwhole)
if not 名前 is nothing then
名前.select
end if

109:デフォルトの名無しさん
08/03/21 15:57:09
大文字と小文字全て一致してないと、拾ってくれません。
もうちょっと、いじくってみます。


110:デフォルトの名無しさん
08/03/21 16:33:11
原因が分かりました。
半角の小文字aと全角の小文字aの違いが有ると拾わないみたいです。


111:デフォルトの名無しさん
08/03/21 17:18:17
>>110
StrConv

112:デフォルトの名無しさん
08/03/21 17:23:52
永久ループ

113:デフォルトの名無しさん
08/03/21 18:07:08
トリビア

明示はサ変名詞なので的が付く対象ではない
したがって明示的というのは日本語風の言語使用方法に過ぎない


114:デフォルトの名無しさん
08/03/21 21:14:50
>>113
なぜサ変名詞に的がついてはいけないの?

115:デフォルトの名無しさん
08/03/21 23:06:23
VBAでオラクルのテーブル読めますか?

116:デフォルトの名無しさん
08/03/21 23:57:02
よんだことあるけどしるか!ってかんじ

117:デフォルトの名無しさん
08/03/22 00:37:29
>>115
excelからやると結構面倒
その辺になるとACCESSのほうがいいかも。
ODBC経由でオラクルのテーブルをリンクできるようにしてから、openrecordsetすれば簡単

118:デフォルトの名無しさん
08/03/22 00:43:43
oo4oってもうないんだっけか

119:デフォルトの名無しさん
08/03/22 12:49:32
Oracleに接続するぐらい別に面倒じゃない
VBSからでも使える程度のよくあるケース

120:デフォルトの名無しさん
08/03/22 13:54:20
VBAってさぁ、ソース丸見えなんだけどさ見えなくできないの?

121:デフォルトの名無しさん
08/03/22 14:51:54
パスワードをかければ、カジュアルなプロテクトはできる。
ただし、はずし方もググればすぐにわかるんだけどね・・・

122:デフォルトの名無しさん
08/03/22 15:59:13
当方環境
【OS】WinXP Home
【バージョン】Excel2002

質問させて頂きます。
数あるレコードの中から番号を選択して、内容を反映させたデータ閲覧用フォーム2を表示させています。
画面で見るだけではなくそれを印刷に流用できればと考えましたので、用紙サイズをA4・印刷方向を横に設定する以下の記述を追加しました。

Private Sub CommandButton3_Click()
  UserForm2.PrintForm
  Printer.Orientation = vbPRORLandscape
  Printer.PaperSize = vbPRPSA4
End Sub

実行すると印刷はされるものの、A4縦で印刷されてしまいました。
A4横に設定するには、どのように記述すればよろしいのでしょうか?
ご存知の方いらっしゃいましたら、宜しくご教示お願いします。

123:デフォルトの名無しさん
08/03/22 20:48:45
ググッたらこんな使い方してたみたいだけど?
Forms("フォーム名").Printer.Orientation = acPRORLandscape

それかプリンターの設定で縦になってるから云々とか

124:デフォルトの名無しさん
08/03/23 01:50:42
1ヶ月の超初心者です、教えて下さい。
条件分岐でそれぞれの製品(4製品)が5000以上になったらOKになるようにしたいのですが
どう書けばいいのでしょうか?それぞれの時の書き方が分かりません。D4:F7 は範囲です。
宜しくお願いします。
If Range("d4:f7").Value >= 5000 Then
msgbox"ok"
Selection.Value = "ok"
Else
Selection.Value = "no"


125:デフォルトの名無しさん
08/03/23 02:23:53
質問の内容がよくわからない。4製品?何に対しての?
5000以上っていうのはD4:F7全ての合計なのか
1個1個のセルの値が5000以上なのかなど

126:デフォルトの名無しさん
08/03/23 02:53:39
4製品というのは例えばストーブ、掃除機、時計、テレビで
1個1個のセルの値が5000以上になるものです。合計は全く関係ありません。
4製品の全ての値が5000(円)以上になっているものに対してOKになるようにしたいのですが。
説明が下手ですみません。



127:デフォルトの名無しさん
08/03/23 03:05:48
D4:F7って9セルあるけど?4製品?

128:デフォルトの名無しさん
08/03/23 03:15:07
9セルじゃなくて12セルか

129:デフォルトの名無しさん
08/03/23 03:16:31
すみません。金額の範囲はC4:F7でした。16セルです。

130:デフォルトの名無しさん
08/03/23 03:53:41
これでおk?

'対象のワークシートを変数wkに格納
Set wk = Worksheets("Sheet1")

'対象のワークシートの範囲の開始("C4")から終了("F7")までを変数currentCellにセットしてループ
For Each currentCell In wk.Range("C4:F7")

'対象のセルの値が5000以上だった場合
If currentCell.Value >= 5000 Then
currentCell.Value = "ok"
End If

Next currentCell

131:デフォルトの名無しさん
08/03/23 04:11:38
ご親切にどうもありがとうございました。

132:デフォルトの名無しさん
08/03/24 15:54:55
ちょっとスレ違いかもしれませんが、教えてください。

以下のようにマクロを使わず、セルに入ってるデータをセルの位置として
指定して計算させたいのですが可能でしょうか?

SUM(A1のデータ:A2のデータ)


例えば、以下のようにデータが入力されているとき、

A1のセルに"B1"
A2のセルに"B10"

マクロを使わずSUM(B1:B10)が行われるようにするにはどうすればよいでしょうか?


133:デフォルトの名無しさん
08/03/24 16:14:10
indirect()

134:デフォルトの名無しさん
08/03/24 16:20:33
>>133
おー!ありがとうございます!!

135:デフォルトの名無しさん
08/03/25 23:10:05
Excelを他のプログラムからCreateObjectして操作するときに、
そのEcelのオブジェクトのApplicationからメッセージボックスを
表示するようなことはできますか?Excelにマクロを定義しといて
呼び出すという方法じゃなくて、直接メッセージを表示するような
ことがやりたいです。

136:デフォルトの名無しさん
08/03/26 01:20:08
できる

137:デフォルトの名無しさん
08/03/26 01:29:29
そのためにわざわざExcel使うか?

138:デフォルトの名無しさん
08/03/26 21:19:57
質問です。
VBAの処理のみでAccessに依存することなく、Accessのデータテーブルから
エクセルのシートにデータ内容をExportしたり、エクセルのシートの内容をデータベースに
Importすることはできるのでしょうか?

139:デフォルトの名無しさん
08/03/26 23:03:13
>Accessに依存することなく、Accessのデータテーブルから
???

140:デフォルトの名無しさん
08/03/26 23:20:00
>>136
どのオブジェクトの何というメソッドを使うのか教えていただけないでしょうか。

141:デフォルトの名無しさん
08/03/26 23:59:32
138です。
Accessを使ってシートにデータをExportをしますが、Accessは使わずにVBAの
機能のみでシートにデータを取り込みたいです。

142:デフォルトの名無しさん
08/03/27 00:16:40
excelのvbaだけでは無理

143:デフォルトの名無しさん
08/03/27 00:39:27
質問です。
WindowsXP Excel2000を使っています。
Excel VBAで、画像ファイル(.jpgとか.tifとか)をビューアなどで開かず、
直接印刷する方法を教えてください。
単純に印刷するだけならシェルを使って何とかなったのですが、
用紙サイズや向きの指定をしたく、その方法がまったくわかりません。
よろしくおねがいします

144:デフォルトの名無しさん
08/03/27 07:01:01
>>138 >>141
ADOとかDAOを使えばそんな感じの事はできる
インポート/エクスポートとはちょっと違うけど

145:デフォルトの名無しさん
08/03/27 11:30:02
セルをマウスでセレクトして外側は太い罫線、中は細い罫線をひくというような
共通で使えるVBAを作ったのでエクセルを開くたびに常にそのVBAを読み込みたいです。

現在は***.vbaファイルを保存しておき、そこからxlaファイルにしてそれをアドオンでエクセル起動時に読ませています。
これだとVBAを修正するときは、

新規でエクセルを立ち上げ

VBEで***.vbaを読み込み

編集後別名のxlaファイルに保存(同一ファイルはエクセル起動時に開かれるのでさわれない為)

エクセルを閉じ、作ったxlaファイルを設定しているxlaファイルに置き換え

と面倒な事になっています。※xlaファイルはダイレクトに編集できないようだ
みなさんは作ったVBAをどのように管理していますか?


146:デフォルトの名無しさん
08/03/27 13:17:35
つ個人用マクロブック

147:デフォルトの名無しさん
08/03/27 18:33:14
QueryTables.Add()メソッドで
Connection情報を指定する際に

Jet OLEDB:Engine Type=?

?に対してはどんな値を指定するのが妥当なんでしょうか?


ちなみに↓を見てたのですが全く意味がわかんなかったんです。。
URLリンク(www.microsoft.com)


148:147
08/03/27 20:55:55
ちなみに

OLE DBプロバイダを使用して
あるExcelファイルのシートのデータを
新規シートへコピーするのをやろうとしてます。

149:デフォルトの名無しさん
08/03/27 21:06:00
>>144さん
ADOを調べて
public sub toridasi()
Dim cnn as NEW ADODB.Connection
Dim rs As NEW ADODB.Recordset
set cnn = NEW ADODB.Connnection
cnn.Connection String = _
   略
   略
cnn.Open
set rs.Open Source = 略

といった感じでやったらできました。

質問なのですが今度はデータベースから取り込むのではなく、
Excelのシートの内容をデータベースに書き込むにはどうしたらいいですか?

150:デフォルトの名無しさん
08/03/27 22:34:35
>>149
まあこの辺見るとかググるとかして頑張ってください
URLリンク(www.asahi-net.or.jp)

151:デフォルトの名無しさん
08/03/27 23:00:59
指定フォルダ内の複数ファイルに対して
文字列の置換処理をしたいのですが
どのように書けばいいのでしょうか?

152:デフォルトの名無しさん
08/03/27 23:07:35
ファイル開く→置換

153:デフォルトの名無しさん
08/03/27 23:11:07
>>150さん
このサイトは見たことがありますが参考になりませんでした。

154:デフォルトの名無しさん
08/03/28 00:43:16
>>153
そこに書いてあることが理解できない段階なら、
まじめにVBAの本を買って、勉強したほうがいいんじゃないかなと思う。

155:デフォルトの名無しさん
08/03/28 02:24:22
>>153
DAOで、試験的にやってみました。
あらかじめ、TEST.mdbの中に「受注」テーブルがある場合です。
ワークシート「受注」の4行目から9行目までを新規レコードに追加します。

Sub Data_Export()
Dim WS As Worksheet, r As Long
Dim db As Database, rs As DAO.Recordset

Set WS = Worksheets("受注")
Set db = OpenDatabase(ThisWorkbook.Path & "\TEST.mdb")
Set rs = db.OpenRecordset(Name:="受注", Type:=dbOpenDynaset)

For r = 4 To 9
With rs
.AddNew
.Fields("日付").Value = WS.Cells(r, 2).Value
.Fields("顧客名").Value = WS.Cells(r, 3).Value
.Fields("注文番号").Value = WS.Cells(r, 4).Value
.Fields("品名").Value = WS.Cells(r, 5).Value
.Fields("単価").Value = WS.Cells(r, 6).Value
.Fields("数量").Value = WS.Cells(r, 7).Value
.Update
End With
Next r

db.Close

End Sub

参考になればよいですが。

156:155
08/03/28 04:48:08
ちょっと修正

Next r の次から
---------------------------
rs.Close: Set rs = Nothing
db.Close: Set db = Nothing

End Sub
---------------------------

157:145
08/03/28 10:03:57
>>146

ありがとうございます。
個人用マクロ調べてみました。
これだと下記にファイルを置かれてしまうようなのですが、
管理するマクロファイルは任意の場所に置いて管理したいです。

C:\Program Files\Microsoft Office\Office\XLStart

何か方法はありますでしょうか。

158:デフォルトの名無しさん
08/03/28 18:33:56
>>157
俺は
ツールバーにマクロのコマンド作る

159:135
08/03/28 23:15:33
135なのですが・・・結局できないわけですか・・・。

160:デフォルトの名無しさん
08/03/29 00:13:38
余裕でできる

161:デフォルトの名無しさん
08/03/29 00:25:20
>>135
何で困ってるのかさっぱりわからん。

162:デフォルトの名無しさん
08/03/29 01:48:52
application.assistant.doalert
or 余裕
application.executeexcel4macro "alert(...)"
or さらに余裕
application.executeexcel4macro "call(""user32"",""messagebox"",..."
or さらにさらに余裕
...

163:デフォルトの名無しさん
08/03/29 12:35:12
>>135
もっと何をしたいのか具体例を挙げてくれないと
出来るとしか答えられん。

164:デフォルトの名無しさん
08/03/29 15:01:22
>>163>>162

165:デフォルトの名無しさん
08/03/29 15:23:42
>>161 >>163
>>140

まあ一応>>162で答え出てんじゃね

166:デフォルトの名無しさん
08/03/30 19:16:39
OS WindowsXP
Excel 97
で、
a1.a2.a3.….an を
an,a1.….a(n-1) と並べ替えるにはどうしたらいいんでしょうか。
a1〜anは英数字、カタカナ、漢字です。
よろしくお願いします

167:デフォルトの名無しさん
08/03/30 20:05:33
>>166
an

168:デフォルトの名無しさん
08/03/30 20:06:16
みすったorz
anをa1のセルに移動(insert)するだけでいいんじゃないのか?
ってかXPでなんで97なんだ?

169:デフォルトの名無しさん
08/03/30 20:06:21
エスパーさん、出番ですよ

170:デフォルトの名無しさん
08/03/30 20:12:14
vbaじゃなくて並び替えですることだろ

171:デフォルトの名無しさん
08/03/30 20:24:37
手早いレスありがとうございます。
>>168
一つのセルの中に「.」で区切られた状態で入っているので・・
97なのはwin95のPCで読めるようにしてたのかと。。

>>170
どのようにすればいいんでしょうか

172:デフォルトの名無しさん
08/03/30 20:26:48
>>171
それは本当にVBAでやらなきゃならんことなのか?
後ろから「,」を検索してその位置以降の文字列を前に持ってくるだけだろ?
Excelの関数で事足りると思うのだが?

173:デフォルトの名無しさん
08/03/30 20:29:22
>>172
並び替え以前は全て「.」で区切られているので・・
またデータが大量にあるためマクロで処理したいです。

174:デフォルトの名無しさん
08/03/30 23:35:03
>>173
1.関数で別シートに写像
2.シート全体を選択してコピー→値の貼り付け

175:デフォルトの名無しさん
08/03/30 23:36:48
>>166

あ.い.う.え.お
と並んでいるものを、
お.あ.い.う.え
と並べたいのか?


お.え.う.い.あ
と並べたいと言う意図だとan,a1.….a(n-1) はおかしいし・・・
意味が分からん。

176:デフォルトの名無しさん
08/03/30 23:44:36
たくさんのcell内のデータを並びかえるのだから
自前でsort関数つくるのがいいだろ

177:デフォルトの名無しさん
08/03/30 23:46:51
>>175
俺も意味が判らんかったが、そういう意味で解釈すると、こうかな?

Function test()
Dim LastStr As String
Dim maxy As Long
maxy = 5

LastStr = Range("A" & maxy)
For i = maxy To 2 Step -1
Range("A" & i) = Range("A" & i - 1)

Next
Range("A1") = LastStr

End Function


178:デフォルトの名無しさん
08/03/30 23:48:43
>>177
並べ替えたいものは「1つのフィールドに入っている」んじゃないか?

179:デフォルトの名無しさん
08/03/31 00:01:58
>>178
そういう意味?
ならこれでどうだ?

Function test()
Dim baseText As String
Dim KekkaText As String
Dim varStr() As Variant
Dim i1 As Long, i2 As Long
Dim maxy As Long
'
baseText = "あいうえお.aiueo.アイウエオ.アイうえオ.aiウエお"
i2 = 0
'
ReDim Preserve varStr(i2) As Variant
For i1 = 1 To Len(baseText)
If Mid(baseText, i1, 1) = "." Then
i2 = i2 + 1
ReDim Preserve varStr(i2) As Variant
Else
varStr(i2) = varStr(i2) & Mid(baseText, i1, 1)
End If

Next
'
KekkaText = varStr(UBound(varStr))
For i1 = 0 To (UBound(varStr) - 1)
KekkaText = KekkaText & "." & varStr(i1)
Next
'
MsgBox (KekkaText)
End Function

180:デフォルトの名無しさん
08/03/31 00:21:21
いいんじゃね?
あとは自作関数化すれば何セルあっても動作するするだろ
それくらいは自分でなんとかすればよし、というところか。

181:166
08/03/31 00:39:56
>>174
どうもです
>>175
あ.い.う.え.お
と並んでいるものを、
お,あ.い.う.え
です。 「お」の後がコンマになってます。
>>177-180
ありがとうございます。
おきてからやってみます


182:179
08/03/31 00:48:02
>>181
おの後ろはカンマにしたかったのか。
それは実装できてないわ。
まぁ、ドットで区切って、並び替えて、再結合は実現しているので、
あとは別に苦労しないだろ。

183:デフォルトの名無しさん
08/03/31 01:54:26
Sub foo(r As Range)
Dim cell As Range
Dim pos As Long
Dim buf1 As String, buf2 As String
For Each cell In r
pos = InStrRev(cell.Value, ".")
If pos > 0 Then
buf1 = Right$(cell.Value, Len(cell.Value) - pos)
buf2 = Left$(cell.Value, Len(cell.Value) - Len(buf1) - 1)
cell.Value = buf1 & "," & buf2
End If
Next
End Sub

Sub bar()
foo Range("A1:A10")
End Sub


184:デフォルトの名無しさん
08/03/31 02:09:14
行頭から半角5文字目の空白を;に変えたい

185:デフォルトの名無しさん
08/03/31 08:11:53
>>183


>>166 [Excel97]
×InStrRev

186:デフォルトの名無しさん
08/03/31 10:21:31
>>179
なんだその吐き気がするコードは。
Excel97にはSplitすらないのか?
仮に無いとしても、>>172で十分だろ。

187:デフォルトの名無しさん
08/03/31 10:23:08
いちいち"."で分割して結合する意味がわからん

188:デフォルトの名無しさん
08/03/31 11:14:25
>>186
97にはsplitもなければInstrRevもない。

189:デフォルトの名無しさん
08/03/31 11:22:56
Replaceもなかったりする

190:デフォルトの名無しさん
08/03/31 11:24:40
>>188
>>187

191:デフォルトの名無しさん
08/03/31 11:27:35
意味なんてものはその職場の風習によるだろ。

192:デフォルトの名無しさん
08/03/31 11:29:51
>>191
意味わからん

193:デフォルトの名無しさん
08/03/31 11:32:30
あー、糞コードを量産する職場だったら、>>179を見ても違和感がないという意味か


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

4311日前に更新/248 KB
担当:undef