前回、質問しましたが、回答いただいたプログラムで、別のシートから複数のシートのテキストボックスの移動を移動させたいのですが・・・

たとえば、Sheet1・Sheet2・Sheet3にテキストボックス1が配置してあって、A位置とB位置に動くようにしてあります。
前回のプログラムでは、各シートに位置を指定するボタンが配置してありましたが、このボタンをSheet5に配置して、Sheet1・Sheet2・Sheet3の各テキストボックス1が一斉に動くようにしたいのですがよろしくお願いします。



前回のURL → http://oshiete1.goo.ne.jp/kotaeru.php3?q=85846

A 回答 (4件)

各シートのセル(範囲名がiLft1、iLft2やiLft3)に同じ数値が入っているでしょうか。

初期位置を表していて自分で入力しておく必要があります。(iTop1等も同じです)

これ位しか思いつきませんね・・・・
    • good
    • 0
この回答へのお礼

OKです。ありがとうございました。うまくいきました。
ところで、nishi6さん! テキストボックスに値を入れる(3)を質問させてもらったrurucomですが、質問1)2)3)はしばらくお待ちください!はどうなりましたでしょうか?催促してすみません!そちらの方もよろしくお願いします。

お礼日時:2001/06/10 11:28

書いてみました。

ユーザーフォームを使えば、また違ったものになるでしょう。今のままでは作りがダブっていますね。

シート1~3に
spnLeft: 左右用スピンボタン、spnTop: 上下用スピンボタン
cmdInitialize:初期化用ボタンを配置(同名)
左右初期値用セル(iLftj)、左右増分用セル(dLftj)
上下初期値用セル(iTopj)、上下増分用セル(dTopj)の名前を付ける。
()は範囲名で<j>はシート番号と同じにする。
図形は1ピクセル単位で動きます。そのまま保存すれば状況は記憶されています。

下をシート1~3の各シートモジュールに貼り付ける
dLft1やdTop1の<1>はシートにあわせて<2>、<3>に変える。
Private Sub spnLeft_SpinDown() '左右方向の微調整(マイナス)
Range("dLft1") = Range("dLft1") - 0.75: move_Lft Range("dLft1")
End Sub

Private Sub spnLeft_SpinUp() '左右方向の微調整(プラス)
Range("dLft1") = Range("dLft1") + 0.75: move_Lft Range("dLft1")
End Sub

Private Sub spnTop_SpinDown() '上下方向の微調整(マイナス)
Range("dTop1") = Range("dTop1") + 0.75: move_Top Range("dTop1")
End Sub

Private Sub spnTop_SpinUp() '上下方向の微調整(プラス)
Range("dTop1") = Range("dTop1") - 0.75: move_Top Range("dTop1")
End Sub

Private Sub cmdInitialize_Click() '初期化
Range("dLft1") = 0: move_Lft Range("dLft1")
Range("dTop1") = 0: move_Top Range("dTop1")
End Sub

標準モジュールに貼り付ける
Public Sub move_Lft(dLft) '左右方向の微調整
Dim st As Integer 'シートカウンタ
For st = 1 To 3
With Worksheets("Sheet" & st)
.Range("dLft" & st) = dLft
.Shapes("myText1").Left = .Range("iLft" & st) + .Range("dLft" & st)
End With
Next
End Sub

Public Sub move_Top(dTop) '上下方向の微調整
Dim st As Integer 'シートカウンタ
For st = 1 To 3
With Worksheets("Sheet" & st)
.Range("dTop" & st) = dTop
.Shapes("myText1").Top = .Range("iTop" & st) + .Range("dTop" & st)
End With
Next
End Sub

これ以上は短くならなかった。

この回答への補足

nishi6さん動きましたよー すごいですねー! あとひとつ質問させてください。微調整のボタンを押したとき、テキストボックスが一番左に行ってしまうのですがどうしてでしょうか?
よろしくお願いします。

補足日時:2001/06/09 22:36
    • good
    • 0

少し手を入れました。



標準モジュールに貼り付けます。
'TextBoxにはSheet1,2,3に対応して、
'myText1,myText2,myText3の名前を付けています
'四角形を動かす(例:四角形は各シートに1個) 引数に位置を示す値をセット
Public Sub ShapeMove3(Ichi As Integer)
Dim ShpTop(2) As Double '動かす各位置、表示位置
Dim ShpLeft(2) As Double '動かす各位置、表示位置
ShpTop(1) = 71.25: ShpLeft(1) = 90.75 '***縦・横位置の登録***
ShpTop(2) = 98.25: ShpLeft(2) = 276
Dim ws As Integer 'シート

Application.ScreenUpdating = False
'各シートで動かす
For ws = 1 To 3
Worksheets("Sheet" & ws).Activate
With ActiveSheet.Shapes("myText" & ws)
'次の場所にする
.Top = ShpTop(Ichi)
.Left = ShpLeft(Ichi)
End With
Next
Worksheets("Sheet5").Activate
Application.ScreenUpdating = True
End Sub

下記はシート5のシートモジュールに貼り付けます。
Private Sub CommandButton2_Click() 'A位置へ
ShapeMove3 1
End Sub

Private Sub CommandButton3_Click() 'B位置へ
ShapeMove3 2
End Sub

この回答への補足

nishi6さ~ん!完璧OKです!ありがとうございます。

それと、またまた贅沢なんですが・・・

Sheet1~Sheet3に、スピンボックスを2個配置(上下用、左右用)してテキストボックスの位置をスピンボックスをクリックする事で、微調整させたいのですが、出来ますか?
移動は、±0.1ずつ上下左右に動くようにして、その移動値をセルかコントロールボックスかに表示させるようにしたい。

この微調整は、Sheet1~3のどこのSheetでしても、全部のシートに反映するようにさせたい。

更に、リセットボタン(別に配置)を押したら最初の位置に戻る。
更に、ファイルを閉じるときは、微調整量を覚えていて、次に開いたときには、調整後の状態で開く。

と 言う内容ですが、できますか?
もし、ややこしいようでなければ宜しくお願いします。

補足日時:2001/06/08 22:48
    • good
    • 0

前回VBAを少し変えました。

2箇所のTextBoxの位置は各シートで同一としています。
各TextBoxにはSheet1,2,3に対応してmyText1,myText2,myText3の名前を付けています。
標準モジュールに貼り付けます。

'四角形を動かす(例:四角形は各シートに1個)
Public Sub ShapeMove2()
Const ShpNum = 2 '四角形の個数
Dim ShpTop(2), myShpTop As Double '動かす各位置、表示位置
Dim ShpLeft(2), myShpLeft As Double '動かす各位置、表示位置
ShpTop(1) = 71.25: ShpLeft(1) = 90.75 '***縦・横位置の登録***
ShpTop(2) = 98.25: ShpLeft(2) = 276
Dim ct As Integer 'カウンタ
Dim myShpIdx As Integer '四角形の順序
Dim ws As Integer 'シート

Application.ScreenUpdating = False
'シート1を代表にして今ある位置を調べる
Worksheets("Sheet1").Activate
With ActiveSheet.Shapes("myText1")
myShpTop = .Top '今あった位置
myShpLeft = .Left '今あった位置
myShpIdx = 0
For ct = 1 To ShpNum
If myShpTop = ShpTop(ct) And myShpLeft = ShpLeft(ct) Then
myShpIdx = ct '何番目か探す
End If
Next
'次の場所はどっち?
myShpIdx = myShpIdx + 1
If myShpIdx > ShpNum Then
myShpIdx = 1
End If
End With
'各シートで動かす
For ws = 1 To 3
Worksheets("Sheet" & ws).Activate
With ActiveSheet.Shapes("myText" & ws)
'次の場所にする
.Top = ShpTop(myShpIdx)
.Left = ShpLeft(myShpIdx)
End With
Next
Worksheets("Sheet5").Activate
Application.ScreenUpdating = True
End Sub

シート5のシートモジュールに貼り付けます。
Private Sub CommandButton1_Click()
ShapeMove2
End Sub

もう寝よう・・・

この回答への補足

nishi6さん、ありがとうございます。うまくうごきました。

しかし、Aの位置にする為のボタンと、Bの位置にする為のボタンがほしいのですが、宜しくお願いします。
(ボタン名は、位置を表現する物にしてテキストボックスのあるシートを見なくても分かるようにする為)

私も試してみました・・・
現在の位置を調べて、その値を代入させて、文字表示させようとしたのですが、これでは、テキストボックスを微調整したときが、まずいのでやめました。
やはり、位置を指定するボタンが2つあったほうが良さそうなので、宜しくお願いします。

補足日時:2001/06/08 19:57
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Qアクセス レポート テキストボックスの文字配置は文字数で自動的に文字配置の変更可能ですか

現在アクセスに入力されているテーブルのデーターをもとに書道展のキャプションを作成中です
タイトルと作家の名前を表示させますがタイトルが1文字数から13文字数くらいまでと様々なため
テキストボックスの文字配置が均等割り付けだと文字数の多いタイトルは2段目が間延びしておかしいです
例えば8文字までだと均等割り付けそれ以上だと左揃えなどということが可能でしょうか?
他に良い方法があれば教えてくださいよろしくお願いします
Wordの差し込み文章のように一枚ごとの編集が出来ればいうことなしなのですが?それはあり得ませんか?

Aベストアンサー

> イベントプロシージャには文字数が多くなれば自動で2行にになり字も小さくなるための式がかかれています

こちらでしょうか?

テキストボックス内の文字を自動で縮小して全体を表示
http://hatenachips.blog34.fc2.com/blog-entry-11.html

上記の例なら

Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)
  AutoFontSize Me.テキストボックス名, 12
  If Len(Me.テキストボックス名) <= 8 Then
    Me.テキストボックス名.TextAlign = 4 '均等割り付け
  Else
    Me.テキストボックス名.TextAlign = 1 '左揃え
  End If
End Sub

のようになります。


> ユーザー定義関数名、「イベントプロシージャ」以外の式が指定されていますとなりました。

加えた変更を元に戻してもエラーになりますか?

とりあえず、コンパイルしてエラーが無いことを確認してください。

経験上、Access のバージョンにもよりますが、
デザインビュー以外で表示しているときに VBA の修正をしたりすると
このエラーが出ることが多いような気がしています。

> イベントプロシージャには文字数が多くなれば自動で2行にになり字も小さくなるための式がかかれています

こちらでしょうか?

テキストボックス内の文字を自動で縮小して全体を表示
http://hatenachips.blog34.fc2.com/blog-entry-11.html

上記の例なら

Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)
  AutoFontSize Me.テキストボックス名, 12
  If Len(Me.テキストボックス名) <= 8 Then
    Me.テキストボックス名.TextAlign = 4 '均等割り付け
  Else
    Me.テ...続きを読む

Qテキストボックスに入力したシートへ移動する

テキストボックスに入力したのと同じ名前のシートに移動することは出来ますか?
出来るならテキストボックスのオブジェクト名をsheetnameとして、
マクロコードを教えて下さい。

Aベストアンサー

Sheets(sheetname.Text).Select

Qチェックボックスの配置順にテキストボックスに表示

accessのフォームにチェックボックスを配置し
チェックされたものをテキストボックスに表示させています。

■A ■B □C □D ■E

となっていたら、テキストボックスに

A B E

と表示させています。

チェックボックスの真ん中に新しくチェックボックスを追加すると
テキストボックス内には、追加したものが最後に表示されていまいます。

■A ■B □C ■Z □D ■E

とすると、テキストボックスには

A B Z E
と表示させたいのに
A B E Z
表示されてしまいます。

いちから順番どおりに作り直せばいいのですが
かなりたくさんチェックボックスがあるうえに
上司から、この先も何度も作り直しを指示されそうです・・・。

できれば簡単に、配置した順にテキストボックスに表示されるようにしたいです。

チェックボックスの配置順に
テキストボックスに文字を表示させる方法を教えてください!

Aベストアンサー

VBA は、なんとか大丈夫になったでしょうか

VBA での記述になります。
状況が不明なところもありますが、変更しやすい(?)方法での記述にしてみます。
説明は後にして、以下をフォームに記述しておきます。

Private Function MojiGet() As String
  Dim ctl As Control
  Dim sS As String

  With New ADODB.Recordset
    .Fields.Append "名", adVarChar, 255
    .Fields.Append "値", adBoolean
    .Fields.Append "左", adInteger
    .Fields.Append "順", adInteger
    .CursorLocation = adUseClient
    .Open

    For Each ctl In Me.Controls
      Select Case ctl.ControlType
        Case acCheckBox
          sS = ctl.Name
          If (ctl.Controls.Count > 0) Then
            sS = ctl.Controls(0).Caption
          End If
          .AddNew
          .Fields("名") = sS
          .Fields("値") = ctl.Value
          .Fields("左") = ctl.Left
          .Fields("順") = ctl.TabIndex
          .Update
      End Select
    Next

    .Filter = "値 = True"
    .Sort = "左"

    sS = ""
    While (Not .EOF)
      sS = sS & " " & .Fields("名")
      .MoveNext
    Wend
    .Close

    MojiGet = Mid(sS, 2)
  End With
End Function

チェックボックスの状態を順次チェックしていくわけですが、
後での並べ替え( Sort )が楽なように ADO のレコードセットを使っておきます。

> A B Z E
> と表示させたいのに
> A B E Z
> 表示されてしまいます。

これは、おそらく
    For Each ctl In Me.Controls
      Select Case ctl.ControlType

とした場合の、出現順(作った順)で処理されているのだと思います。
上記の記述では、チェックボックスなら
・名前を覚える(チェックボックスにラベルがくっついていたらラベルの標題)
・値を覚える
・左位置を覚える
・タブ移動順を覚える

で、この4つを全部覚えたら
・値 = True で絞込み( Filter )
・並び替えを、左位置昇順
この結果で、「名」を繋げていきます
Filter は使わずに、True の時のみレコードセットに追加・・・でも良いと思います。
並び順をタブ移動順に変更するのも容易です。

また、2段・3段になっていて、上の段から・・・とかなら
"上" フィールドを追加して、ctl.Top も覚えておいてから
Sort で "上, 左" とすれば順に得られれます。( "左, 上" とするとまた違った順に)
もちろん、横並びの Top 値や Left 値は同じにしておく必要はありますが・・・
でも、タブ移動順の方が使えるのかも?

ここで、関数名を MojiGet としたので、テキストボックスに設定する時には
Me.テキストボックス = MojiGet
で、できると思います。

テキストボックスのコントロールソースに =MojiGet() としても表示できますが、
更新のタイミングがうまくとれないと思います。
( Me.Recalc 等で表示更新はされますが)
その時には、このチェックボックスが変更されたら・・・・
という意味で、引数に与えるようにします。( Access さんに教えてあげます)
関数側では、引数は必要としていないので、ダミー的な受けにしておきます。

Private Function MojiGet2(ParamArray vDmy()) As String
  MojiGet2 = MojiGet
End Function

テキストボックスのコントロールソースには、
チェックボックス「A」「B」「C」に変更あったら表示を更新したい場合
 =MojiGet2([A],[B],[C])
とでも記述しておきます。

なお、フォーム上に上記とは別の用途のチェックボックスがあるのであれば、
チェックボックスのプロパティにある「タグ」に識別子を埋めておきます。
「タグ」に設定する文字列は何でもよいので、
例えば、対象外のチェックボックスには設定なし・・・だけとすると

    For Each ctl In Me.Controls
      Select Case ctl.ControlType
        Case acCheckBox
          If (Len(ctl.Tag) > 0) Then ' ★こんな感じの判別
            sS = ctl.Name


※ 冒頭に示した内容では、毎回順を得ていますが、
 順を求めるのは1回で良いので、Form_Load とかでやっておいて、
 以降は求まっていた順を使いながら、True/False を判別・・・・でも良いかも

 ただ、フォーム上では操作が絡むので、応答に満足できれば、このままでも・・・

※ 同じような事をするフォームが複数あるのであれば、
 関数部分を標準モジュールに移動させ、
 ・ Private → Public
 ・ Me.Controls → CodeContextObject.Controls
 の変更で動くかも(未検証)

※ ADO のレコードセットを使わなくても、「タグ」に順を設定するとか・・・
 でも、追加した後、その「タグ」修正を間違わない・・・注意が必要ですね
 上記では、追加したら「タグ」に何かを入れておけば・・・・楽かな?
 いろいろ方法はあると思います。


参考にする/しない等々、自己責任でお願いします。

VBA は、なんとか大丈夫になったでしょうか

VBA での記述になります。
状況が不明なところもありますが、変更しやすい(?)方法での記述にしてみます。
説明は後にして、以下をフォームに記述しておきます。

Private Function MojiGet() As String
  Dim ctl As Control
  Dim sS As String

  With New ADODB.Recordset
    .Fields.Append "名", adVarChar, 255
    .Fields.Append "値", adBoolean
    .Fields.Append "左", adInteger
    .Fields.Append "順", adInteger
    ....続きを読む

Qエクセルでテキストファイルからフォームのテキストボックスにテキスト挿入するマクロ

マクロでフォームのテキストボックスに直接テキストファイルからテキストを挿入したいのですが出来ますか?
opentextでエクセルシートに入れてからフォームにコピーすることはできたのですが、それだと重くなってしまうので直接取り込みたいんですがうまくいきません。
VBやJAVAのreadlineのようなものは使えないんでしょうか。

Aベストアンサー

>VBやJAVAのreadlineのようなものは使えないんでしょうか。

LineInput がありますよ。
http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_110_030.html
http://rd.search.goo.ne.jp/click?DEST=http%3A%2F%2Fofficetanaka.net%2Fexcel%2Fvba%2Fstatement%2FLineInput.htm&no=2

Q【Access】レポートでテキストボックスやラベル中の文字配置を下にしたい

レポートにおいて、テキストボックスやラベルのプロパディで
書式タブ中、「文字配置」というのがありますが、
そのなかに「下」というのがありません。

テキストボックスやラベルで
縦のスペースに対して文字数が少ないので、
すべてにおいて文字位置が「上」になっています。
これですと見た目もあまりよくなく、
文字位置を「下」にしたいのですが、
なにか方法はございますでしょうか?

よろしくお願いいたします。

Aベストアンサー

ラベルに関しては(Access2002の場合には)
1・デザインビューで上下の余白で調整
2・表題の部分で、Ctrl + Enter で改行させる
3・スペースでトコロテン式に送る

テキストボックスでは、ドンピシャの方法ではありませんが
1・の他に
2・印刷時拡張・印刷時縮小
3・例えば、下合わせにしたいフィールド名を[あるフィールド]とすると
テキストボックスの名前を「あるフィールド1」とします。
でコントロールソースに
=Space(255-Len([あるフィールド])) & [あるフィールド]
とすれば下合わせ(と言うよりも尻合わせ)になります。
255の数値はテーブルのデザインビューで設定したフィールドサイズにして下さい。
フィールドが数値型の場合は不可です。


人気Q&Aランキング

おすすめ情報