みなさま、お世話になります。またよろしくお願いいたします。
MSFlexGridでデータを貼り付けるために、以下のような
コードを書いています。
このとき、エクセルからコピーし貼り付ける場合はうまくいくのですが
MSFlexGridのデータをコピーし、貼り付ける場合は、
1行分少なくなってしまいます。
また、MSFlexGridから1セルだけコピーする場合は、
貼り付ける場所より、一つ上のセルに入ってしまいます。
エクセルからのコピーではうまくいきます。
どう対処したらいいでしょうか。
よろしくご指導お願いいたします。
Private Sub Edit_Copy_Click()
'コピー
Dim TempText As String
TempText = MSFlexGrid1.Clip
Clipboard.Clear
Clipboard.SetText TempText
End Sub
Private Sub Edit_Paste_Click()
'貼り付け
Dim TempText As String
Dim IRow As Integer
Dim ICol As Integer
IRow = 0
ICol = 0
TempText = Clipboard.GetText
'データの行数、列数を得る
Search TempText, IRow, ICol
'IColは実際の列数よりも、1小さい
With MSFlexGrid1
If .Row + IRow <= .Rows And .Col + ICol < .Cols Then
.RowSel = .Row + IRow - 1
.ColSel = .Col + ICol
.Clip = TempText
Else
MsgBox "貼り付け先が範囲外です", vbOKOnly, "警告"
End If
End With
End Sub
Private Sub Search(ByVal Temp As String, r As Integer, C As Integer)
'データの行数、列数を得る
Dim TmpString As String
'1行分の文字列を得るChr(13)=リターン
TmpString = Left(Temp, InStr(Temp, Chr(13)))
'列数を得る
'Chr(9)=タブ
Do Until InStr(TmpString, Chr(9)) = 0
C = C + 1
TmpString = Mid(TmpString, InStr(TmpString, Chr(9)) + 1)
Loop
'行数を得る
Do Until InStr(Temp, Chr(13)) = 0
r = r + 1
Temp = Mid(Temp, InStr(Temp, Chr(13)) + 1)
Loop
End Sub
TempTextの内容を調べれば分かるんじゃないですか?
編集 削除なんとか、自分で解決出来ました。
要するに、MSFlexGridからMSFlexGridへの
コピー時に、動作が変なので、以下のようにしてあります。
MSFlexGridからエクセルへのコピーは、今までのコードで正常に行っています。
その他、若干コードは分かりやすくいたしました。
ご参考にしてください。
Dim GridTemp As String
Private Sub Edit_Copy_Click()
'コピー
Dim TempText As String
TempText = MSFlexGrid1.Clip
Clipboard.Clear
Clipboard.SetText TempText
'MSFlexGridからコピーの場合、一時保存
GridTemp = TempText
End Sub
Private Sub Edit_Paste_Click()
'貼り付け
Dim TempText As String
Dim IRow As Integer
Dim ICol As Integer
IRow = 1
ICol = 1
TempText = Clipboard.GetText
'データの行数、列数を得る
Search TempText, IRow, ICol
'範囲を指定し、貼り付け
With MSFlexGrid1
If .Row + IRow <= .Rows And .Col + ICol <= .Cols Then
.RowSel = .Row + IRow - 1
.ColSel = .Col + ICol - 1
.Clip = TempText
Else
MsgBox "貼り付け先が範囲外です", vbOKOnly, "警告"
End If
End With
End Sub
Private Sub Search(ByVal Temp As String, r As Integer, C As Integer)
'データの行数、列数を得る
Dim TmpString As String
Dim MyTemp As String
'貼り付けデータの一時保存
MyTemp = Temp
'1行分の文字列を得る Chr(13)=リターン
TmpString = Left(Temp, InStr(Temp, Chr(13)))
'列数を得る Chr(9)=タブ
Do Until InStr(TmpString, Chr(9)) = 0
TmpString = Mid(TmpString, InStr(TmpString, Chr(9)) + 1)
C = C + 1
Loop
'行数を得る
Do Until InStr(Temp, Chr(13)) = 0
Temp = Mid(Temp, InStr(Temp, Chr(13)) + 1)
r = r + 1
Loop
r = r - 1
'MSFlexGridからのコピーの場合
If MyTemp = GridTemp Then
r = r + 1
If r = 1 Then
'列数を得る
Do Until InStr(MyTemp, Chr(9)) = 0
MyTemp = Mid(MyTemp, InStr(MyTemp, Chr(9)) + 1)
C = C + 1
Loop
End If
End If
End Sub